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
Como funciona
-
-v RS='[,\n]'
Isto diz ao awk para usar qualquer ocorrência de uma vírgula ou uma nova linha como um separador de registro.
-
a=$0; getline b; getline c
Isso diz ao awk para salvar a linha atual na variável
a
, a próxima linha em variávelb
e a próxima linha depois disso na variávelc
. -
print a,b,c
Isso diz ao awk para imprimir
a
,b
ec
-
OFS=,
Isto diz ao awk para usar uma vírgula como separador de campos na saída.
Usando tr
e paste
$ tr , '\n' <filename | paste -d, - - -
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
Como funciona
-
tr , '\n' <filename
Isso lê o nome do arquivo ao converter todas as vírgulas em novas linhas.
-
paste -d, - - -
Este
paste
para ler três linhas de stdin (uma para cada-
) e colá-las juntas, cada uma separada por uma vírgula (-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
Como funciona
-
-v RS='[,\n]'
Isto diz ao awk para usar qualquer ocorrência de uma vírgula ou uma nova linha como um separador de registro.
-
printf "%s%s",$0,(NR%3?",":"\n")
Isso diz ao awk para imprimir a linha atual, seguida por uma vírgula ou uma nova linha, dependendo do valor do número da linha atual,
NR
, módulo 3.