如何使用awk打印列中具有特定重复量的重复字段



数据:

语言区域代码ESES爱丁堡>FIIT//tr>西西里
id 名称 城市
01 胡安 卡利44
01 何塞
01 佩德罗 卡利44
02 阿尔伯特
02 标记 En19
03 Raisa Hellsinki22
03 Lisa Hellsinki
04 Gian 罗马33
05 洛里斯 西西里
05 Vera31

两次通过:

$ 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

相关内容

  • 没有找到相关文章

最新更新