2013-04-04 153 views
1

我正在嘗試處理FE代碼中的數據文件以刪除未收斂計算生成的答案。我的文件基本上是兩列數字。我已經發現從另一詢問器在計算器的有用AWK溶液(Explain this duplicate line removing, order retaining, one-line awk command修改重複行刪除,訂單保留,單行awk命令

awk '!x[$1]++' file > outFile 

這僅打印其中重複

然而柱a的值在我的數據文件的一組行中的第一行在兩列的正確的值將是哪一個是重複例如列的最後一行:

用於文件與數據:

a b 
a c 
a d 
b a 
c d 
e f 

awk '!x[$1]++' file > outFile產生

a b 
b a 
c d 
e f 

,但我需要生成

a d 
b a 
c d 
e f 

是否有可能通過修改一個像awk來做到這一點?

編輯由愛德·莫頓(對不起,我不能把這個註釋由於格式):

鑑於海報評論說,「在的科拉姆值的可重複的每個節點,但只有我希望當他們相鄰「我認爲他的真實樣品的輸入和輸出預計會是這樣的刪除重複:

輸入:

a b 
a c 
a d 
b a 
c d 
a x 
a y 
e f 

輸出:

a d 
b a 
c d 
a y 
e f 

對於OP - 如果我錯了,刪除上面的。

編輯:

對不起,我正在努力簡化我的問題但顯然沒有這樣做充分。我不希望發佈完整的文件,因爲這些文件是幾MB的TXT。每個文件都包含由節點結果輸出的數據(至少幾百個節點)。具有報頭部分中的每個節點數據開始:

      S:Min Principal (
         Avg: 75p) PI: BLA 
         DE_MERGE-1 N: 143 
       X     6   

在每次報頭部分是一個兩列的列表。第一列是時間點,第二個計算值在該時間點和節點。但是,當計算不收斂時,可能會有給定時間戳的重複條目。每次的最後一項將是正確的(收斂的)結果。時間可能(但可能不)在節點之間重複,並且每個節點應該保留每行一行。

以下是文件中一個節點的輸出示例。該文件只有幾次重複,並且可以手動編輯。在其他節點上,大部分時間可能會出現10-15次 - 重複次數變化 - 預期的時間點數也會變化。

  0.     0.   
      2.E-03   -4.43054  
      4.5E-03   -4.43195  
      10.125E-03   -4.43515  
      22.7813E-03  -4.44235  
      51.2578E-03  -4.45856  
      115.33E-03   -4.49509  
      259.493E-03   -4.57752  
      583.859E-03   -4.76425  
      1.31368   -5.19031  
      2.95578   -6.24656  
      6.65051   -8.77117  
      14.9637   -11.385  
      32.4455   -11.385  
      52.4455   -11.385  
      72.4455   -11.385  
      92.4455   -11.385  
      100.    -11.385  
      100.    -11.385  
      102.    -11.385  
      105.75    -11.385  
      114.188   -11.385  
      133.172   -11.385  
      175.887   -11.385  
      271.995   -11.6325  
      458.493   -27.0386  
      600.    -32.1938  
      600.    -32.1938  
      600.2    -32.1939  
      600.575   -32.1943  
      601.419   -32.1938  
      603.317   -32.192  
      607.589   -32.1879  
      617.2    -32.1759  
      638.824   -31.9507  
      687.479   -31.311  
      796.952   -29.3312  
      1.04327E+03  -27.8592  
      1.59748E+03  -25.3054  
      2.84445E+03  -21.0816  
      4.84445E+03  -20.8229  
      6.84445E+03  -20.8229  
      8.84445E+03  -20.8229  
      10.8444E+03  -20.8229  
      12.6E+03   -20.8229  
      12.6E+03   -20.8229  
      12.6002E+03  -20.8229  
      12.6006E+03  -20.8229  
      12.6014E+03  -20.8229  
      12.6033E+03  -20.8229  
      12.6076E+03  -20.8229  
      12.6172E+03  -20.8229  
      12.6388E+03  -20.8229  
      12.6875E+03  -19.8705  
      12.797E+03  -19.8283  
      12.9955E+03  -20.3811  
      13.1955E+03  -20.6489  
      13.3955E+03  -23.6448  
      13.5955E+03  -23.9506  
      13.7955E+03  -27.1146  
      13.9955E+03  -28.8359  
      14.1955E+03  -24.484  
      14.3955E+03  -11.7371  
      14.42E+03   -11.4293 
+0

是你的文件分類?通過col1 – Kent 2013-04-04 16:11:21

+0

我的文件已排序的批次 - 即我可能已排序的許多節點的輸出列表,列中的值可能會重複每個節點,但我只希望刪除重複時,他們是相鄰的 – user2245653 2013-04-04 16:49:50

+1

你應該做一個更好的例子你的問題,以便SO專家能夠理解你真正想要的東西。你目前的問題和例子是誤導人。 – Kent 2013-04-04 17:41:14

回答

2
awk 'NR>1 && $1!=p{print s} {p=$1;s=$0} END{print s}' file 
a d 
b a 
c d 
a y 
e f 
+0

謝謝埃德,這個工程。我害怕,愚蠢地,我試圖回答評論,並在檢查建議的回覆之前編輯問題。 – user2245653 2013-04-08 11:01:43

+0

如果您有一個滿意的答案,請點擊旁邊的複選標記,以便人們不會浪費時間試圖提出替代方案。 – 2013-04-08 14:10:28

+0

再次感謝,對不起新手錯誤。 – user2245653 2013-04-08 16:07:51

1

這是那些情況下,你可以使用uniq不首先使用sort之一。如果第一個字段是固定寬度,你可以簡單地做:

uniq -w1 file 
a b 
b a 
c d 
a x 
e f 

如果它不是固定寬度使用舊rev招:

rev file | uniq -f1 | rev 
a b 
b a 
c d 
a x 
e f 

注意:使用EdMorton的代表輸入作爲file