linux - 排序文件仅获取行最大值

标签 linux shell awk

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

例如

 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 吗? 谢谢!

最佳答案

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

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 来处理数组的数组。

关于linux - 排序文件仅获取行最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29831320/

相关文章:

python - 如何强制 str 更正 pygame.mixer (Python) 的类型?

bash - 如何通过管道将一个 python 脚本的输出作为另一个 python 脚本的输入?

linux - Shell 脚本无法解析主机列表和主机未知

c - 从 NETSTAT 的输出中删除

linux - 将文件行排列成表格形式

bash - 通过 Bash 打开与 Arduino 的串行连接

bash - 如何使用 shell 脚本从第二列中选择一个值?

linux - 列中的最小值和最大值

linux - Apache - 最后一小时的日志

linux - 是否可以使用 shell 脚本递归地创建文件夹?