3 votes

recherche de plusieurs chaînes de caractères

J'utilise la commande grep pour extraire les informations requises d'un fichier. J'utilise deux instructions grep comme ci-dessous

XXXX='grep XXXX FILE A|sort|uniq|wc -l'
grep YYYY FILE A|uniq| > FILE B

Le fichier est maintenant parcouru deux fois. Mais je veux juste savoir si je pourrai faire ces deux étapes en une seule traversée de fichier, c'est-à-dire si je peux utiliser quelque chose de similaire à egrep où je peux grep pour deux chaînes et une chaîne que j'utiliserai pour la saisie dans une variable et la sortie d'une autre chaîne dans un fichier.

1voto

mostar Points 1282

Vous pouvez utiliser le code suivant. Ici, nous recherchons les lignes contenant XXXX ou YYYY dans tous les fichiers, une seule fois, et nous stockons les lignes résultantes dans un tableau. Ensuite, nous utilisons les éléments de ce tableau pour sélectionner les lignes contenant XXXX et les lignes contenant YYYY.

filtered=`grep -E '(XXXX|YYYY)' FILE A`
XXXX=`for line in ${filtered[@]}; do echo $line; done | grep XXXX | sort | uniq | wc -l`
for line in ${filtered[@]}; do echo $line; done | grep YYYY | uniq > FILE B

Le fichier n'est donc pas parcouru deux fois !

0voto

Matthias Vallentin Points 4165

Ou utilisez egrep avec une disjonction :

egrep '(XXXX|YYYY)' FILE A | sort | uniq | ...

Ou awk :

awk '/XXXX|YYYY/' FILE A | sort | uniq | ...

0voto

William Pursell Points 56211

Il y a un symbole '|' à la fin de votre question, et peut-être vouliez-vous que les lignes YYYY soient également acheminées vers sort (ou utiliser sort -u !), auquel cas vous pouvez simplement faire :

awk '/XXXX/ { if( !x[$0]++ ) xcount += 1 } 
     /YYYY/ { if( !y[$0]++ ) ycount += 1 }
  END { print "XXXX:", xcount
        print "YYYY:", ycount
        for( i in y ) print i | "sort > FILEB"
  }' FILE

ce programme parcourt le fichier une fois, en incrémentant le compteur à chaque fois qu'une ligne uniq contenant le motif approprié est vue. Notez que l'ordre d'itération sur le tableau de lignes AAAA n'est pas bien défini ici, c'est pourquoi le tri est nécessaire. Certaines versions d'awk permettent de trier le tableau sans dépendre d'un utilitaire externe, mais ce n'est pas le cas de toutes. Utilisez perl si vous voulez le faire.

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