Максимальное и минимальное использование awk

Как бы вы нашли максимальное и минимальное значения a,b,c для строк, которые начинаются с MATH из следующего файла?

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.

Я получаю неправильное минимальное значение, и я получаю строку для max при запуске моей программы. Пожалуйста, помогите!

вот мой код для столбца a:

BEGIN { x=1 }
{
 if ( == "MATH") {
        min=max=;
        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 ответов


этот код может продемонстрировать концепт того, что вы хотите:

awk '!="MATH"{next}1;!i++{min=;max=;}{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 '!="MATH"{next};...

сценарий версия:

#!/usr/bin/awk

 != "MATH" {
    # Move to next record if not about "MATH".
    next
}
!i++ {
    # Only does this on first match.
    min = ; max = 
}
{
    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
}

переменная i в цикле for должна по крайней мере начинаться с 2(2-е поле), а не 0, которые представляют всю строку, и заканчиваться NF.

BEGIN { x=1;min=2147483647;max=-2147483648}
{
 if ( == "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 для имени файла входных данных)

тест Кот.data / awk-f testawk.скрипт

выход:

макс значение 12.30 мин значение -1.56


посмотрите на свой цикл for

начинается с i=0, поэтому условие должно быть

i<NF 

вместо

i<= NF

попробуйте следующую строку вместо этой строки .... я надеюсь, что вы получите то, что вы ищете

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

остальное все выглядит нормально для меня.... спасибо


У меня сейчас нет терминала под рукой, но что-то в этих строках получит наименьшее из каждой строки.

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

   #IF Statement for comparing the three of them 
   #echo the smallest
done