Как напечатать следующий n-й столбец в текущей строке после соответствия шаблону?

Если первый и второй столбцы следующей строки совпадают с текущей строкой, я хочу напечатать последний столбец каждой строки в текущей строке.

Мой входной файл

A 123 BC A 123 DD A 123 TT B 456 AA B 456 RR C 789 EE 

Желаемый вывод

  A 123 BC DD TT B 456 AA RR C 789 EE 

awk :

 awk '{a[$1FS$2]=a[$1FS$2]FS$NF} END {for(i in a) print ia[i]}' 
  • a[$1FS$2]=a[$1FS$2]FS$NF устанавливает ключи ассоциативного массива в качестве первых двух полей, разделенных разделителем полей, а значения как последнее поле объединяются с предыдущим значением по разделителю поля

  • END {for(i in a) print ia[i]} выполняется в конце, он итерации по клавишам массива a и клавишам печати и соответствующим значениям

Пример:

 % cat file.txt A 123 BC A 123 DD A 123 TT B 456 AA B 456 RR C 789 EE % awk '{a[$1FS$2]=a[$1FS$2]FS$NF} END {for(i in a) print ia[i]}' file.txt A 123 BC DD TT B 456 AA RR C 789 EE 

Вот один из способов, с GNU datamash

 $ datamash -Ws groupby 1,2 collapse 3 < file | sed 's/[,\t]/ /g' A 123 BC DD TT B 456 AA RR C 789 EE 

Команда sed заменяет поле по умолчанию и сворачивает разделители с пробелами.

Сначала sort входной file и уникальные ( -u ) строки в первых двух столбцах -k1,2 и cut третий столбец.

Затем перебираем строки по pattern и собираем третий столбец ( sed ) из входного file . Наконец, удалите разрывы строк tr и распечатайте совпадения.

 pattern=$(sort -k1,2 -u < file | cut -d' ' -f1-2) while read -r line do collect=$(sed -n 's/^'"$line"'//p' file | tr '\n' ' ') echo "$line $collect" done <<<"$pattern" 
 sed -E ' :loop $!N s/^(((\S+\s+){2}).*)\n\2/\1 / tloop P;D ' yourfile 

Результаты

 A 123 BC DD TT B 456 AA RR C 789 EE 

объяснение

Мы настраиваем loop do-while loop и добавляем следующую строку в pattern space и после этого сравниваем первые два поля с тем же после newline в пространстве шаблонов. Если они могут быть удалены из пространства шаблонов, то мы повторяем цикл и выходим из цикла на неспособность сделать это. В этот момент мы печатаем пространство шаблонов до первой новой строки. И удалите эту часть и вернитесь для большего.