Voici un petit script awk qui devrait répondre à ton besoin.
Il permet de faire de faire l'équivalent de plusieurs greps avec un fichier en sortie par chaîne recherchée.
La syntaxe d'appel est :
mgrep list=[i]chaines[/i] output=[i]output_file_spec[/i] [i]inputfile ...[/i] |
Liste de chaines de caractéres à rechercher séparées par une vurgule
Spécification des fichiers de sortie (defaut=%i.out) dans laquelle les substitution suivantes sont effectuées :
%c = chaine trouvée
%i = indice dans la liste de la chaine trouvée
%f = nom du fichier d'entrée dans lequel la chaîne a été trouvée
Par exemple :
mgrep list=toto,lulu output=lignes_avec_%c.txt test.txt |
On obtient les fichiers :
lignes_avec_toto.txt
lignes_avec_lulu.txt
Ces fichiers ne sont créés que si la chaine de correspondante a été trouvée.
Si une ligne comporte à la fois "toto" et "lulu", elle se retrouvera dans les deux fichiers.
Code :
- #!/usr/bin/awk -f
- NR == 1 {
- if (list == "" )
- exit 1;
- split (list, aList, "," );
- if (output == "" )
- output = "%i.out";
- }
- FNR == 1 {
- Out_f = output;
- if (FILENAME == "-" )
- gsub("%f", "stdin", Out_f);
- else
- gsub("%f", FILENAME, Out_f);
- }
- {
- for ( ind in aList ) {
- chaine = aList[ind];
- if ($0 ~ chaine) {
- Out_c = Out_f;
- gsub("%i", ind, Out_c);
- gsub("%c", chaine, Out_c);
- print $0 >> Out_c;
- }
- }
- }
|
---------------
Jean Pierre.