比较一个字段,如果另一个字段的值更大,则删除重复

时间:2014-12-29 23:55:45

标签: linux awk sed unique text-manipulation

尝试在linux命令行执行此操作。想要组合两个文件,比较基于ID的值,但只保留具有Date更新/更大值的ID(编辑:等于或大于)。因为ID 456604在两个文件中,只想使用较新的日期保留文件2中的那个:" 20111015 456604 tgf"

档案1

Date     ID     Note
20101009 456604 abc
20101009 444444 abc
20101009 555555 abc
20101009 666666 xyz

文件2

Date     ID     Note
20111015 111111 abc
20111015 222222 abc
20111015 333333 xyz
20111015 456604 tgf

然后输出将两个文件组合在一起,但只保留第二个ID值,并使用较新的日期。行的顺序无关紧要,只是概念输出的一个例子。

输出

Date     ID     Note
20101009 444444 abc
20101009 555555 abc
20101009 666666 xyz
20111015 111111 abc
20111015 222222 abc
20111015 333333 xyz
20111015 456604 tgf

3 个答案:

答案 0 :(得分:2)

$ cat file1.txt file2.txt | sort -ru | awk '!($2 in seen) { print; seen[$2] }'

Date     ID     Note
20111015 456604 tgf
20111015 333333 xyz
20111015 222222 abc
20111015 111111 abc
20101009 666666 xyz
20101009 555555 abc
20101009 444444 abc

按降序日期对合并文件进行排序,并在第一次看到ID时仅打印一行。

修改

更简洁的版本,感谢史蒂夫:

cat file1.txt file2.txt | sort -ru | awk '!seen[$2]++'

答案 1 :(得分:0)

如果日期也重复,或者即使此 存在,您也没有说明您希望如何处理此案例。因此,我认为,通过“更大”,你的意思是“更大或更等于”' (它还使得处理标题更容易一些)。如果情况并非如此,请edit提出您的问题。

代码:

awk 'FNR==NR {
    a[$2]=$1
    b[$2]=$0
    next
}

a[$2] >= $1 {
    print b[$2]
    delete b[$2]
    next
}

1

END {
    for (i in b) {
        print b[i]
    }
}' file2 file1

说明:

基本上,我们使用一个名为a的关联数组来存储' ID'和'日期'分别作为关键和价值。我们还使用另一个名为file2的关联数组将b的内容存储在内存中。读取file1后,我们会测试数组a中是否存在第二列,并且键的值大于或等于第一列。如果是,我们从数组b打印相应的行,然后从数组中删除它,并将next删除到输入的下一行/记录。它上面的1寂寞将返回true,从而在不满足前两个条件的情况下启用打印。这具有从file1打印任何不匹配记录的效果。最后,我们打印数组b中剩下的内容。

结果:

Date     ID     Note
20111015 456604 tgf
20101009 444444 abc
20101009 555555 abc
20101009 666666 xyz
20111015 222222 abc
20111015 111111 abc
20111015 333333 xyz

答案 2 :(得分:0)

另一种方式

awk 'NR==1;FNR>1{a[$2]=(a[$2]<$1&&b[$2]=$3)?$1:a[$2]}
     END{for(i in a)print a[i],i,b[i]}' file file2

将数组中的值与先前存储的值进行比较以确定哪个更高,如果当前记录更高,则还存储第三个字段。
然后打印出存储的日期,键(字段2)和为字段3存储的值。

或更短

awk 'NR==1;FNR>1{(a[$2]<$1&&b[$2]=$0)&&a[$2]=$1}END{for(i in b)print b[i]}' file file2