我知道这可能是一个老问题而且很多人已经解决了;但是,我的版本需要一点点扭曲。
所以我有一个档案,我称之为任务。对于这里的简单性,它只有4个条目:
约翰
克里斯蒂娜
恭
汤姆
现在,我想使用awk获取此文件中最长的名称,我希望它能同时返回Christina和Christine。
这是我到目前为止所做的:
<quest awk '{ if(length>x) {x =length; y=$0} } END {print y}'
它将归还克里斯蒂娜。我认为只用一行就可以完成,但我遇到了一些麻烦,想出一个聪明的方法来做到这一点。如果你能提供帮助我感激不尽!当然,我更喜欢单行。
答案 0 :(得分:5)
$ awk '{cur=length($0); recs[cur] = recs[cur] $0 ORS; max=(cur>max?cur:max)} END{printf "%s", recs[max]}' file
Christina
Christine
如果您的文件很大且上面有内存问题,那么:
$ awk '{cur=length($0)} cur>max{recs=""; max=cur} cur>=max{recs = recs $0 ORS} END{printf "%s", recs}' file
Christina
Christine
答案 1 :(得分:4)
您可以使用以下内容:
$ awk '{cur=length($0)} FNR==NR{max=(cur>max?cur:max); next} cur==max' file file
Christina
Christine
它使用语法awk '...' file file
:
max
变量中。这是FNR==NR {}
块,以next
结束以停止处理当前行。 Idiomatic awk。max
的行。请注意使用max=(cur>max?cur:max
来设置最大值。它是一个三元运算符,可以这样读:设置max
检查是否cur>max
。如果是这样,max=length($0)
;否则,max=max
。
答案 2 :(得分:2)
您可以使用数组来存储(到目前为止)最长的行
awk '{if (length($0)==maxlength) {arr[i++]=$0}; if (length($0)>maxlength) {i=0; maxlength=length($0); split("",arr); arr[i++]=$0}}END{for (i in arr) print a[i];}'
注意:
maxlength
存储迄今为止最长行的长度arr
存储迄今为止最长的行i
存储数组中行的计数split("",arr)
将arr
初始化为空数组这样您就不必两次读取文件,因此您也可以在管道中使用它
答案 3 :(得分:0)
您已了解许多awk解决方案。 我还想提一下,这也可以在perl中完成:
perl -lne '$m<($l=length($_))?$m=$l:0;
push @{$x{$l}},$_;
END{print "@{$x{$m}}"} ' your_file