【问题标题】:how to return the index of max of each line using awk如何使用awk返回每行的最大值索引
【发布时间】:2017-05-04 01:45:14
【问题描述】:

我有一个包含很多行的文件:

id  val1  val2  val3 val4
a  0.10  0.50  0.30  0.40
b  0.15  0.35  0.20  0.80
c  0.50  0.45  0.20  0.40
....

我想像这样输出最大值的索引以及每一行的最大值:

a val2 0.50
b val4 0.80
c val1 0.50
...

我用过

awk '{m=$2;for(i=1;i<=NF;i++)if($i>m) m=$i;print $1,m}'

输出最大值,但不确定如何在打印命令中输出其索引(此处为val#),感谢任何建议和想法!

【问题讨论】:

    标签: awk


    【解决方案1】:

    几乎在正确的轨道上,只需维护一个新变量idx 用于将索引存储为

    awk 'NR>1{m=$2;for(i=2;i<=NF;i++)if($i>=m) { m=$i; idx=i }; print $1,"val"(idx-1),m}' file
    

    将根据您的需要生成输出。这里还有几点值得注意 1) 跳过标题行,因为它不需要处理 NR&gt;1 负责处理,2) 从 $2 开始循环并将条件更改为 ($i&gt;=m) 因为它可以匹配第二列也是。

    【讨论】:

    • 真快!
    • @JamesBrown:一次! ;)
    【解决方案2】:

    awk 的另一个:

    awk 'NR==1{split($0,a);next}{m=0;for(i=2;i<=NF;i++)if($i>m){m=$i;n=i}print $1,a[n],m}' foo
    a val2 0.50
    b val4 0.80
    c val1 0.50
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 2012-07-03
      • 2021-07-09
      • 1970-01-01
      相关资源
      最近更新 更多