2016-07-28 91 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