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

Vic*_* J. 3 unix awk command-line

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

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

约翰

克里斯蒂娜

克里斯汀

汤姆

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

这是我到目前为止:

<quest awk '{ if(length>x) {x =length; y=$0} } END {print y}'
Run Code Online (Sandbox Code Playgroud)

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

fed*_*qui 6

您也许可以使用以下内容:

$ awk '{cur=length($0)} FNR==NR{max=(cur>max?cur:max); next} cur==max' file file
Christina
Christine
Run Code Online (Sandbox Code Playgroud)

它使用以下语法循环遍历文件两次awk '...' file file

  • 第一次获得最大值 - 并将其存储在max变量中。这是一个FNR==NR {}以 a 结尾的块,next用于停止处理当前行。更多信息见惯用 awk
  • 第二次打印那些长度为 的行max

请注意使用 来max=(cur>max?cur:max设置最大值。它是一个三元运算符,可以这样读:设置maxcheck if cur>max。如果这是真的,max=length($0);否则,max=max


Ed *_*ton 5

$ awk '{cur=length($0); recs[cur] = recs[cur] $0 ORS; max=(cur>max?cur:max)} END{printf "%s", recs[max]}' file
Christina
Christine
Run Code Online (Sandbox Code Playgroud)

如果您的文件很大且上面有内存问题,那么:

$ awk '{cur=length($0)} cur>max{recs=""; max=cur} cur>=max{recs = recs $0 ORS} END{printf "%s", recs}' file
Christina
Christine
Run Code Online (Sandbox Code Playgroud)