найти максимальное значение столбца 1 и распечатать соответствующую запись из столбца 2 из файла

19

Как найти максимальное значение из столбца 1 и отобразить соответствующее местоположение пути из файла, который содержит n записей.

$ cat version.log
112030  /opt/oracle/app/oracle/product/11.2.0
121010  /opt/oracle/app/oracle/product/12.1.0

Ожидаемый результат:

/opt/oracle/app/oracle/product/12.1.0
АБУЛ КАШИМ
источник

Ответы:

23

Это должно работать:

awk -v max=0 '{if($1>max){want=$2; max=$1}}END{print want} ' version.log

В -v max=0устанавливает переменную , maxчтобы 0, таким образом , для каждой строки, первое поле сравнивается с текущим значением max. Если оно больше, maxустанавливается значение 1-го поля и wantтекущая строка. Когда программа обработает весь файл, wantбудет напечатано текущее значение .

редактировать

Я не тестировал awkрешение ранее, и было действительно плохо, когда я его предоставил. В любом случае, отредактированная версия ответа должна работать (спасибо Тердону за исправление), и я также проверил нижеприведенное.

sort -nrk1,1 filename | head -1 | cut -d ' ' -f3

Я нахожусь sortна первом поле, где,

  • -n указывает числовую сортировку.
  • -r указывает обратный результат сортировки.
  • -k1,1 указывает первое поле для сортировки.

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

Теперь я, наконец, передаю его cutс разделителем, указанным в качестве пробела, и печатаю тот, -f3который предназначен для вывода.

тестирование

cat filename
112030   /opt/oracle/app/oracle/product/11.2.0
121010   /opt/oracle/app/oracle/product/12.1.0
2312     /hello/some/other/path
3423232  /this/is/really/big/number
342      /ok/not/the/maximum/number
9999899  /Max/number
9767     /average/number

Теперь, после того как я выполнил приведенную выше команду для ввода, как указано выше, я получаю вывод как,

/Max/number
Рамеш
источник
awk max не сравнивает строковое поле численно. Вот почему вы дали второй подход?
Саджук
7

Вы можете сделать это с AWK.

$ awk '{if(max<$1){max=$1;line=$2}}END{print line}' file 
/opt/oracle/app/oracle/product/12.1.0

Здесь первый столбец каждой строки сравнивается с переменной max(которая изначально равна 0). Если первый столбец имеет значение greated, maxто второй столбец сохраняется в переменной line, это продолжается для каждой строки файла.

В конце файла ENDвыполняется правило для печати lineпеременной.

Каннан Мохан
источник
4
awk '$1 > max { max = $1; output = $2 } END { print output }' version.log
jw013
источник
3

sort -k1 -n filename | tail -1 | awk '{print $2}'

Мандар Шинде
источник
1
Это должно работать, но неэффективно, потому что сортировка излишня, когда задача состоит в том, чтобы найти максимум.
jw013
2

Просто вы можете отсортировать его с помощью sortкоманды

sort -r version.log | head -n1 | awk '{print $2}'

Выход:

/opt/oracle/app/oracle/product/12.1.0
Охранник зверь
источник
вы хотите напечатать второе значение только попробуйте этот кот version.log | сортировать -r | голова -n1 | awk -F "" '{Print $ 2}'
Security Beast
Пожалуйста, не размещайте скриншоты вашего терминала. Просто вставьте текст вместо. Кроме того, нет необходимости cat, сортировка может принимать входные файлы напрямую.
Тердон
-2
sort -nrk1,1 version.log | head -1 |awk '{print $2}’
Spidey Praful
источник
2
Это похоже на повтор хеша принятого ответа? Пожалуйста, объясните, чем это отличается.
Стивен Раух
Действительно, по крайней мере, отдать должное первоначальному автору.
Джефф Шаллер