使用awk数组消除基于单独字段的重复列?

时间:2017-02-18 23:51:32

标签: arrays awk

我正在尝试根据单独的字段消除一组重复的行。

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

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

谢谢。

2 个答案:

答案 0 :(得分:4)

至少在这个例子中,它很简单:

$ 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

答案 1 :(得分:4)

你能不能试试这个:

awk '!a[$1,$2,$4]++'   Input_file