Как получить максимальное количество из файла с помощью Linux bash shell-скриптов
Как получить максимальную "скорость" и соответствующее значение "log2c" из файла следующим образом?
например: максимальная скорость составляет 89.5039 и log2c 3.0. Большое спасибо.
log2c=5.0 rate=88.7619
log2c=-1.0 rate=86.5412
log2c=11.0 rate=86.1482
log2c=3.0 rate=89.5039
log2c=-3.0 rate=85.5614
log2c=9.0 rate=81.4302
Ответы
Ответ 1
Используйте sort
:
sort -t= -nr -k3 inputfile | head -1
Для данного ввода он вернется:
log2c=3.0 rate=89.5039
Если вы хотите прочитать значения в переменных, вы можете использовать встроенный read
:
$ IFS=$' =' read -a var <<< $(sort -t= -nr -k3 inputfile | head -1)
$ echo ${var[1]}
3.0
$ echo ${var[3]}
89.5039
Ответ 2
Для очень больших файлов использование sort
будет довольно медленным. В этом случае лучше использовать что-то вроде awk, которому нужен только один проход:
$ awk -F= 'BEGIN { max = -inf } { if ($3 > max) { max = $3; line = $0 } } END { print line }' test.txt
log2c=3.0 rate=89.5039
Временная сложность этой операции линейна, а пространственная сложность постоянна (и мала). Объяснение:
-
awk -F= '...' test.txt
: вызывать awk на test.txt, используя =
в качестве разделителя полей
-
BEGIN { max = -inf }
: Инициализировать max
тем, что всегда будет меньше, чем все, что вы читаете.
-
{ if ($3 > max) { max = $3; line = $0; } }
: для каждой строки ввода, если max
меньше значения третьего поля ($3
), обновите его и запомните значение текущей строки ($0
)
-
END { print line }
: Наконец, напечатайте строку, которую мы запомнили при чтении ввода.