比较列中的数字

时间:2014-03-23 19:42:58

标签: bash awk

我熟悉使用bash连续比较数字,但如果我想比较列怎么办?就像我有一个文件

4 2 5 7
6 1 3 8

我想找到每列中最大的

6 2 5 8

我怎么能用awk做到这一点?

2 个答案:

答案 0 :(得分:4)

假设您的数据位于名为“data”的文件中:

$ awk '{for(j=1;j<=NF;++j){max[j]=(max[j]>$j)?max[j]:$j};mNF=mNF>NF?mNF:NF} END{for(j=1;j<=mNF;++j)printf " " max[j]; print "" }' data
 6 2 5 8

或者,使用不同的输出格式:

$ awk '{for(j=1;j<=NF;++j){max[j]=(max[j]>$j)?max[j]:$j};mNF=mNF>NF?mNF:NF} END{for(j=1;j<=mNF;++j)print "max of column " j "=" max[j]}' data
max of column 1=6
max of column 2=2
max of column 3=5
max of column 4=8

上述awk计划的正文包括:

{ for(j=1;j<=NF;++j) {max[j]=(max[j]>$j)?max[j]:$j};mNF=mNF>NF?mNF:NF }

此循环针对输入文件中的每一行运行。循环遍历该输入行中的每个列(字段),从1到字段数(NF)。对于每列,它会检查当前值是否大于先前的最大值。如果是,则更新max数组中的值。

答案 1 :(得分:2)

使用数组的Bash解决方案:

max=();
while read -a line ; do 
    for ((i=0; i<${#line[@]} ; i++)) ; do
        ((line[i]>max[i])) && max[i]=${line[i]}
    done
done < input
echo "${max[@]}"