GNU/Linux >> Tutoriels Linux >  >> Linux

Linux - Diviser une seule ligne en plusieurs lignes, caractère de saut de ligne manquant pour toutes les lignes du fichier d'entrée ?

Cette question a déjà des réponses ici :Comment traiter un fichier texte multi-colonnes pour obtenir un autre fichier texte multi-colonnes ?

(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

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 variable b , et la ligne suivante dans la variable c .

  • print a,b,c

    Cela indique à awk d'imprimer a , b , et c

  • 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.


Linux
  1. 8 conseils pour la ligne de commande Linux

  2. Comment compter les lignes d'un fichier sous UNIX/Linux

  3. Chat récursif tous les fichiers en un seul fichier

  4. Linux - vérifier s'il y a une ligne vide à la fin d'un fichier

  5. Linux - grep de certaines lignes à la fin du fichier

3 gestionnaires de mots de passe pour la ligne de commande Linux

Comment diviser un gros fichier d'archive en plusieurs petits fichiers à l'aide de la commande Split sous Linux

Comment diviser un gros fichier d'archive en plusieurs petits fichiers à l'aide de la commande Split sous Linux

Comment joindre plusieurs lignes en une seule dans un fichier sous Linux

Afficher le contenu d'un fichier dans la ligne de commande Linux

Comment trouver la ou les lignes les plus longues dans un fichier sous Linux