Максимальное и минимальное использование 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