2015-03-24 1 views
2

Я пытаюсь написать awk-скрипт, который хранит записи с самым высоким значением в заданном поле, но только сравнивает записи, разделяющие два других поля.awk: сохраняйте записи с самым высоким значением, сравнивая те, которые разделяют другие поля

Я бы лучше дать пример - это input.txt:

X A 10.00 
X A 1.50 
X B 0.01 
X B 4.00 
Y C 1.00 
Y C 2.43 

Я хочу, чтобы сравнить все записи разделяющих одинаковые значения в 1-й и 2-го поля (XA, XB или YC) и выберите тот, который имеет наивысшее числовое значение в третьем поле.

Итак, я ожидаю, этот вывод:

X A 10.00 
X B 4.00 
Y C 2.43 

С помощью этого сниппета я в состоянии выбрать запись с максимальным значением в 3-м поле (но это не принимая во внимание предыдущие поля, и это не выводит их либо):

awk 'BEGIN {max = 0} {if ($2>max) max=$2} END {print max}' input.txt 

тока (нежелательный) выход:

10.00 

Любые идеи? Я могу использовать gawk.

Большое спасибо!

ответ

4

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

awk '{k=$1 OFS $2} $3>a[k]{a[k]=$3} END{for (i in a) print i, a[i]}' file 
X A 10.00 
X B 4.00 
Y C 2.43 
+1

Спасибо, это работает! Не могли бы вы объяснить, что делает часть «OFS $ 2» в первом блоке скобки? – XGrau

+1

Там я сохраняю значение '$ 1 OFS $ 2' в переменной' k', где по умолчанию 'OFS' (разделитель выходных полей) является пробелом. – anubhava

+0

Ницца, спасибо! У меня есть дополнительный, связанный с этим вопрос: что делать, если я хочу сделать то же самое, но просто используя 1-е поле в качестве ключа, но также выводя второе? Вывод должен быть: 'XA 10.00' ' YC 2.43' т.е. искать значение макс в 3-м поле между записями обмена 1-й, независимо от 2-го (или других) – XGrau

 Смежные вопросы

  • Нет связанных вопросов^_^