Нахождение максимального значения с помощью AWK - PullRequest
2 голосов
/ 10 июня 2019

У меня есть файл с данными двух столбцов, и я хочу найти максимальное значение и распечатать его.file = load_measure

11:20,18.03
11:25,17.85
11:30,18.24
11:35,19.19
11:40,18.45
11:45,17.53
11:50,17.56
11:55,17.60
12:00,18.51
12:05,18.50

Я пытаюсь с помощью нижеуказанного кода, но он возвращает 0

awk 'BEGIN {max = 0} {if ($2>max) max=$2} END {print max}' load_measure
0

Я пытаюсь через объявление max как $ max, но он не учитывает реальный максимум:

awk 'BEGIN {max = 0} {if ($2>max) max=$2} END {print $max}' load_measure
12:05,18.50

Может кто-нибудь объяснить, что я делаю не так?спасибо!

Ответы [ 2 ]

3 голосов
/ 10 июня 2019

Когда ваши поля разделены чем-то иным, чем пробелом, вам нужно сообщить awk, что это такое, заполнив FS.Вам также нужно установить максимальное значение для первого прочитанного значения, чтобы скрипт работал для всех отрицательных входных данных, и вам нужно вывести max+0 в КОНЦЕ, чтобы обеспечить числовой вывод, даже если входной файл пуст:

awk -F, 'NR==1{max=$2} $2>max{max=$2} END{print max+0}' file

Whern max равен 2, print max печатает значение max, т.е. 2, в то время как print $max печатает значение поля, проиндексированного значением max, т.е. $2, которое в КОНЦЕsection будет либо нулевым, либо значением $ 2 в последней прочитанной строке (неопределенное поведение для POSIX, поэтому зависит от awk).

2 голосов
/ 10 июня 2019

Вы должны указать значение FS, которое является разделителем поля ввода. Он описывает, как каждая запись разбивается на поля; это может быть даже расширенное регулярное выражение.

В командной строке awk FS можно указать как -F <sep> (или -v FS=<sep>). Вы также можете установить его в блоке BEGIN.

Обычно я использую более поздний метод, но это всего лишь личное предпочтение:

BEGIN {max=0;FS=","} ....

Также Ваша проблема может быть решена так же:

awk -F, -v m=0 '$2>m {m=$2} END {print m}' 

тем самым избавляясь от оператора if.

POSIX-обязательное значение по умолчанию - пробел (0x20). Но учтите, что пробелы (более одного) могут рассматриваться как один разделитель полей.

Вот официальная документация для GNU Awk.

...