Как получить максимальное количество из файла с помощью 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 }: Наконец, напечатайте строку, которую мы запомнили при чтении ввода.