2013-03-05 197 views
1

我有一個包含大量文本文件(通常名爲rt ??????。MON)的目錄。每個文件都包含在格式從文件中刪除特定的行

#  HEADER INFO 
#  ... 
# 
# --- TIME SERIES --- 
#  TIME  Var1  Var 2  ... 
#  [s]  [kg]  [kg]  ... 
#   1  2  3  ... 
    0.0000E+00 1.0000E+00 1.0000E+00 ... 
    6.4619E+00 2.0000E+00 2.0000E+00 ... 
    6.4619E+00 2.5000E+00 2.5000E+00 ... 
    8.9690E+00 3.0000E+00 3.0000E+00 ... 
    ... 

我試圖寫一個bash腳本,將讀下來每個文件並刪除重複的時間線(這是由四捨五入造成的)結果。因此,對於上面的例子,輸出將是

#  HEADER INFO 
#  ... 
# 
# --- TIME SERIES --- 
#  TIME  Var1  Var 2  ... 
#  [s]  [kg]  [kg]  ... 
#   1  2  3  ... 
    0.0000E+00 1.0000E+00 1.0000E+00 ... 
    6.4619E+00 2.0000E+00 2.0000E+00 ... 
    8.9690E+00 3.0000E+00 3.0000E+00 ... 

位BASH新手位,所以任何指針將受到感謝!

+0

什麼是文件分隔符?標籤? – squiguy 2013-03-05 17:24:58

+0

文件空間不足。 – 2013-03-05 17:41:16

回答

1

嘗試這一個班輪:

awk '$1!~/^#/&&$1 in a{next;}{a[$1]}1' file 
+0

謝謝。這一個爲我工作。儘管我還沒有機會測試其他可能如此好的解決方案。我可以看到我將不得不花費一些時間來學習awk。 – 2013-03-10 18:16:42

1

如果相同的時間是相鄰的(即在下面的行中),那麼您只能使用uniquniq有參數來指定從哪裏開始與前一行比較,以及您必須檢查多少個字符(至少是GNU的一個字符)。在這種情況下,因爲它似乎,這些數字開始和結束在一個固定的字符,你可以寫類似:

uniq --skip-chars=2 --check-chars=10 infile > outfile 

outfile將舉行不同的線路,因爲這組字符。

作爲sudo_O註釋,此解決方案可能會干擾文件的標題部分。我通常比較喜歡僅僅使用這些數據來創建文件,然後添加標題,或者在使用grep或其他工具來獲取數據行之前過濾文件,然後添加標題部分。

+0

我幾乎喜歡這個答案..但是,OP沒有說明重複項是相鄰的,這可以刪除標題部分中的行,例如,OP從輸入中省略了行。 – 2013-03-05 18:00:34

+0

嗯......你對標題部分是正確的。這就是爲什麼它應該通過某種過濾(grep?)進行處理,並添加後者,以實現均勻性和易於處理。此外,由於數字指定的時間(按照OP問題),並且按照遞增順序,所以我認爲你可以假設它們是相鄰的。 – 2013-03-05 18:04:08

0

AWK是爲這個完美的:

$ awk '$1~/^[0-9].[0-9]{4}E[+-][0-9]{2}$/{if(!a[$1]++)print;next}1' file 
#  HEADER INFO 
#  ... 
# 
# --- TIME SERIES --- 
#  TIME  Var1  Var 2  ... 
#  [s]  [kg]  [kg]  ... 
#   1  2  3  ... 
    0.0000E+00 1.0000E+00 1.0000E+00 ... 
    6.4619E+00 2.0000E+00 2.0000E+00 ... 
    8.9690E+00 3.0000E+00 3.0000E+00 ... 
    ... 

使用這樣一個嚴格的正則表達式比較將確保只有你想將要刪除的重複和awk優點是重複的時間不會是相鄰的像uniq一樣。

0

另外一個你可以嘗試:

awk '/^#/ || !A[$1]++' file