Использование awk для получения максимального значения столбца для каждого уникального значения другого столбца

Итак, у меня есть файл, например:

10 1 abc
10 2 def
10 3 ghi
20 4 elm
20 5 nop
20 6 qrs
30 3 tuv

Я хотел бы получить максимальное значение второго столбца для каждого значения первого столбца, т.е.:

10 3 ghi
20 6 qrs
30 3 tuv

Как я могу использовать awk или аналогичные команды unix?


person leonard vertighel    schedule 28.01.2016    source источник
comment
Являются ли строки всегда в порядке возрастания 2-го столбца, а первый столбец всегда организован с общими значениями рядом друг с другом?   -  person Ed Morton    schedule 29.01.2016


Ответы (2)


Вы можете использовать awk:

awk '$2>max[$1]{max[$1]=$2; row[$1]=$0} END{for (i in row) print row[i]}' file

Вывод:

10 3 ghi
20 6 qrs
30 3 tuv

Пояснение:

Команда awk использует ассоциативный массив max с ключом $1 и значением $2. Каждый раз, когда мы сталкиваемся со значением, уже сохраненным в этом ассоциативном массиве max, мы обновляем нашу предыдущую запись и сохраняем всю строку в другом ассоциативном массиве row с тем же ключом. Наконец, в разделе END мы просто перебираем ассоциативный массив row и печатаем его.

person anubhava    schedule 28.01.2016
comment
Это дает то, о чем просили. Я бы предложил хранить $0 вместо $3 для каждой максимальной строки. Это упростило бы печать в конце и работало бы для количества полей ›3 (даже переменного количества полей). - person e0k; 28.01.2016
comment
Большое спасибо @anubhava за быстрый ответ. Не могли бы вы дать объяснение о коде? Кроме того, спасибо e0k за обобщение, оно было очень полезно для моих нужд. - person leonard vertighel; 28.01.2016
comment
Добавил объяснение в ответ. - person anubhava; 28.01.2016

более короткая альтернатива с sort

$ sort -k1,1 -k2,2nr file | sort -u -k1,1

10 3 ghi
20 6 qrs
30 3 tuv

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

person karakfa    schedule 28.01.2016