排序文件仅获取行的最大值

时间:2015-04-23 18:15:22

标签: linux shell awk

我已经对文本文件和简单的awk进行了排序,获得第一行(平均最大值)

Forexample

 Key    Column1  Column2  Column3  ..... MaxValue
Test1    500     400     200               500
Test1    499     400     200               500
Test1    499     399     200               499
Test1    498     100     100               498
Test2    600     200     150               600
Test2    600     199     150               600
Test2    599     199     100               599

我可以使用如下的shell脚本来获取动态列

MaxValue=`awk -F'\t' -v OFS="MaxValue" 'NR==1 {for (i=1; i<=NF; i++) if ($i==OFS) {print i} }'

我有简单的代码来获得第一行(平均最大值)

like awk '!a[$1]++'

然后结果如下,

 Key    Column1  Column2  Column3  ..... MaxValue
Test1    500     400     200               500
Test2    600     200     150               600

通过Key获得最高价值。 但我想检查另一个动态列,如果相同的值只打印。 结果如下,

 Key    Column1  Column2  Column3  ..... MaxValue
Test1    500     400     200               500
Test1    499     400     200               500
Test2    600     200     150               600
Test2    600     199     150               600

任何人都有使用awk的好主意吗? 谢谢!

1 个答案:

答案 0 :(得分:3)

你必须迭代文件两次:一次收集最大值,一次找到匹配它们的行:

awk '
  NR == FNR && ( !($1 in max) || max[$1] < $NF ) {max[$1] = $NF} 
  NR != FNR && $NF == max[$1]
' file file

如果要提供包含最大值的列的名称:

awk -v colname="Column2" '
  NR == 1 {for (i=2; i<=NF; i++) if ($i == colname) maxcol = i}  
  NR == FNR && ( !($1 in max) || max[$1] < $maxcol ) {max[$1] = $maxcol} 
  NR != FNR && $maxcol == max[$1]
' file file

您可能想要添加一些将maxcol变量实际设置为数字的验证。

并添加@ tommy的建议

awk -v colname="MaxValue" '
  NR == 1 {
    for (i=2; i<=NF; i++) if ($i == colname) maxcol = i
    print
    next
  }  
  ( !($1 in max) || max[$1] < $maxcol ) {
    max[$1] = $maxcol
    n[$1] = 0
    delete lines[$1]
  } 
  max[$1] == $maxcol {lines[$1][n[$1]++] = $0}
  END { for (key in lines) for (i=0; i<n[key]; i++) print lines[key][i] }
' file

这个数组需要GNU awk。