首页 > 解决方案 > 确定最大值的 awk 程序

问题描述

我正在尝试确定列 S2 和 S4 的最大值,但仅适用于具有 BBB 的相应 S1 列。输出将是 S2 max=800 和 S4 max=90。目前有: awk 'BEGIN { FS = " " ; OFS = " "; } { if(NR%3==0){max=$3} { s2+=substr($2,1,3); s4+=substr($4,1,2) } } ; { $3 >= max } END { print "Max S2 = " s2, "; Max S4 = " s4 } ' file.txt

   S1 S2 S3 S4 
   --- --- - --
   AAA 100 A 99
   BBB 200 B 90
   CCC 300 C 80
   AAA 400 A 70
   BBB 500 B 60
   CCC 600 C 50
   AAA 700 A 40
   BBB 800 B 30
   CCC 900 C 20
   AAA 999 A 10

标签: awkmaxcsh

解决方案


您使用的外壳不应该有任何区别,它不会改变awk行为方式。它可能会改变您向 提供变量输入的方式awk,但您的问题在这里不需要任何内容​​。

在这里,您可以简单地识别包含的记录(行)BBB,然后跟踪 field-2 和 field-4 的最大值,然后使用END规则输出结果。您可以使用@RavinderSingh13使用的传统if三元运算符。一个传统的if将是:

awk '/BBB/{
    if ($2 > s2)
        s2 = $2
    if ($4 > s4)
        s4 = $4
}
END{
    printf "S2 max=%d and S4 max=%d\n", s2, s4
}' file

示例使用/输出

使用 filename 中的数据file,您可以更改到包含的目录file(确保更改file为输入文件名),然后在上面选择复制和鼠标中键粘贴到终端进行测试,例如

$ awk '/BBB/{
>     if ($2 > s2)
>         s2 = $2
>     if ($4 > s4)
>         s4 = $4
> }
> END{
>     printf "S2 max=%d and S4 max=%d\n", s2, s4
> }' file
S2 max=800 and S4 max=90

推荐阅读