word @@@ type @@@ sentence
各行に書式設定され、「単語」に基づいて昇順にソートされたテキストファイルがあります。ただし、一部の行は一意ではなく、前の行と同じ単語で始まります。つまり、以下のword1を参照してください。
...
word0 @@@ type2 @@@ sentence0
word1 @@@ type1 @@@ sentence1
word1 @@@ type1 @@@ sentence2
word1 @@@ type1 @@@ sentence3
word1 @@@ type2 @@@ sentence4
word2 @@@ type1 @@@ sentence5
...
文を追加して同じ単語と型の組み合わせを持つ行を1行に結合したいので、ファイルの結果は次のようになります。
...
word0 @@@ type2 @@@ sentence0
word1 @@@ type1 @@@ sentence1 ;;; sentence2 ;;; sentence3
word1 @@@ type2 @@@ sentence4
word2 @@@ type1 @@@ sentence5
...
単語と型のフィールドにはスペースはありません。
ベストアンサー1
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システムのすべてのシェルで動作し、一度に1行だけメモリに保存し、入力と同じ順序で出力を生成します。