¿Cómo puedo usar awk
en la siguiente situación?
Quiero concatenar líneas que comienzan con la misma columna. Sólo la primera columna se mantiene después de la unión (en este caso aaa
, www
, hhh
).
El archivo puede estar separado por espacios o tabulaciones.
Entrada de ejemplo:
aaa bbb ccc ddd NULL NULL NULL
aaa NULL NULL NULL NULL NULL NULL
aaa bbb ccc NULL NULL NULL NULL
www yyy hhh NULL NULL NULL NULL
hhh 111 333 yyy ooo hyy uuuioooy
hhh 111 333 yyy ooo hyy NULL
Salida deseada:
aaa bbb ccc ddd NULL NULL NULL NULL NULL NULL NULL NULL NULL bbb ccc NULL NULL NULL NULL
www yyy hhh NULL NULL NULL NULL
hhh 111 333 yyy ooo hyy uuuioooy 111 333 yyy ooo hyy NULL
El trasfondo de esto es que quiero configurar una base de datos muy simple basada en archivos, donde la primera columna es siempre el identificador de la entidad. Todas las líneas basadas en la misma columna de identificador están concatenadas.
text-processing
sed
awk
minúsculo
fuente
fuente
uuu
línea (en la salida)?Respuestas:
Para obtener las primeras columnas en cada línea usando awk, puede hacer lo siguiente:
Estas son sus claves para el resto de las líneas. Por lo tanto, puede crear una tabla hash, utilizando la primera columna como clave y la segunda columna de la línea como valor:
Para obtener el resto de la línea, comenzando con la columna 2, debe recopilar todas las columnas:
fuente
Alguien más puede responder en awk o sed, pero una versión de Python es sencilla y puede serle útil.
fuente
Esta es una aplicación más interesante de coreutils, sospecho que no es muy eficiente con una gran entrada, ya que invoca unir para cada línea en la entrada.
Para mejorar su eficiencia, puede ser útil ahorrar
outfile
ytmp
en un disco RAM.Editar
O sin archivos temporales:
fuente
Y aquí hay una línea PERL:
fuente