数据:
id | 名称 | 城市 | 语言区域代码||
---|---|---|---|---|
01 | 胡安 | 卡利 | ES44 | |
01 | 何塞 | |||
01 | 佩德罗 | 卡利 | ES44 | |
02 | 阿尔伯特 | 爱丁堡|||
02 | 标记 | En | >19 | |
03 | Raisa | Hellsinki | FI22 | |
03 | Lisa | Hellsinki | ||
04 | Gian | 罗马 | IT33 | //tr>|
05 | 洛里斯 | 西西里 | ||
05 | Vera | 西西里31 |
两次通过:
$ awk -F';' 'NR==FNR{cnt[$1]++; next} cnt[$1]==2' file file
02;Albert;Edinburgh;;19
02;Mark;;En;19
03;Raisa;Hellsinki;FI;22
03;Lisa;Hellsinki;;
05;Loris;Sicilia;;
05;Vera;Sicilia;;31
或者在1次通过中,如果您的输入按示例中所示的第一个字段分组(如果不是,则始终可以sort
):
$ awk -F';' '
$1 != prev { if (cnt == 2) print buf; prev=$1; buf=$0; cnt=1; next }
{ buf=buf ORS $0; cnt++ }
END { if (cnt == 2) print buf }
' file
02;Albert;Edinburgh;;19
02;Mark;;En;19
03;Raisa;Hellsinki;FI;22
03;Lisa;Hellsinki;;
05;Loris;Sicilia;;
05;Vera;Sicilia;;31
总的来说,sort
后过滤行的速度更快。这里有一个单通道awk-based
解决方案,不需要sort
前或sort
后-
— output would be based on original input row order,
so presorted input means presorted output
- downside of this approach is needing 2 arrays.
|
{m,g}awk -F';.+$' '{
sub("$", NR "=", ____[$((_____[NR] = $-_)^_)])
} END {
FS = OFS = ORS (___=_="")
$-_=_
for (__ in ____) {
if ((_=____[__]) ~"^[0-9]+=[0-9]+=$") {
$+_=_____[+_]
sub("^[0-9]+[=]",___,_)
$+_=_____[+_]
} }
print $((__=(_=FS)"+")*gsub((_)__,_)*sub("^"__,___)) }'
|
02;Albert;Edinburgh;;19
02;Mark;;En;19
03;Raisa;Hellsinki;FI;22
03;Lisa;Hellsinki;;
05;Loris;Sicilia;;
05;Vera;Sicilia;;31