Tengo un archivo de texto con formato word @@@ type @@@ sentence
en cada línea, ordenado por "palabra" en orden ascendente. Sin embargo, algunas líneas no son únicas y comienzan con la misma palabra que la línea anterior, es decir, consulte la palabra 1 a continuación:
...
word0 @@@ type2 @@@ sentence0
word1 @@@ type1 @@@ sentence1
word1 @@@ type1 @@@ sentence2
word1 @@@ type1 @@@ sentence3
word1 @@@ type2 @@@ sentence4
word2 @@@ type1 @@@ sentence5
...
Quiero unir las líneas que tienen la misma palabra y combinación de tipos en una, agregando las oraciones, para que el archivo resulte en:
...
word0 @@@ type2 @@@ sentence0
word1 @@@ type1 @@@ sentence1 ;;; sentence2 ;;; sentence3
word1 @@@ type2 @@@ sentence4
word2 @@@ type1 @@@ sentence5
...
Los campos de palabra y tipo no tienen espacios en blanco.
Respuesta1
Suponiendo que su entrada esté ordenada en los campos word
y type
tal como aparece en la entrada de muestra publicada:
$ 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
Lo anterior funcionará usando cualquier awk en cualquier shell en cada caja UNIX, solo almacena 1 línea a la vez en la memoria y producirá resultados en el mismo orden que la entrada.
Respuesta2
Aquí hay una manera, en 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
O, un poco más legible:
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
Tenga en cuenta que esto requiere una awk
implementación que comprenda matrices multidimensionales, como GNU awk ( gawk
), que es el valor predeterminado awk
en los sistemas Linux.