Как узнать максимальное значение третьего поля по первым двум полям, используя awk - PullRequest
1 голос
/ 28 апреля 2020

Содержимое файла выглядит следующим образом:

333379266       834640619       88
333379280       834640621       99
333379280       834640621       66
333376672       857526666       99
333376672       857526666       78
333376672       857526666       62

Первые два столбца могут дублироваться, и я хочу вывести первые два столбца и соответствующее максимальное значение третьего столбца. В этом случае Файл результата должен выглядеть следующим образом:

333379266       834640619       88
333379280       834640621       99
333376672       857526666       99

Моя попытка:

awk '{d[$1" "$2]=$3;if ($3>=d[$1" "$2]){num[$1" "$2]=$3} else{num[$1" "$2]=d[$1" "$2]} }END{for(i in num) print i,num[i]}'

Но это не работает, потому что $3>=d[$1" "$2] всегда верно, значение num всегда $3, и awk читает файл построчно, поэтому значение num всегда является последним, а не максимальным.

Я буду признателен, если кто-нибудь может дать мне решение. Спасибо заранее.

Ответы [ 2 ]

2 голосов
/ 28 апреля 2020

Не могли бы вы попробовать следующее.

awk '
{
  array[$1,$2]=array[$1,$2]>$3?array[$1,$2]:$3
}
END{
  for(i in array){
    print i,array[i]
  }
}
'  Input_file

Проблемы с кодом OP:

На вашей линии d[$1" "$2]=$3;if ($3>=d[$1" "$2]); так как вы присваиваете значение массива d перед сравнением с 3-м полем текущей строки, таким образом, это условие всегда будет истинным, и я могу видеть главную проблему в попытке ОП.

Исправление попытки ОП : ИМХО мое решение выше должно быть хорошим, но попытка исправить попытку ОП здесь.

awk '{if ($3>=d[$1" "$2]){num[$1" "$2]=$3} else{num[$1" "$2]=d[$1" "$2]};d[$1" "$2]=$3}END{for(i in num) print i,num[i]}'  Input_file
1 голос
/ 28 апреля 2020

Этот лайнер применил ту же идею, что и ваши коды, с той лишь разницей, что вместо пробела используется FS.

awk '{k=$1FS$2;a[k]=a[k]>$NF?a[k]:$NF}END{for(i in a)print i,a[i]}' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...