使用Awk消除基于两列的重复行

时间:2018-09-10 00:34:46

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

2 个答案:

答案 0 :(得分:3)

假设您要打印以#开头的行,不想在测试中考虑它们的$ 2或$ 3值是否有重复值,而只想消除每个单独的#行分隔块中的重复项:

$ 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

答案 1 :(得分:1)

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

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