Unix Command Awk:查找文件中最长的字符串

时间:2014-04-13 22:16:39

标签: unix command-line awk

我知道这可能是一个老问题而且很多人已经解决了;但是,我的版本需要一点点扭曲。

所以我有一个档案,我称之为任务。对于这里的简单性,它只有4个条目:

  

约翰

     

克里斯蒂娜

     

     

汤姆

现在,我想使用awk获取此文件中最长的名称,我希望它能同时返回Christina和Christine。

这是我到目前为止所做的:

<quest awk '{ if(length>x) {x =length; y=$0} } END {print y}'

它将归还克里斯蒂娜。我认为只用一行就可以完成,但我遇到了一些麻烦,想出一个聪明的方法来做到这一点。如果你能提供帮助我感激不尽!当然,我更喜欢单行。

4 个答案:

答案 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

Test