Ich habe eine Textdatei mit Formatierung word @@@ type @@@ sentence
in jeder Zeile, sortiert nach „Wort“ in aufsteigender Reihenfolge. Einige Zeilen sind jedoch nicht eindeutig und beginnen mit demselben Wort wie die vorherige Zeile, siehe also Wort1 unten:
...
word0 @@@ type2 @@@ sentence0
word1 @@@ type1 @@@ sentence1
word1 @@@ type1 @@@ sentence2
word1 @@@ type1 @@@ sentence3
word1 @@@ type2 @@@ sentence4
word2 @@@ type1 @@@ sentence5
...
Ich möchte die Zeilen mit der gleichen Wort- und Typkombination durch Anhängen der Sätze zu einer einzigen zusammenfügen, so dass die Datei folgendes ergibt:
...
word0 @@@ type2 @@@ sentence0
word1 @@@ type1 @@@ sentence1 ;;; sentence2 ;;; sentence3
word1 @@@ type2 @@@ sentence4
word2 @@@ type1 @@@ sentence5
...
Die Wort- und Typfelder enthalten keine Leerzeichen.
Antwort1
Angenommen, Ihre Eingabe ist sowohl nach word
als auch type
nach den Feldern sortiert, wie es in Ihrer geposteten Beispieleingabe erscheint:
$ 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
Das Obige funktioniert mit jedem awk in jeder Shell auf jeder UNIX-Box, speichert immer nur eine Zeile auf einmal im Speicher und erzeugt die Ausgabe in derselben Reihenfolge wie die Eingabe.
Antwort2
Hier ist eine Möglichkeit in 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
Oder etwas leserlicher:
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
Beachten Sie, dass hierfür eine awk
Implementierung erforderlich ist, die mehrdimensionale Arrays versteht, beispielsweise GNU awk ( gawk
), die Standardeinstellung awk
auf Linux-Systemen.