2016-06-24 7 views
0

Мои данные выглядит следующим образом:Как выбрать строки с максимальным значением на основе одного столбца и группы по второму столбцу с помощью awk?

1 161 a 
1 48 b 
1 30 c 
2 199 d 
2 1306 d 
2 1290 d 
2 81 d 
2 51 e 
2 82 e 
2 93 e 
3 64 e 
3 99 f 
3 123 f 

Для каждого значения в третьем столбце, я хочу, чтобы выбрать строку, имеющий максимальное значение в колонке 2 и группы по колонке 1. Таким образом, требуемый выход

1 161 a 
1 48 b 
1 30 c 
2 1306 d 
2 93 e 
3 64 e 
3 123 f 

Группировка по первой колонке я имею в виду, я хочу результаты для всех различных значений в столбце 1. То, что я попытался с помощью это

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

Я получаю следующий результат

1 161 a 
1 48 b 
1 30 c 
2 1306 d 
2 93 e 
3 123 f 

Но я пропускаю следующую строку в результате

3 64 e 

Это потому, что это один вкладыш выбора только максимальное значение в колонке 2 для различных значений в колонке 3, Как мне группировать это по столбцу 1, чтобы получить желаемый результат для каждого значения в столбце 1?

+1

попробуйте выполнить поиск -r -n -k2 <файл | awk '\! x [$ 1, $ 3] ++' | sort -k1 –

+0

@soFan: Мне нравится идея, но пара исправлений из вашей команды 'sort -r -n -k2 Inian

+0

@inian, сделайте пожалуйста. –

ответ

1

Кредиты для sofan's идеи более в комментариях, с некоторыми дополнительными манипуляциями ниже логика будет делать трюк, как OP хочет.

sort -r -n -k2 < file| awk '!x[$1 FS $3]++' | sort -k1 
  • Идея для сортировки файла в порядке возрастания первого (sort -n -k2) и обратного его (-r) на колонке 2 (который теперь будет по убыванию)
  • awk '!x[$1 FS $3]++ делает группировку, что содержание уникального по столбцам 1 и 3 и sort -k1 видов/групп, которые она по колонке 1 содержание
+0

Благодарим вас за разъяснение этой идеи. Оно работает. –

4

Я думаю, вы можете просто использовать составной ключ $1$3:

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

Точно по мере необходимости в OP!Однако, имея самый основной вопрос, я вижу людей, использующих переменные типа 'max [$ 1 $ 3]', как в вашем ответе. Как это оценивается в первый раз? Похоже, что все такие переменные начинаются с '0'? – Inian

+1

@ Inian Я ни в коем случае не учился в AWK, но что касается моего лучшего предположения, 'max [" not existing "]' будет оцениваться пустой строкой, которая в числовом сравнении будет равна 0. – andlrc

+0

Это также хорошо, спасибо вы!! –

0

Самый простой команды, чтобы найти максимальное и минимальное значение во втором столбце что-то вроде этого, соответственно

sort -nrk2 data.txt | awk 'NR == 1 {print $ 2}' sort -nk2 data.txt | awk 'NR == 1 {print $ 2}'

0

Вы можете сделать это без awk. Мне пришлось использовать tr -s " " для подавления нескольких разделителей пробелов между полями/столбцами. Важная строка ниже - вторая.

cat $file | tr -s " " \ 
| sort -k2nr,2 | sort -k1,1 -k3,3 -u | sort -k3,3 -k1,1 -k2nr,2 \ 
| tr " " "\t" 

На самом деле, -k2nr,2 в самом конце даже нет необходимости. Вместо этого вы можете сохранить первоначальный порядок сортировки с --stable. Все дороги ведут в Рим.