Одной из проблем с вашим кодом является эта строка
local dr_trimmed="$(tr -d "$dr")"
Я предполагаю, что $dr
— это диапазон символов, который tr
следует удалить из стандартного ввода , но вы забыли предоставить tr
какие-либо данные для обработки. Так что он сидит там и ждет некоторых.
$ sort -k3,3rn file | head -n 1
David HR 4000
Это сортирует файл численно по 3-му столбцу в порядке убывания, затем выбирает первую строку этого результата, используя head
.
Если файл содержит вкладки в качестве разделителей полей, используйте -t $'\t'
с sort
. Таким образом, вы также сможете иметь поля с пробелами в них.
Чтобы отображались только имя и зарплата, используйте awk '{ print $1,$3; exit }'
вместо head -n 1
.
Идея состоит в том, чтобы преобразовать его в формат с тремя -столбцами, а затем отсортировать по столбцу зарплаты.
$ cat file
Nosi IT 3000 David HR 4000 John Security 3500 George Finance 3700
$ awk -v RS='[ \n]' '{a=$0;getline b; getline c; print a,c}' file | sort -rnk2 | head -1
David 4000
Если вы хотите использовать awk
, следующее должно работать для предоставленного вами образца ввода:
awk 'NF==0 {next} !name {max=$3; name=$1} {if ($3>max) {max=$3; name=$1};} END{printf("%s : %d\n",name,max)}' records.txt
Он пропустит пустые строки и инициализирует максимальное значение max
и соответствующее имя данными из первой не -пустой строки (, указанной переменной name
как 0
, т. е. неинициализированной, если здесь ожидается строка ). Он заменит их соответствующими значениями более поздних (не -пустых )строк, если обнаруженная зарплата больше текущей max
. В конце он печатает имя и значение.
Еще более короткая версия , предложенная Стивеном Киттом и Алексом Стрэгисом:
awk 'NF>0 && (!name || $3>max) {max=$3; name=$1} END {printf("%s : %d\n",name,max);}' records.txt
При этом используется тот факт, что настройки max
и name
одинаковы для первой непустой -строки и каждой строки со значением в столбце 3 больше, чем max
, поэтому один и тот же блок действий может использоваться путем проверки применимости любого из двух случаев. И пропуск пустых строк тоже можно просто включить, потребовав NF>0
в качестве предварительного условия для выполнения каких-либо действий.
awk версия:
awk 'NF && $3>max {max=$3; id=$1} END {print id" "max}' records.txt
Это читается как :«В строках с полями (= не пусто ), если оклад выше текущего сохраненного максимума (по умолчанию 0 ), то обновить сохраненное максимальное значение и имя чемпиона.Когда все строки будут обработаны (= END
), вывести обе переменные, содержащие ID и зарплату.
Из соображений скорости я, вероятно, выбрал бы этот подход с сортировкой , хотя:
sort -k 3 -n -r records.txt | head -n 1