Проверьте переменные из разных строк с помощью awk - PullRequest
1 голос
/ 21 сентября 2011

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

Ввод, пример csv:

222;a;DB;a
222;b;DB;a
555;f;DB;a
4444;a;DB;a
4444;d;DB;a
4444;z;DB;a

Выход:

222;a|b
555;f
4444;a|d|z

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

Ответы [ 5 ]

2 голосов
/ 21 сентября 2011
awk '
  BEGIN {FS=";"}
  { if ($1==prev) {sec=sec "|" $2; }
    else { if (prev) { print prev ";" sec; };
           prev=$1; sec=$2; }}
  END { if (prev) { print prev ";" sec; }}'

Это, как вы и просили, проверяет последовательные строки.

1 голос
/ 21 сентября 2011

работает ли этот oneliner?

 awk -F';' '{a[$1]=a[$1]?a[$1]"|"$2:$2;} END{for(x in a) print x";"a[x]}' file

протестировано здесь:

kent$  cat a
222;a;DB;a
222;b;DB;a
555;f;DB;a
4444;a;DB;a
4444;d;DB;a
4444;z;DB;a

kent$  awk -F';' '{a[$1]=a[$1]?a[$1]"|"$2:$2;} END{for(x in a) print x";"a[x]}'  a
555;f
4444;a|d|z
222;a|b

, если вы хотите сохранить сортировку, добавьте |sort в конце.

0 голосов
/ 21 сентября 2011

это должно работать:

Команда:

awk -F';' '{if(a[$1]){a[$1]=a[$1]"|"$2}else{a[$1]=$2}}END{for (i in a){print i";" a[i] }}' fil

Введите:

222;a;DB;a
222;b;DB;a
555;f;DB;a
4444;a;DB;a
4444;d;DB;a
4444;z;DB;a

Выход:

222;a|b
555;f
4444;a|d|z
0 голосов
/ 21 сентября 2011

Слегка запутанный, но делает работу:

awk -F';' \
'{
  if (a[$1]) {
    a[$1]=a[$1] "|" $2
  } else {
    a[$1]=$2
  }
 }
 END {
   for (k in a) {
     print k ";" a[k]
   }
 }' file
0 голосов
/ 21 сентября 2011

Предполагая, что вы установили разделитель полей (-F) в;:

{
   if ( $1 != last ) { print s; s = ""; }
   last = $1;
   s = s "|" $2;
} END {
   print s;
}

Первая строка и первый символ немного ошибочны, но это упражнение для читателя :-).Два простых if достаточно, чтобы это исправить.

(Правка: пропущена последняя строка.)

...