输入以下内容:
# 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,删除这些重复行的最佳方法是什么? 谢谢。
答案 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