【问题标题】:Find max/min of each column in awk在awk中查找每列的最大值/最小值
【发布时间】:2014-05-07 17:33:44
【问题描述】:

我有一个列数可变的文件:

输入

1 1 2
2 1 5
5 2 3
7 0 -1
4 1 4

我想打印每列的最大值和最小值:

期望的输出

max:    7 2 5
min:    1 0 -1

对于单个列,例如$1,我知道我可以使用类似的东西找到最大值和最小值:

awk '{if(min==""){min=max=$1}; if($1>max) {max=$1}; if($1<min) {min=$1};} END {printf "%.2g %.2g\n", min, max}' 

问题

如何扩展它以循环遍历所有列(在我的示例中不一定只有 3 个)?

非常感谢!

【问题讨论】:

  • 随着for (i=1; i&lt;=NF; i++) 的出现,将每个$1 更改为$i 并将min/max 更改为min[i]/max[i]
  • 我觉得我试过了,但我一定是在某些时候犯了错误!

标签: awk


【解决方案1】:
awk 'NR==1{for(i=1;i<=NF;i++)min[i]=max[i]=$i;}
{for(i=1;i<=NF;i++){if($i<min[i]){min[i]=$i}else if($i>max[i])max[i]=$i;}}
END{printf "max:\t"; for(i in max) printf "%d ",max[i]; printf "\nmin:\t"; for(i in min)printf "%d ",min[i];}' input.txt

输入.txt:

1 1 2 2
2 1 5 3
5 2 3 10
7 0 -1 0
4 1 4 5

输出:

max:    7 2 5 10 
min:    1 0 -1 0 

【讨论】:

  • 我喜欢你说话的方式:-)
【解决方案2】:

这样

awk 'NR==1{for(i=1;i<=NF;i++){xmin[i]=$i;xmax[i]=$i}}
     {for(i=1;i<=NF;i++){if($i<xmin[i])xmin[i]=$i;if($i>xmax[i])xmax[i]=$i}}
     END{for(i=1;i<=NF;i++)print xmin[i],xmax[i]}' file

【讨论】:

  • 谢谢(我已经接受了另一个答案,因为它稍早一些)!
【解决方案3】:

让我们尝试使用min=(current&lt;min?current:min) 表达式使其更短一些。这是一个三元运算符,和说if (current&lt;min) min=current一样。

此外,printf "%.2g%s", min[i], (i==NF?"\n":" ") 在到达最后一个字段时会在 END{} 块上打印新行。

awk 'NR==1{for (i=1; i<=NF; i++) {min[i]=$i}; next}
     {for (i=1; i<=NF; i++) { min[i]=(min[i]>$i?$i:min[i]); max[i]=(max[i]<$i?$i:max[i]) }}
     END {printf "min: "; for (i=1;i<=NF;i++) printf "%.2g%s", min[i], (i==NF?"\n":" "); 
          printf "max: "; for (i=1;i<=NF;i++) printf "%.2g%s", max[i], (i==NF?"\n":" ")}' file

样本输出:

$ awk 'NR==1{for (i=1; i<=NF; i++) {min[i]=$i}; next} {for (i=1; i<=NF; i++) { min[i]=(min[i]>$i?$i:min[i]); max[i]=(max[i]<$i?$i:max[i]) }} END {printf "min: "; for (i=1;i<=NF;i++) printf "%.2g%s", min[i], (i==NF?"\n":" "); printf "max: "; for (i=1;i<=NF;i++) printf "%.2g%s", max[i], (i==NF?"\n":" ")}' file
min: 1 0 -1
max: 7 2 5

【讨论】:

    猜你喜欢
    • 2015-06-29
    • 1970-01-01
    • 2016-06-06
    • 2018-04-06
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多