【问题标题】:How to delete original and duplicate line when matching by column using awk?使用awk按列匹配时如何删除原始行和重复行?
【发布时间】:2013-01-18 23:36:21
【问题描述】:

我找到了我的问题的部分答案,但我不知道其余的。我正在使用awk。我可以使用以下命令删除原始行和重复行:

awk 'NR==FNR{a[$0]++;next} a[$0]<2' infile infile

但是,这需要复制整行。有谁知道在第 1 列匹配时如何删除原始行和重复行?

我试过了

awk 'key[$1]; NR==FNR{a[$0]++;next} a[$0]<2' infile infile

但这并没有让我有任何收获。我有一个包含以下数据类型的文件:

srv13108 f15001:/export/rack131/srv13108 srv13407 f15001:/export/rack134/srv13407 srv13501 f13901:/export/rack135/srv13501 srv13501 f14001:/export/rack135/srv13501 srv13609 f14901:/export/rack136/srv13609 srv14407 f14101:/export/rack144/srv14407

我希望输出是:

srv13108 f15001:/export/rack131/srv13108 srv13407 f15001:/export/rack134/srv13407 srv13609 f14901:/export/rack136/srv13609 srv14407 f14101:/export/rack144/srv14407

因为 2 行有一个匹配的第 1 列。

【问题讨论】:

    标签: linux shell awk


    【解决方案1】:

    你需要 awk 联机吗?

    awk '{a[$1]=$0;u[$1]++}END{for(i in u)if(u[i]==1)print a[i]}'  file
    

    给予:

    srv13609 f14901:/export/rack136/srv13609
    srv13108 f15001:/export/rack131/srv13108
    srv13407 f15001:/export/rack134/srv13407
    srv14407 f14101:/export/rack144/srv14407
    

    【讨论】:

    • @Kent 我在 awk 解决方案上脑残了,现在很明显 +1。
    • @sudo_O 实际上读取该文件两次(就像他的问题一样)也有效。第一次 u[$1]++,第二次检查读取的 $1 是否唯一,打印。
    • 2 pass 方法的效率会降低。
    猜你喜欢
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多