найти максимальное значение столбца 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переменной.



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}’

2
Это похоже на повтор хеша принятого ответа? Пожалуйста, объясните, чем это отличается.
Стивен Раух

Действительно, по крайней мере, отдать должное первоначальному автору.
Джефф Шаллер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.