我试图消除基于一个单独字段的一组重复行。
cat file.txt

1    345   a    blue
1    345   b    blue
3    452   c    blue
3    342   d    green
3    342   e    green
1    345   f    green

我想删除基于字段1和2的重复行,但分别针对每种颜色。所需的输出:
1    345    a   blue
3    452    c   blue
3    342    d   green
1    345    f   green

我可以使用遍历颜色的for loop实现此输出:
for i in $(awk '{ print $4 }' file.txt | sort -u); do
   grep -w ${i} |
   awk '!x[$1,$2]++' >> output.txt
done

但这很慢。有没有办法在不使用循环的情况下获取此输出?

谢谢。

最佳答案

至少对于示例来说,它很简单:

$ awk 'arr[$1,$2,$4]++{next} 1' file
1    345   a    blue
3    452   c    blue
3    342   d    green
1    345   f    green

或者,您可以否定:
$ awk '!arr[$1,$2,$4]++' file

您也可以对GNU排序使用相同的排序,这可能会更快:
$ sort -k4,4 -k2,2 -k1,1 -u file

关于arrays - 使用awk数组根据单独的字段消除重复的列?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42322026/

10-09 05:29
查看更多