Awk程序用于确定最大值

Awk程序用于确定最大值,awk,max,csh,Awk,Max,Csh,我试图确定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

我试图确定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

请您尝试以下书面和测试与显示的样本在链接

输出如下:

max of S2 is:800
max of S4 is:90

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

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

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
示例使用/输出

使用文件名
文件
中的数据,您只需更改到包含
文件
的目录(确保将
文件
更改为您输入的任何文件名),然后选择上面的“复制”并将鼠标中键粘贴到终端中进行测试,例如

$ 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

您已经在最初的问题中以代码的形式添加了您的良好成果。不知道为什么你刚才删除了它,这是一个很好的请求,请添加回来,因为这是高度鼓励如此。没有正确或错误的努力,因此请将它们放回您的问题中。仅供参考,我现在已将它们重新添加。我可能应该提到,我正在尝试在cshell中实现这些。@entrope,您的努力表明您是用awk编写的。我不确定cshell是不是我用手机写的,并在上面提到的链接中测试过。您应该在问题中提到cshell(偶数标记将在稍后的时间点添加,仅供参考)。不起作用吗?同意,非常感谢您的耐心和帮助@恩特罗佩,不客气,工作正常吗?请确认一下。是的,就像一个charmYou非常受欢迎。如果您将大量使用shell,请花时间学习
awk
。它是文字处理的瑞士军刀。一旦您理解了
awk
就很容易了,只需读取每条记录(行)并按照您编写规则的顺序应用它们。这是一个很好的参考。它将回报十倍于你花在学习上的时间。
$ 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