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!
6 Réponses :
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.
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
essayé sur gnu sed
sed '0,/^#/n;/^#/d' sample.txt
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
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 #
.
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.
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