【发布时间】:2019-07-05 04:33:09
【问题描述】:
我有一个包含两列的大文件,我想根据第 2 列中的重复条目删除该行。我想删除两个重复条目。
我试过了:
awk '!seen[$2]++' filename
但它只会删除一个副本。
输入文件示例:
1 3
2 3
4 10
1 6
5 3
预期输出:
4 10
1 6
【问题讨论】:
标签: awk
我有一个包含两列的大文件,我想根据第 2 列中的重复条目删除该行。我想删除两个重复条目。
我试过了:
awk '!seen[$2]++' filename
但它只会删除一个副本。
输入文件示例:
1 3
2 3
4 10
1 6
5 3
预期输出:
4 10
1 6
【问题讨论】:
标签: awk
请您尝试关注一下。
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 的排除列表。
【讨论】: