首页 > 解决方案 > 使用 awk 消除基于两列的重复行

问题描述

鉴于此输入:

#       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,删除这些重复行的最佳方法是什么?谢谢。

标签: bashawk

解决方案


假设您希望打印以 # 开头的行,不希望在重复值的测试中考虑它们的 $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

推荐阅读