2016-07-28 72 views
2

我有兩列的文件。第一列是字符串,第二列是正數。如果第一個字段(字符串)在文件中沒有雙重字符(所以第一個字段對於文件是唯一的),我想將該唯一行復制到(比方說)result.txt。如果第一個字段在文件中有重複,那麼我想在這些重複的行中減去第二個字段(數字)。順便說一句,文件將有一個重複的最大值,不超過。我想將它保存在result.txt中。因此,輸出文件將包含第一個字段和第一個字段重複名稱的唯一值的所有行,第二個從這些重複值中減去值。文件沒有排序。下面是例子:重複行的子字段

輸入文件:

hello 7 
something 8  
hey 9  
hello 8  
something 12  
nathanforyou 23 

輸出文件,我需要(的Result.txt):

hello 1  
something 4  
hey 9  
nathanforyou 23 

我不能在結尾的文件負數,所以我有從較大的數中減去較小的數。到目前爲止,我嘗試了什麼?各種排序(我找出如何找到非重複的行,並把它們放在單獨的文件,但扼殺重複減法),在awk數組(我保存所有行在數組中,並做「for」子句...問題是我不知道如何從線性數組元素獲得第二個字段)等順便說一句,問題比我所描述的更復雜(我有四個領域,前兩個是相同的等等),但在最後 - 它涉及到這一點。

+2

這是一個很好的做法,將您提到的研究成果與問題一起發佈! – Inian

+0

提示:您可以使用HashMap或Dictionary(取決於您選擇的語言)。無論如何,你應該先嚐試一下,然後在這裏問你的問題。 – pms

+0

我只是注意到你的'順便說一句,問題比我描述的更復雜....'在你的問題結尾。不要這樣做。如果您確信自己可以按摩您自己的任何答案或編輯您的問題以顯示您的實際問題,請刪除該陳述。不要發佈一個不代表您真實數據的例子,然後等到您得到回答後提出「我該如何改變以處理我的真實問題?」因爲這非常煩人。 –

回答

1
$ cat tst.awk 
{ val[$1,++cnt[$1]] = $2 } 
END { 
    for (name in cnt) { 
     if (cnt[name] == 1) { 
      print name, val[name,1] 
     } 
     else { 
      val1 = val[name,1] 
      val2 = val[name,2] 
      print name, (val1 > val2 ? val1 - val2 : val2 - val1) 
     } 
    } 
} 

$ awk -f tst.awk file 
hey 9 
hello 1 
nathanforyou 23 
something 4 
+1

爲了讓它變得簡單!+1,嘗試了一個自己'awk'{a [$ 1] - = $ 2} END {for(i in a)print i,(a [i] <0?-a [i] :a [i])}'file',對於第一次計算,它會減去'0 - ',這會導致結果! – Inian

+1

是的,你需要從'a [$ 1] =($ a 1 [$ 1] - $ 2:$ 2)'開始。 –

+1

真的很感謝你的建議! :) – Inian