排序 – 使用awk删除包含唯一第一个字段的行?

希望仅打印具有重复的第一个字段的行.例如从看起来像这样的数据:

1 abcd
1 efgh
2 ijkl
3 mnop
4 qrst
4 uvwx

应打印出来:

1 abcd
1 efgh
4 qrst
4 uvwx

(仅供参考 – 我的数据中第一个字段的长度不总是1个字符)

awk 'FNR==NR{a[$1]++;next}(a[$1] > 1)' ./infile ./infile

是的,你给它输入两次相同的文件.由于您不知道当前记录是否为uniq,因此您在第一次传递时基于$1构建一个数组,然后您只输出在第二次传递中多次看到$1的记录.

我确信只有一次通过文件才能做到这一点,但我怀疑它们会像“干净”一样

说明

> FNR == NR:仅当awk正在读取第一个文件时才会出现这种情况.它主要测试所看到的记录总数(NR)与当前文件(FNR)中的输入记录.
> a [$1]:构建一个关联数组,一个人的关键是第一个字段($1),每次看到谁的值增加一.
> next:如果达到此目的,则忽略脚本的其余部分,重新​​开始输入新记录
>(a [$1]> 1)这只会在./infile的第二次传递中进行评估,它只会打印我们多次看到的第一个字段($1)的记录.从本质上讲,它是if(a [$1]> 1){print $0}的简写

概念证明

$cat ./infile
1 abcd
1 efgh
2 ijkl
3 mnop
4 qrst
4 uvwx

$awk 'FNR==NR{a[$1]++;next}(a[$1] > 1)' ./infile ./infile
1 abcd
1 efgh
4 qrst
4 uvwx
相关文章
相关标签/搜索