(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 cEsto 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,cEsto le dice a awk que imprima
a,byc -
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' <filenameEsto lee desde el nombre del archivo mientras convierte todas las comas en líneas nuevas.
-
paste -d, - - -Este
pastepara 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.