(7 risposte)
Chiuso 3 anni fa.
C'è un modo per dividere una singola riga in più righe con 3 colonne.
Alla fine di tutte le righe nel file mancano caratteri di nuova riga.
Ho provato a usare awk, ma divide ogni colonna come una riga invece di 3 colonne in ogni riga.
awk '{ gsub(",", "n") } 6' filename
dove filename
Il contenuto è simile a:
A,B,C,D,E,F,G,H,I,J,K,L,M,N,O
L'output desiderato ha 3 colonne in ogni riga:
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
Risposta accettata:
Utilizzo di 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
Come funziona
-
-v RS='[,n]'
Questo dice ad awk di usare qualsiasi occorrenza di una virgola o di una nuova riga come separatore di record.
-
a=$0; getline b; getline c
Questo dice ad awk di salvare la riga corrente nella variabile
a
, la riga successiva nella variabileb
, e la riga successiva nella variabilec
. -
print a,b,c
Questo dice ad awk di stampare
a
,b
ec
-
OFS=,
Questo dice a awk di usare una virgola come separatore di campo nell'output.
Utilizzo di tr
e paste
$ tr , 'n' <filename | paste -d, - - -
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
Come funziona
-
tr , 'n' <filename
Questo legge dal nome del file durante la conversione di tutte le virgole in nuove righe.
-
paste -d, - - -
Questo
paste
per leggere tre righe da stdin (una per ogni-
) e incollarli insieme, ciascuno separato da una virgola (-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
Come funziona
-
-v RS='[,n]'
Questo dice ad awk di usare qualsiasi occorrenza di una virgola o di una nuova riga come separatore di record.
-
printf "%s%s",$0,(NR%3?",":"n")
Questo dice a awk di stampare la riga corrente seguita da una virgola o da una nuova riga a seconda del valore del numero di riga corrente,
NR
, modulo 3.