3 votes

Analyser le fichier à partir d'une certaine ligne en avant dans bash sur Linux

J'ai un fichier CSV contenant les registres suivants:

Nom,Téléphone,Pays
John,N/A,États-Unis
Max,N/A,États-Unis

Nom,Couleur,Taille
John,Bleu,M
Max,Rouge,S

Comment puis-je lire uniquement les registres à partir de Nom,Couleur,Taille, en utilisant bash?

De plus, comment puis-je limiter la sortie jusqu'à ce qu'elle atteigne soit la fin du fichier ou une ligne vide? Donc cela:

Nom,Téléphone,Pays
John,N/A,États-Unis
Max,N/A,États-Unis

Nom,Couleur,Taille
John,Bleu,M
Max,Rouge,S

Fictif,Fictif,Fictif
Foo,Foo,Bar

Ne produirait pas ceci:

John,Bleu,M
Max,Rouge,S

Fictif,Fictif,Fictif
Foo,Foo,Bar

Mais plutôt seulement ceci:

John,Bleu,M
Max,Rouge,S

J'ai déjà essayé grep et sed mais sans succès, j'ai aussi essayé tail mais le nombre de lignes est inconnu jusqu'à ce que le fichier soit lu.

2voto

John1024 Points 15663

Utilisation de awk

$ awk '/^$/{f=0} f{print} /Name,Color,Size/{f=1}' fichier
John,Blue,M
Max,Red,S

Comment ça marche

Le script awk a une variable, f, qui sert de drapeau pour identifier quand nous sommes dans un bloc Name,Color,Size.

  • /^$/{f=0}

    Sur une ligne vide, définir f=0 pour indiquer que nous sommes en dehors du bloc Name,Color,Size.

  • f{print}

    Lorsque nous sommes dans le bloc, f==1, imprimer la ligne.

  • /Name,Color,Size/{f=1}

    Lorsque nous atteignons l'en-tête Name,Color,Size, définir f=1 pour indiquer que nous sommes dans le bloc.

Utilisation de GNU sed

$ sed -n '/Name,Color,Size/{:a; n; /./{p; ba;}}' fichier
John,Blue,M
Max,Red,S

Comment ça marche

  • -n

    Dire à sed de ne rien afficher à moins que nous le demandions explicitement.

  • /Name,Color,Size/{...}

    Si la ligne contient l'en-tête Name,Color,Size, alors exécuter les commandes entre les accolades :

    • :a;

      Cela définit une étiquette a.

    • n;

      Cela lit la ligne suivante.

    • /./{p; ba;}

      Si cette ligne suivante n'est pas vide, alors l'imprimer (p) et retourner (b) à l'étiquette a.

    De cette façon, toutes les lignes à l'intérieur du bloc seront lues et imprimées et l'impression s'arrête avec la première ligne vide.

1voto

Andrew Cash Points 1803

Vous pouvez utiliser sed pour afficher uniquement les éléments après une certaine ligne en faisant quelque chose comme

sed -e '0,/Name,Color,Size/d' 

donc vous ne verrez que les lignes qui viennent après Name,Color,Size

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X