用awk删除包含唯一第一个字段的行?

Kyl*_*yle 4 sorting awk grep sed uniq

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

1 abcd
1 efgh
2 ijkl
3 mnop
4 qrst
4 uvwx
Run Code Online (Sandbox Code Playgroud)

应打印出来:

1 abcd
1 efgh
4 qrst
4 uvwx
Run Code Online (Sandbox Code Playgroud)

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

Sie*_*geX 5

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

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

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

说明

  1. FNR==NR:这只在awk读取第一个文件时才有效.它主要测试所看到的记录总数(NR)与当前文件(FNR)中的输入记录.
  2. a[$1]++:构建一个关联数组a who's key是第一个field($1),每次看到它的值增加1.
  3. next:如果达到此目的,请忽略脚本的其余部分,重新​​开始使用新的输入记录
  4. (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
Run Code Online (Sandbox Code Playgroud)