1
votes

comment faire en sorte que grep ignore la première ligne et traite une autre ligne

Je dois supprimer la ligne commençant par '#' dans un fichier txt. mais en ignorant la première ligne comme en-tête. comment faire pour que grep ignore les premières lignes et supprime toute ligne commençant par # pour le reste des lignes?

cat sample.txt
#"EVENT",VERSION, NAME
1,2,xyz
1,2,abc
1,2,asd
1,2,ert
#"EVENT",VERSION, NAME
1,2,xyz
1,2,abc
1,2,xyz

cat sample.txt | grep -v "^\s*[#\;]\|^\s*$" > "out.txt"

mais cela supprime aussi l'en-tête!


2 commentaires

Double possible de Omission de la première ligne de toute sortie de commande Linux , Imprimer un fichier en sautant les X premières lignes dans Bash , etc.


je ne pense pas que ce soit la même chose. J'ai aussi besoin d'écrire l'en-tête dans le fichier de sortie


6 Réponses :


1
votes

Essayez une combinaison de head et grep comme ceci:

grep "^#" sample.txt | head -1 > out.txt && grep -v "^#" sample.txt >> out.txt

Résultat

#"EVENT",VERSION, NAME
1,2,xyz
1,2,abc
1,2,asd
1,2,ert
1,2,xyz
1,2,abc
1,2,xyz

Méthode alternative

head -1 sample.txt > out.txt && grep -v "^#" sample.txt >> out.txt

C'est-à-dire - lignes grep commençant par # mais choisissez simplement la première et l'écrire dans un fichier. Ensuite, grep toutes les lignes ne commençant pas par # et ajoutez ces privilèges au même fichier de sortie.


0 commentaires

4
votes

Avec sed:

#"EVENT",VERSION, NAME
1,2,xyz
1,2,abc
1,2,asd
1,2,ert
1,2,xyz
1,2,abc
1,2,xyz

De la deuxième ligne ( 2 ) à la dernière ligne ( $ ): recherche ( / ... / ) pour les lignes commençant ( ^ ) par # et supprimez-les ( d ). L'action par défaut de sed est d'imprimer la ligne actuelle.

Sortie:

sed '2,${/^#/d}' sample.txt


0 commentaires

0
votes

essayé sur gnu sed

sed '0,/^#/n;/^#/d' sample.txt


0 commentaires

1
votes

Cela entraînera n'importe quel awk à imprimer chaque ligne si son numéro de ligne est 1 ou s'il ne commence pas par #:

$ awk 'NR==1 || !/^#/' file
#"EVENT",VERSION, NAME
1,2,xyz
1,2,abc
1,2,asd
1,2,ert
1,2,xyz
1,2,abc
1,2,xyz


0 commentaires

1
votes

Cela pourrait fonctionner pour vous (GNU sed):

sed '1b;/^#/d' file

Ignorez la première ligne et supprimez toutes les autres lignes commençant par # .


0 commentaires

0
votes

L'application d'une commande arbitraire à tout sauf à la première ligne - un "en-tête" - d'un fichier ou d'un flux de données tabulaires est une tâche tellement courante pour moi que je définis un utilitaire d'aide appelé body pour it:

En tant que fonction shell (mettez ceci dans votre ~ / .bashrc ou équivalent):

$ cat sample.txt | body grep -v '^#'
#"EVENT",VERSION, NAME
1,2,xyz
1,2,abc
1,2,asd
1,2,ert
1,2,xyz
1,2,abc
1,2,xyz

Maintenant:

body() {
  IFS= read -r header
  printf '%s\n' "$header"
  "$@"
}

Crédit: adapté de: Outils de ligne de commande pour faire de la science des données , où c'est l'un des nombreux outils de données pratiques que vous pouvez mettre dans la variable PATH de votre shell. J'espère que beaucoup d'entre eux pourraient être canonisés en tant qu'outils UNIX standard.


0 commentaires