Отображение содержимого наивысшего значения в сценариях оболочки

Одной из проблем с вашим кодом является эта строка

local dr_trimmed="$(tr -d "$dr")"

Я предполагаю, что $dr— это диапазон символов, который trследует удалить из стандартного ввода , но вы забыли предоставить trкакие-либо данные для обработки. Так что он сидит там и ждет некоторых.

-1
20.04.2020, 14:31
5 ответов
$ sort -k3,3rn file | head -n 1
David HR 4000

Это сортирует файл численно по 3-му столбцу в порядке убывания, затем выбирает первую строку этого результата, используя head.

Если файл содержит вкладки в качестве разделителей полей, используйте -t $'\t'с sort. Таким образом, вы также сможете иметь поля с пробелами в них.

Чтобы отображались только имя и зарплата, используйте awk '{ print $1,$3; exit }'вместо head -n 1.

0
19.03.2021, 02:28

Идея состоит в том, чтобы преобразовать его в формат с тремя -столбцами, а затем отсортировать по столбцу зарплаты.

$ 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
0
19.03.2021, 02:28

Использование всегда -под рукой GNUdatamash:

$ datamash -Wf max 6 < record.txt | cut -f 4,6
David   4000

Используйте datamash, чтобы распечатать строку с наибольшим значением в 6-м столбце, и cut, чтобы получить только нужные вам столбцы.

1
19.03.2021, 02:28

Если вы хотите использовать 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в качестве предварительного условия для выполнения каких-либо действий.

1
19.03.2021, 02:28

версия:

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
1
19.03.2021, 02:28

Теги

Похожие вопросы