Как напечатать следующий 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 

4 Solutions collect form web for “Как напечатать следующий n-й столбец в текущей строке после соответствия шаблону?”

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 в пространстве шаблонов. Если они могут быть удалены из пространства шаблонов, то мы повторяем цикл и выходим из цикла на неспособность сделать это. В этот момент мы печатаем пространство шаблонов до первой новой строки. И удалите эту часть и вернитесь для большего.

  • Что означает различие с фигурными фигурными скобками?
  • Присвоение нового значения непосредственно в индекс символа значения в массиве с zsh
  • Сценарий оболочки для перемещения файлов, если определенный процент строк содержит определенную строку
  • Используйте sed и sed самостоятельно, чтобы выполнить подстановку в строке, начинающейся с определенной строки, только если!
  • Запрос ввода пользователя при чтении файла по строкам
  • Что означает -s и ] в условии if в bash?
  • Недостаток Linux: / dev / stdin не работает с сокетами
  • использование sed для замены шаблона с помощью хэш-значений
  • Одно из нескольких перенаправлений с файлом-добавлением «python -version» повторяется «игнорируется» bash, но остальные не закрыты]
  • Есть ли способ сказать, был ли сценарий оболочки убит сигналом 9
  • Подсчитайте строки, соответствующие шаблону и соответствующие предыдущей строке
  • Linux и Unix - лучшая ОС в мире.