Объединить следующие части строк в текущую строку в файле с 3 столбцами

Точно так, как вы описываете, с оператором косвенности(<):

/path/to/executable < /path/to/inputfile
1
11.03.2020, 19:29
2 ответа

Предположим, что ваш ввод отсортирован по обоим полям wordи type, как это видно из вашего опубликованного образца ввода:

$ cat tst.awk
BEGIN { FS=" @@@ "; ORS="" }
{ curr = $1 FS $2 }
curr != prev {
    printf "%s%s", ORS, $0
    prev = curr
    ORS = RS
    next
}
{ printf " ;;; %s", $NF }
END { print "" }

$ awk -f tst.awk file
word0 @@@ type2 @@@ sentence0
word1 @@@ type1 @@@ sentence1 ;;; sentence2 ;;; sentence3
word1 @@@ type2 @@@ sentence4
word2 @@@ type1 @@@ sentence5

Описанное выше будет работать с использованием любого awk в любой оболочке на каждом компьютере UNIX, сохраняет в памяти только одну строку за раз и будет производить вывод в том же порядке, что и ввод.

3
28.04.2021, 23:20

Вот так, в awk:

$ awk -F'@@@' '{ $1 in a ? a[$1][$2]=a[$1][$2]" ;;; "$3 : a[$1][$2]=$3}END{for(word in a){for (type in a[word]){print word,FS,type,FS,a[word][type]} }}' file 
word0  @@@  type2  @@@  sentence0
word1  @@@  type1  @@@  sentence1 ;;;  sentence2 ;;;  sentence3
word1  @@@  type2  @@@  ;;;  sentence4
word2  @@@  type1  @@@  sentence5

Или, чуть более разборчиво:

awk -F'@@@' '{ 
                if($1 in a){ 
                    a[$1][$2]=a[$1][$2]" ;;; "$3
                }
                else{
                    a[$1][$2]=$3
                }
             }
             END{
                 for(word in a){
                     for (type in a[word]){
                         print word,FS,type,FS,a[word][type]
                     }
                 }
             }' file 

Обратите внимание, что для этого требуется реализация awk, понимающая многомерные массивы, например GNU awk (gawk), которая используется по умолчанию awkв системах Linux.

0
28.04.2021, 23:20

Теги

Похожие вопросы