(7 respuestas)
Cerrado hace 3 años.
Hay una forma de dividir una sola línea en varias líneas con 3 columnas.
Faltan caracteres de nueva línea al final de todas las líneas del archivo.
Intenté usar awk, pero está dividiendo cada columna en una fila en lugar de 3 columnas en cada fila.
awk '{ gsub(",", "n") } 6' filename
donde filename
El contenido de parece:
A,B,C,D,E,F,G,H,I,J,K,L,M,N,O
La salida deseada tiene 3 columnas en cada línea:
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
Respuesta aceptada:
Usando awk
$ awk -v RS='[,n]' '{a=$0;getline b; getline c; print a,b,c}' OFS=, filename
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
Cómo funciona
-
-v RS='[,n]'
Esto le dice a awk que use cualquier aparición de una coma o una nueva línea como separador de registros.
-
a=$0; getline b; getline c
Esto le dice a awk que guarde la línea actual en la variable
a
, la siguiente línea en varaibleb
, y la siguiente línea después de eso en la variablec
. -
print a,b,c
Esto le dice a awk que imprima
a
,b
yc
-
OFS=,
Esto le dice a awk que use una coma como separador de campo en la salida.
Usando tr
y paste
$ tr , 'n' <filename | paste -d, - - -
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
Cómo funciona
-
tr , 'n' <filename
Esto lee desde el nombre del archivo mientras convierte todas las comas en líneas nuevas.
-
paste -d, - - -
Este
paste
para leer tres líneas de stdin (una para cada-
) y péguelos juntos, cada uno separado por una coma (-d,
).
Awk alternativo
$ awk -v RS='[,n]' '{printf "%s%s",$0,(NR%3?",":"n")}' filename
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
Cómo funciona
-
-v RS='[,n]'
Esto le dice a awk que use cualquier aparición de una coma o una nueva línea como separador de registros.
-
printf "%s%s",$0,(NR%3?",":"n")
Esto le dice a awk que imprima la línea actual seguida de una coma o una nueva línea dependiendo del valor del número de línea actual,
NR
, módulo 3.