(7 réponses)
Fermé il y a 3 ans.
Il existe un moyen de diviser une seule ligne en plusieurs lignes avec 3 colonnes.
Les caractères de nouvelle ligne manquent à la fin de toutes les lignes du fichier.
J'ai essayé d'utiliser awk, mais il divise chaque colonne en une ligne au lieu de 3 colonnes dans chaque ligne.
awk '{ gsub(",", "n") } 6' filename
où filename
Le contenu ressemble à :
A,B,C,D,E,F,G,H,I,J,K,L,M,N,O
La sortie souhaitée a 3 colonnes dans chaque ligne :
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
Réponse acceptée :
Utiliser 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
Comment ça marche
-
-v RS='[,n]'
Cela indique à awk d'utiliser toute occurrence d'une virgule ou d'un retour à la ligne comme séparateur d'enregistrement.
-
a=$0; getline b; getline c
Cela indique à awk de sauvegarder la ligne actuelle dans la variable
a
, la ligne suivante dans la variableb
, et la ligne suivante dans la variablec
. -
print a,b,c
Cela indique à awk d'imprimer
a
,b
, etc
-
OFS=,
Cela indique à awk d'utiliser une virgule comme séparateur de champ en sortie.
Utiliser tr
et paste
$ tr , 'n' <filename | paste -d, - - -
A,B,C
D,E,F
G,H,I
J,K,L
M,N,O
Comment ça marche
-
tr , 'n' <filename
Cela lit à partir du nom de fichier tout en convertissant toutes les virgules en retours à la ligne.
-
paste -d, - - -
Ce
paste
pour lire trois lignes de stdin (une pour chaque-
) et collez-les ensemble, chacun séparé par une virgule (-d,
).
Alternative awk
$ 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
Comment ça marche
-
-v RS='[,n]'
Cela indique à awk d'utiliser toute occurrence d'une virgule ou d'un retour à la ligne comme séparateur d'enregistrement.
-
printf "%s%s",$0,(NR%3?",":"n")
Cela indique à awk d'imprimer la ligne actuelle suivie d'une virgule ou d'une nouvelle ligne en fonction de la valeur du numéro de ligne actuel,
NR
, module 3.