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个字符)
awk 'FNR==NR{a[$1]++;next}(a[$1] > 1)' ./infile ./infile
Run Code Online (Sandbox Code Playgroud)
是的,你给它输入两次相同的文件.由于您事先并不知道当前记录是否为uniq,因此您将根据$1
第一次传递建立一个数组,然后您只输出$1
在第二次传递中多次看到的记录.
我确信只有一次通过文件才能做到这一点,但我怀疑它们会像"干净"一样
FNR==NR
:这只在awk
读取第一个文件时才有效.它主要测试所看到的记录总数(NR)与当前文件(FNR)中的输入记录.a[$1]++
:构建一个关联数组a who's key是第一个field($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
Run Code Online (Sandbox Code Playgroud)