9

您如何从以下文件中找到以 MATH 开头的行的最大和最小 a、b、c 值?

TITLE     a       b       c
MATH      12.3    -0.42   5.5
ENGLISH   70.45   3.21    6.63
MATH      3.32    2.43    9.42
MATH      3.91    -1.56   7.22
ENGLISH   89.21   4.66    5.32

它不能只是 1 个命令行。它必须是使用 BEGIN 函数和 END 的脚本文件。

我得到了错误的最小值,当我运行我的程序时,我最终得到了一个最大值字符串。请帮忙!

这是我的 a 列代码:

BEGIN { x=1 }
{
 if ($1 == "MATH") {
        min=max=$2;
        for ( i=0; i<=NF; i++) {
                min = (min < $i ? min : $i)
                max = (max > $i ? max : $i)
        }
 }

}

END { print "max a value is ", max, " min a value is ", min }

谢谢!

4

4 回答 4

8

此代码可以演示您想要的概念:

awk '$1!="MATH"{next}1;!i++{min=$2;max=$2;}{for(j=2;j<=NF;++j){min=(min<$j)?min:$j;max=(max>$j)?max:$j}}END{printf "Max value is %.2f. Min value is %.2f.\n", max, min}' file

输出:

MATH      12.3    -0.42   5.5
MATH      3.32    2.43    9.42
MATH      3.91    -1.56   7.22
Max value is 12.30. Min value is -1.56.

删除1以抑制消息:

awk '$1!="MATH"{next};...

脚本版本:

#!/usr/bin/awk

$1 != "MATH" {
    # Move to next record if not about "MATH".
    next
}
!i++ {
    # Only does this on first match.
    min = $2; max = $2
}
{
    for (j = 2; j <= NF; ++j) {
        min = (min < $j) ? min : $j
        max = (max > $j) ? max : $j
    }
}
END {
    printf "Max value is %.2f. Min value is %.2f.\n", max, min
}
于 2013-09-10T02:33:05.723 回答
1

看看你的 for 循环

它从 i=0 开始,所以条件应该是

i<NF 

代替

i<= NF

尝试以下行而不是那行....我希望你得到你正在寻找的东西

for(i=0;i<NF;i++){

休息对我来说一切都很好....谢谢

于 2013-09-10T02:35:18.827 回答
1

for 循环中的 i 变量至少应该以 2(第二个字段)开头,而不是 0,它代表整行,并以 NF 结尾。

BEGIN { x=1;min=2147483647;max=-2147483648}
{
 if ($1 == "MATH") {            
        for ( i=2; i<=NF; i++) {
                min = (min < $i ? min : $i)
                max = (max > $i ? max : $i)
        }
 }

}

END { print "max a value is ", max, " min a value is ", min }

使用命令运行:(testawk.script对于上述 awk 脚本文件名,test.data对于输入数据文件名)

cat test.data | awk -f testawk.script

输出:

最大值为 12.30 最小值为 -1.56

于 2013-09-10T02:49:38.180 回答
-2

我现在手边没有终端,但沿着这些线的东西会得到每条线中最小的。

cat YOURFILE | grep "^MATH" | cat test | \   
while read CMD; do
    A=`echo $CMD |  awk '{ print $2 }'`
    B=`echo $CMD |  awk '{ print $3 }'`
    C=`echo $CMD |  awk '{ print $4 }'`

   #IF Statement for comparing the three of them 
   #echo the smallest
done
于 2013-09-10T01:54:59.410 回答