使用awk来对抗文件每一行中的第一个数字,并打印包含最大行的整行

时间:2014-12-01 10:01:57

标签: linux awk ubuntu-12.04

我的文件看起来像这样:(感谢@fredtantini)

 37.36      44.22    -221.12       0.85       2.02       4.00       0.49   2345.147  '/home/~/gold_soln_x_m1_70.sdf'                     'X'    
 38.46      45.89    -229.45       1.49       1.94       4.00       0.61   2370.912  '/home/~/gold_soln_y_m1_69.sdf'                     'Y'    
 39.90      46.86    -234.28       0.29       2.66       4.00       1.00   2368.052  '/home/~/gold_soln_w.sdf'                     'W'    
 37.75      48.10    -240.50       2.58       3.77       4.00       0.60   2220.947  '/home/~/gold_soln_z.sdf'                     'Z'

我需要输出:

 39.90      46.86    -234.28       0.29       2.66       4.00       1.00   2368.052  '/home/~/gold_soln_w.sdf'                     'W'

打印在另一个文件中,但我从未使用过awk,所以我不知道如何组织我的脚本。寻找答案我发现了这个:

awk'
function max(x){i=0;for(val in x){if(i<=x[val]){i=x[val];}}return i;}
{a[$2]=$2;next}`
END{minimum=min(a);maximum=max(a);print "Maximum = "maximum "}'

但它不起作用,我不明白为什么。

我已尝试@fredtantini回答,它可以在终端上运行,但我需要将其插入脚本中:

完整的脚本如下所示:

#!/bin/bash
cd /home/~/
        for k in $( cat lista_sottocartelle ); do
            cd /home/~/$k 
            awk 'BEGIN{max=0}{if($1>max){max=$1;maxline=$0}}END{print maxline}' bestranking.lst >> indirizzi_ASP.lst

输出为:语法错误:意外的文件结尾

修改

我忘了在脚本末尾添加完成。 谢谢你们所有人。

1 个答案:

答案 0 :(得分:2)

只需使用:

~$ awk 'BEGIN{max=0}{if($1>max){max=$1;maxline=$0}}END{print maxline}' f
 39.90      46.86    -234.28       0.29       2.66       4.00       1.00   2368.052  '/home/~/gold_soln_w.sdf'                     'W'

对于每一行,检查第一个数字是否大于当前最大数量。如果是,则将行保存在maxline中。最后,打印此行。

做同样事情的较短版本(感谢@Jotne):

awk '$1>max {max=$1;maxline=$0}END{print maxline}'

您的脚本有几个问题($2是第二列,未定义min函数...)