72 votes

Toujours inclure la première ligne dans grep

Je grep souvent des fichiers CSV avec des noms de colonne sur la première ligne. Par conséquent, je veux que la sortie de grep inclue toujours la première ligne (pour obtenir les noms de colonnes) ainsi que toutes les lignes correspondant au modèle grep. Quelle est la meilleure façon de procéder?

78voto

kev Points 41855

sed:

 sed '1p;/pattern/!d' input.txt

awk :

 awk 'NR==1 || /pattern/' input.txt

grep1 :

 grep1() { awk -v pattern="${1:?pattern is empty}" 'NR==1 || $0~pattern' "${2:?filename is empty}"; }

17voto

Alex North-Keys Points 1786

grep n'a pas vraiment de concept de numéro de ligne, mais awk le fait, alors voici un exemple de lignes de sortie contenant "Incoming" - et la première ligne, quelle qu'elle soit :

 awk 'NR == 1 || /Incoming/' foo.csv

Vous pourriez faire un script (un peu excessif, mais). J'ai créé un fichier, grep+1, et j'y ai mis ceci :

 #!/bin/sh
pattern="$1" ; shift
exec awk 'NR == 1 || /'"$pattern"'/' "$@"

Maintenant on peut :

 ./grep+1 Incoming

edit : a supprimé le "{print;}", qui est l'action par défaut d'awk.

17voto

DigitalRoss Points 80400

Vous pouvez inclure une correspondance de modèle alternative pour l'un des noms de colonne. Si une colonne s'appelait COL, cela fonctionnerait :

 $ grep -E 'COL|pattern' file.csv

9voto

Adam Liss Points 27815

Vous pouvez utiliser sed au lieu de grep pour faire ceci :

 sed -n -e '1p' -e '/pattern/p' < $FILE

Cela imprimera la première ligne deux fois, cependant, si elle contient le motif.

-n indique à sed ne pas imprimer chaque ligne par défaut. -e '1p' imprime la première ligne. -e '/pattern/p' imprime chaque ligne correspondant au motif.

7voto

eyalev Points 60

Une autre option:

 $ cat data.csv | (read line; echo "$line"; grep SEARCH_TERM)

Exemple:

 $ echo "title\nvalue1\nvalue2\nvalue3" | (read line; echo "$line"; grep value2)

Sortir:

 title
value2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X