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)
它将回归克里斯蒂娜.我认为只用一行就可以完成,但我遇到了一些麻烦,想出一个聪明的方法来做到这一点.如果你能提供帮助我感激不尽!当然,我更喜欢单行.
您也许可以使用以下内容:
$ 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。
$ 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)