【问题标题】:Eliminate Duplicate Rows based on Two Columns using Awk使用 awk 消除基于两列的重复行
【发布时间】:2018-09-10 10:35:42
【问题描述】:

鉴于此输入:

#       133        15
KBL  40.385  26.385 1.0000 S
KBL  23.846   9.289 1.0000 P
KBL  40.234  26.385 1.0000 S
#       133         4
KBL  40.234  28.566 1.0000 S
KBL  40.385  28.566 1.0000 S
KBL  23.846  12.032 1.0000 P

我希望删除重复的行,特别是在第 2 列或第 3 列的值重复的地方。换句话说,我希望得到这个输出:

#       133        15
KBL  40.385  26.385 1.0000 S
KBL  23.846   9.289 1.0000 P
#       133         4
KBL  40.234  28.566 1.0000 S
KBL  23.846  12.032 1.0000 P

我试过awk '!a[$0]++' file.xy。但是,这只会删除完全相同的行。我希望只删除在第二列或第三列中具有重复值的行。

使用 Awk,删除这些重复行的最佳方法是什么? 谢谢。

【问题讨论】:

  • 你能分享到目前为止你尝试了什么吗?
  • 我试过 awk '!a[$0]++' file.xy ;但是,这只会删除完全相同的行。我希望只删除在第二列或第三列中具有重复值的行。
  • 您的最后一行有重复的$2。不确定您的规格与发布的数据是否一致

标签: bash awk


【解决方案1】:

假设您希望打印以 # 开头的行,不希望在测试中考虑其 $2 或 $3 值的重复值,并且只想消除每个单独的 #-line 分隔块中的重复项:

$ awk '/^#/{print; delete seen; next} !(seen[$2]++ || seen[$3]++)' file
#       133        15
KBL  40.385  26.385 1.0000 S
KBL  23.846   9.289 1.0000 P
#       133         4
KBL  40.234  28.566 1.0000 S
KBL  23.846  12.032 1.0000 P

【讨论】:

    【解决方案2】:

    这将为您提供所需的输出。这个方法需要两个文件:

    awk '!a[$2]++ || !a[$3]++' file1.txt > file2.txt && awk '!a[$3]++' file2.txt
    

    产生的输出是:

    #       133        15
    KBL  40.385  26.385 1.0000 S
    KBL  23.846   9.289 1.0000 P
    #       133         4
    KBL  40.234  28.566 1.0000 S
    KBL  23.846  12.032 1.0000 P
    

    【讨论】:

    • 不确定这里是否需要,但您可以将一个awk 传递到另一个,而不是通过bash 变量并将其打印到文件中。这本身就是多余的,因为第一个命令的输出也可以直接写入文件。
    • @karakfa 感谢您提供的信息,我认为您是对的。我已经更新了我的答案。
    • 我不遵循让你这么做的逻辑,但我很确定你的代码等同于awk '(!a[$2]++ || !a[$3]++) && !a[$3]++' file1.txt,我的布尔代数有点生疏,但我再次很确定(!a[$2]++ || !a[$3]++) && !a[$3]++ 仅相当于 !a[$3]++。它还将以 # 开头的行上的数值与我认为不是 OP 想要的其他行混合在一起,并且它在整个文件中而不是在每个 # 中单独进行唯一性测试-line 分隔块,我再次认为这不是 OP 想要的。
    • @EdMorton 你总是教我一些新东西。是的,我太傻了。你是 100% 正确的。我的代码不等于awk '(!a[$2]++ || !a[$3]++) && !a[$3]++' file1.txt。 :)
    猜你喜欢
    • 2021-06-04
    • 1970-01-01
    • 2016-02-21
    • 2017-02-10
    • 2017-04-05
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多