我有一个两列的大文件,希望按照第二列中的重复项删除行。我想同时删除两个重复项。
我尝试了:
awk '!seen[$2]++' filename
但它只会删除一个重复项。
输入文件示例:
1 3
2 3
4 10
1 6
5 3
预期输出:
4 10
1 6
我有一个两列的大文件,希望按照第二列中的重复项删除行。我想同时删除两个重复项。
我尝试了:
awk '!seen[$2]++' filename
1 3
2 3
4 10
1 6
5 3
预期输出:
4 10
1 6
请尝试以下操作。
awk '{seen[$2]++;value[$2]=$0} END{for(i in seen){if(seen[i]==1){print value[i]}}}' Input_file
$ 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
使用 coreutils
和 grep
:
# 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
另一个使用 sort
、uniq
和 grep
的示例:
$ 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
的排除列表。