знайти максимальне значення стовпця 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встановлюється значення першого поля і 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). Якщо перший стовпець має вказане значення, 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 | сортувати -р | голова -n1 | awk -F "" '{Друк $ 2}'
Безпека Звіст

Не публікуйте скріншоти свого терміналу. Просто замість цього вставити текст. Крім того, немає необхідності cat, сортування може приймати вхідні файли безпосередньо.
terdon

-2
sort -nrk1,1 version.log | head -1 |awk '{print $2}’

2
Це схоже на повторний хеш прийнятої відповіді? Поясніть, будь ласка, чим це відрізняється.
Стівен Рауч

Дійсно, принаймні віддати кредит оригіналу автора.
Джефф Шаллер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.