从重复的行中划分字段

时间:2016-07-28 17:58:59

标签: bash awk sed

我有两列文件。第一列是字符串,第二列是正数。如果第一个字段(字符串)在文件中没有双重(因此,第一个字段对于文件是唯一的),我想将该唯一行复制到(让我们说)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中的数组(我保存了数组中的所有行,并且"用于"条款...问题是我不知道如何从数组元素中得到第二个字段(行)等。顺便说一句,问题比我描述的更复杂(我有四个字段,前两个是相同的等等),但最后 - 它就是这个。

1 个答案:

答案 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