2013-06-25 1 views
0

У меня есть вход, как это:выбора строк с повторяющимися столбцов по определенному значению

LineA parameter1 parameter2 56 
LineB parameter1 parameter2 87 
LineB parameter1 parameter2 56 
LineB parameter1 parameter2 90 
LineC parameter1 parameter2 40 

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

Так что вывод должен выглядеть следующим образом:

LineA parameter1 parameter2 56 
LineB parameter1 parameter2 90 
LineC ... 

ответ

2

Попробуйте ниже (предполагается, что поле 4> = 0 во всем)

Массива b используется для отслеживания наибольшего значения в поле 4 для уникального значения в поле 1. Массив a (с ключом по полю 1) содержит соответствующую запись. По мере обработки каждой записи запись добавляется в массив a, а поле 4 добавляется к массиву b, если 1. значение встречается в первом поле 1 или 2. значение в поле 4 превышает существующее значение в b для значения в поле 1. И наконец, печатается массив a.

awk '$4 > b[$1] {a[$1] = $0; b[$1] = $4} 
END{for (x in a) {print a[x]}}' 
+1

+1, но вам нужно только проверить '$ 4> б [$ 1]} '- если '$ 1' еще не был замечен, то' b [$ 1] 'будет рассматриваться как ноль. Больше описательных имен переменных могут помочь. –

+2

@ user2245731, обратите внимание, что порядок вывода не гарантированно совпадает с вводом: ассоциативные массивы awk не сохраняют порядок вставки. –

+0

@glennjackman, очень полезно, как всегда. Спасибо, включен – iruvar

2

Код для GNU :

awk 'BEGIN {SUBSEP=OFS} $4>a[$1,$2,$3] {a[$1,$2,$3]=$4} END {for (i in a) {print i,a[i]}}' file 
+1

нечитабельно. попробуйте 'awk 'BEGIN {SUBSEP = OFS} $ 4> a [$ 1, $ 2, $ 3] {a [$ 1, $ 2, $ 3] = $ 4} END {то же, что и у вас}'' –

0

Другой способ awk:

awk ' 
fld1!=$1 && NR>1 {print line} 
fld1==$1 {line=(fld4>$4)?line:$0;next} 
{line=$0;fld1=$1;fld4=$4;next} 
END{print line}' file 
Смежные вопросы