Awk

將以下部分行合併到 3 列文件中的目前行

  • March 11, 2020

word @@@ type @@@ sentence在每一行都有一個格式的文本文件,按“單詞”升序排序。然而,有些行並不是唯一的,它們以與前一行相同的單詞開頭,即見下面的 word1:

...
word0 @@@ type2 @@@ sentence0
word1 @@@ type1 @@@ sentence1
word1 @@@ type1 @@@ sentence2
word1 @@@ type1 @@@ sentence3
word1 @@@ type2 @@@ sentence4
word2 @@@ type1 @@@ sentence5
...

我想通過附加句子將具有相同單詞和類型組合的行合併為一個,因此文件結果為:

...
word0 @@@ type2 @@@ sentence0
word1 @@@ type1 @@@ sentence1 ;;; sentence2 ;;; sentence3
word1 @@@ type2 @@@ sentence4
word2 @@@ type1 @@@ sentence5
...

word 和 type 欄位沒有空格。

假設您的輸入在您發布的範例輸入中顯示在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

以上將在每個 UNIX 機器上的任何 shell 中使用任何 awk 工作,一次僅在記憶體中儲存 1 行,並且將以與輸入相同的順序產生輸出。

引用自:https://unix.stackexchange.com/questions/572375