【问题标题】:Awk Delete Rows based on Duplicate fields基于重复字段的 Awk 删除行
【发布时间】:2016-02-21 03:04:30
【问题描述】:

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

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 列的每种组合的记录的第一次出现。

    输出
    2 类 1 类
    狗 1 0 aa
    鼠标 0 0 aa
    猫 1 5
    狗 4 3
    . . .
    . . .
    . . .
    猫 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 的记录。

【问题讨论】:

  • 试试 sort + uniq + awk 的组合.....

标签: awk


【解决方案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

【讨论】:

  • 你让它变得非常简单!好东西! :)
猜你喜欢
  • 2020-02-12
  • 2017-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
  • 2018-07-15
  • 2019-01-31
  • 2022-01-24
相关资源
最近更新 更多