Awk基于重复字段删除行

时间:2015-11-19 05:33:45

标签: awk

我的数据集看起来像这样:

Input 

Cat   2 1 aa
Dog   1 0 aa 
Dog   1 2 aa
Cat   2 7 aa
Mouse 0 0 aa
Cat   1 5 
Dog   4 3
.     . .
.     . .
.     . .
Cat   1 5 
Dog   4 3
Cat   6 9 bb
Dog   3 1 bb 
Dog   3 6 bb
Cat   6 4 bb
Mouse 0 0 bb

使用此数据集,我想执行以下操作:

  • 如果第4列为空白,请打印该行。
  • 如果第4列不为空白,则仅使用第1列和第4列的每个组合打印第一次出现的记录。

    输出
    Cat 2 1 aa
    狗1 0 aa
    鼠标0 0 aa
    Cat 1 5
    狗4 3 。 。 。
    。 。 。
    。 。 。
    Cat 1 5
    狗4 3 Cat 6 4 bb
    狗3 1 bb
    鼠标0 0 bb

请注意,这里:“Cat 2 1 aa”是第一列,第1列= cat,第4列= aa,因此打印出来。 “cat 1 5 aa”未打印,因为我们已经有第1列= cat和第4列= aa的记录。

1 个答案:

答案 0 :(得分:1)

使用

awk '$4 == "" || !a[$1,$4]++' input

结果:

Cat   2 1 aa
Dog   1 0 aa 
Mouse 0 0 aa
Cat   1 5 
Dog   4 3
.     . .
.     . .
.     . .
Cat   1 5 
Dog   4 3
Cat   6 9 bb
Dog   3 1 bb 
Mouse 0 0 bb