删除所有包含列2重复条目的行。

5

我有一个两列的大文件,希望按照第二列中的重复项删除行。我想同时删除两个重复项。

我尝试了:

awk '!seen[$2]++' filename

但它只会删除一个重复项。
输入文件示例:
1  3
2  3
4  10
1  6
5  3

预期输出:

4  10
1  6
4个回答

3

请尝试以下操作。

awk '{seen[$2]++;value[$2]=$0} END{for(i in seen){if(seen[i]==1){print value[i]}}}' Input_file

1
不错的回答伙计! - Allan
2
这将以“随机”(可能是哈希)顺序打印输入行。请参阅https://www.gnu.org/software/gawk/manual/gawk.html#Controlling-Array-Traversal - Ed Morton

2
$ awk 'NR==FNR{cnt[$2]++; next} cnt[$2]==1' file file
4  10
1  6

如果您无法读取两次输入(例如,如果它来自管道),则可以这样做:

最初的回答:

$ awk '{rec[NR]=$0; key[NR]=$2; cnt[$2]++} END{for (i=1; i<=NR; i++) if (cnt[key[i]] == 1) print rec[i]}' file
4  10
1  6

是的,它按照输入的顺序进行打印。 - Ravi Saroch

0

使用 coreutilsgrep

# Sort on the second column
<infile sort -k2,2n | 

# Count number of repeated fields in the second column
uniq -f1 -c         | 

# Remove fields that are repeated
grep -E '^ +1 +'    | 

# Squeeze white-space
tr -s ' '           | 

# Remove repeat count
cut -d' ' -f3-

输出:

1 6
4 10

0

另一个使用 sortuniqgrep 的示例:

$ grep -v -f <(sort -k2n file | uniq -f 1 -D) file
4  10
1  6

解释: sort 按照第二个字段对 file 进行排序:
1  3
2  3
5  3
1  6
4  10

uniq -f 1 -D 跳过第一个(以空格分隔的)字段,并仅打印重复的行:

1  3
2  3
5  3

那个列表是用于grep的排除列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接