[résolu] cut et grep

cut et grep [résolu] - Shell/Batch - Programmation

Marsh Posté le 06-10-2013 à 14:43:47    

Bonjour.
 
Je voudrais créer un script qui conserve les lignes d'un fichiers qui commencent par l'un des mots spécifié par l'utilisateur.
 
Exemple :
$more file
Paul a 15 ans
Henry a 13 ans
Judith a 7 ans
Théo a 5 ans
 
$sh ./monscript file Paul,Judith,Théo
 
$more file
Paul a 15 ans
Judith a 7 ans
Théo a 5 ans

 
Pour l'instant, j'ai pu faire :
echo $(cut $2 -d"," -f1)
qui sépare les mots du 2eme argument
 
cat $1 | grep '\(^Paul\|^Judith\|^Théo\)' > $FILENAME
qui crée un fichier avec uniquement  les lignes qui m'intéressent.
 
Mais je ne sais pas comment associer les 2.
 
Merci à vous !


Message édité par natha31 le 07-10-2013 à 12:07:26
Reply

Marsh Posté le 06-10-2013 à 14:43:47   

Reply

Marsh Posté le 06-10-2013 à 23:41:56    

L'utilitaire grep a une option -v qui fait ça.
 
Par exemple pour avoir le fichier sans la ligne contenant Paul, faire  :

grep file -v Paul >newfile


 
Edit : Oups, j'ai mal lu la question.
 
Pour conserver des lignes contenant une ou plusieurs chaines de caractères particulières, utiliser egrep.
Par exemple pour avoir le fichier avec seulement les lignes Paul, Judith, et Théo  :

egrep "Paul|Judith|Theo" file >newfile


Message édité par olivthill le 06-10-2013 à 23:48:21
Reply

Marsh Posté le 07-10-2013 à 01:27:34    

Merci olivthill.
Mon souci est en fait d'automatiser le truc et de remplacer les Paul|Judith|Theo par des variables, pour pouvoir appeler le programme tel que je l'ai mentionné plus haut :) .


Message édité par natha31 le 07-10-2013 à 01:28:27
Reply

Marsh Posté le 07-10-2013 à 08:24:20    

:hello: !
 
Tu as la solution suivante (à ne pas conseiller je pense  :whistle: ) : tu remplaces toutes les virgules de ton argument par la chaîne suivante : " \\\|^", ce qui donne :
 

Code :
  1. PAT=$(echo "^"$2|sed 's/,/\\\|^')
  2. cat $1 | grep $PAT > $FILENAME


Par contre je n'ai pu tester que sur Cygwin, mais ça marche [:cupra]
 
:jap:


---------------
And in the end, the love you take is equal to the love you make
Reply

Marsh Posté le 07-10-2013 à 08:44:38    

ou

egrep "$2|$3|$4" $1 >$FILENAME

Message cité 1 fois
Message édité par olivthill le 07-10-2013 à 08:44:57
Reply

Marsh Posté le 07-10-2013 à 12:06:49    

olivthill a écrit :

ou

egrep "$2|$3|$4" $1 >$FILENAME



 
Ça me parait plus propre en effet :)
Par contre le nombre d'arguments est variable, donc j'ai fait plutôt ceci :
 

Code :
  1. file=$1
  2. filter=$2
  3. shift 2
  4. for word in $@ ; do
  5. filter=$filter"|"$word
  6. done
  7. cat $file | egrep $filter > sortie


 
Merci à vous !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed