Tengo un archivo con las líneas como a continuación.
title1:A1
title2:A2
title3:A3
title4:A4
title5:A5
title1:B1
title2:B2
title3:B3
title4:B4
title5:B5
title1:C1
title2:C2
title3:C3
title4:C4
title5:C5
title1:D1
title2:D2
title3:D3
title4:D4
title5:D5
¿Cómo puedo conseguir esto?
title1 title2 title3 title4
A1 A2 A3 A4
B1 B2 B3 B4
C1 C2 C3 C4
D1 D2 D3 D4
text-processing
columns
Dens
fuente
fuente
Respuestas:
Eche un vistazo a GNU datamash que se puede usar como
datamash transpose
. Una versión futura también admitirá tabulación cruzada (tablas dinámicas)fuente
Además de lanzar una solución personalizada para transponer filas con columnas desde una línea de comando, la única herramienta que he visto que puede hacer esto es una herramienta llamada irónicamente
transpose
.Instalación
Lamentablemente, no está en ningún repositorio, por lo que deberá descargarlo y compilarlo. Esto es bastante sencillo ya que no tiene bibliotecas adicionales de las que depende. Se puede lograr así:
Uso
Puede manejar archivos de texto sencillos con facilidad. Por ejemplo:
Se puede transponer usando este comando:
Este comando es
transpose
transponer (-t
) y el separador de campo a utilizar es un espacio (--fsep " "
).Su ejemplo
Como sus datos de muestra están en un formato un poco más complejo, debe tratarse en 2 fases. Primero necesitamos traducirlo a un formato que
transpose
pueda manejar.Al ejecutar este comando, los datos se colocarán en un formato más horizontal:
Ahora solo necesitamos eliminar las ocurrencias secundarias del título1, título2, etc .:
Ahora está en un formato que
transpose
puede manejar. El siguiente comando realizará la transposición completa:fuente
Podría usar
awk
para procesar los datospaste
ycolumn
formatearlos.Aquí supongo que
title1
es solo un ejemplo en su publicación, y que los datos no contienen:
excepto como separador entre encabezado + datos.n
significa cuántas columnas para imprimir (deben coincidir con guionespaste
).Si desea que sea más flexible y fácil de mantener, puede escribirlo como un script. Aquí hay un ejemplo usando bash wrapper para
awk
y conectado acolumn
. De esta manera, también podría hacer más verificaciones de datos, por ejemplo, asegurarse de que los encabezados sean correctos en todas las filas, etc.Usado típicamente como:
Si encabezados siempre es más corta de datos entonces se podría también ahorrar ancho de cabecera, a continuación,
printf
con%-*s
y saltarcolumn
todos juntos.fuente
Aquí hay una forma rápida de colocar el archivo en el formato que desee:
Si desea los encabezados de columna:
Cómo funciona el segundo comando
imprimiendo el banner poniendo un retorno después de la pancarta en imprimir las filas de datosfuente
Utilidad GNU Datamash
Tomado de este sitio, https://www.gnu.org/software/datamash/ y http://www.thelinuxrain.com/articles/transposing-rows-and-columns-3-methods
fuente
Probablemente haya una forma más sucinta de formular esto, pero esto parece lograr el efecto general:
Las
sed
invocaciones múltiples no se sienten bien (y estoy bastante seguro de que sed también puede hacer la traducción de la nueva línea), por lo que probablemente no sea la forma más directa de hacerlo. Además, esto elimina los posibles encabezados, pero puede generarlos manualmente una vez que tenga las filas / campos formateados correctamente.Una mejor respuesta probablemente destile ese efecto a solo usar
sed
oawk
hacer esto para que solo tenga una cosa a la vez. Pero estoy cansado, así que esto es lo que pude armar.fuente
paste
es probablemente tu mejor apuesta Puede extraer los bits relevantes concut
,grep
yawk
así:Si la quinta columna se debe eliminar, agregue
awk 'NR%5'
así:Ahora columnate con
paste
:Salida:
fuente
Solo por la parte de transposición, tuve un problema similar recientemente y usé:
Ajuste el fmt según sea necesario. Para cada línea de entrada, concatena cada campo en un elemento de matriz. Tenga en cuenta que la concatenación de cadenas awk está implícita: sucede cuando escribe dos cosas sin ningún operador.
Muestra de E / S:
salida:
fuente
Lo más simple que puede hacer es usarlo
cut
para cortar los campos y luego usarlotr
si está transponiendo filas a columnas reemplazando el carácter de nueva línea con un carácter de tabulación: http://www.gnu.org/software/coreutils/manual/ coreutils.html # tr-invocaciónfuente
cut
devuelve un error.