2011-12-09 26 views
3

我写一个awk的脚本,需要输入的一些列在一个文本文件,并在每列打印出最大的价值值Gawk的打印最大从每列

输入:

$cat numbers 
    10  20  30.3 40.5 
    20  30  45.7 66.1 
    40  75  107.2 55.6 
    50  20  30.3 40.5 
    60  30  45.O 66.1 
    70  1134.7 50  70 
    80  75  107.2 55.6 

输出:

​​

脚本:

BEGIN { 
val=0; 
line=1; 
} 
{ 
if($2 > $3) 
{ 
    if($2 > val) 
    { 
     val=$2; 
     line=$0; 
    } 
} 
else 
{ 
    if($3 > val) 
    { 
     val=$3; 
     line=$0; 
    } 
} 
} 
END{ 
print line 
} 

电流输出:

60 30 45.O 66.1 

我在做什么错在先awk脚本

=======解决方案======

END { 
    for (i = 0; ++i <= NF;) 
    printf "%s", (m[i] (i < NF ? FS : RS)) 
    } 
{ 
for (i = 0; ++i <= NF;) 
    $i > m[i] && m[i] = $i 
} 

感谢您的帮助

+1

我不明白'$ 2> $ 3'并在代码'$ 3> val'测试;他们似乎根本不涉及问题描述(找到每列中最大的值)。试试'awk'{print $ 1 $ 3;}' sarnold

+0

井$ 1 $ 2和$ 3是列号 – BillPull

+1

到目前为止好。你为什么要将列号相互比较? – sarnold

回答

0

您可以创建一个用户定义函数,然后将单个列数组传递给它以检索最大值。事情是这样的 -

[jaypal:~/Temp] cat numbers 
10 20 30.3 40.5 
20 30 45.7 66.1 
40 75 107.2 55.6 
50 20 30.3 40.5 
60 30 45.O 66.1 
70 1134.7 50.0 70 
80 75 107.2 55.6 

[jaypal:~/Temp] awk '    
function max(x){i=0;for(val in x){if(i<=x[val]){i=x[val];}}return i;} 
{a[$1]=$1;b[$2]=$2;c[$3]=$3;d[$4]=$4;next} 
END{col1=max(a);col2=max(b);col3=max(c);col4=max(d);print col1,col2,col3,col4}' numbers 
80 1134.7 107.2 70 

awk 'a<$1{a=$1}b<$2{b=$2}c<$3{c=$3}d<$4{d=$4} END{print a,b,c,d}' numbers 
1

由于您有四列,您至少需要四个变量,每列一列(或者您喜欢的数组)。而且你不需要完整地保存任何行。独立处理每一列。

1

为了您的目的,您需要修改以下内容,以便在特定列(本例中为第二列)中找到最大值。

awk 'BEGIN {max = 0} {if ($2>max) max=$2} END {print max}' numbers.dat 

您使用$ 2> $ 3的方法似乎是将两列相互比较。

+0

这只是输出整个文件中的最大值,而不是每列的最大值。 – BillPull

+0

这将打印文件第2列中的最大值。所以你需要概括它为所有列工作。 – Omar