2014-07-01 3 views
0

Je suis sur le point d'apprendre quelques scripts shell et j'ai vraiment du mal à obtenir ce que je veux avec les résultats de frgep. Est-il possible de rediriger les résultats de fgrep vers des fichiers afin que chaque motif soit sauvegardé dans des fichiers contenant uniquement les lignes appartenant à ces patterns.fgrep: Tri des résultats dans les fichiers

Mon fichier d'entrée ressemble à:

@ABC;123;bc=Pattern_1; 
@DEF;456;bc=Pattern_1; 
@ZYR;678;bc=Pattern_2; 
@OPZ;888;bc=Pattern_2; 

Mon dossier J'utilise pour la recherche de modèle ressemble:

Pattern.txt: 
Pattern_1 
Pattern_2 
Pattern_3 

Maintenant, je fais fgrep (je dois aussi les 3 lignes suivantes de chaque entrée):

fgrep -A 3 -f Pattern.txt huge_file 

Cela fonctionne parfaitement. Mais je veux que les résultats soient triés dans les fichiers. Ce qui signifie que chaque ligne qui contient Pattern_1 doit être dans un fichier de résultats, par ex. Pattern_1.txt. Les autres motifs de la même manière (les lignes pattern_2 devraient se retrouver dans pattern_2.txt et ainsi de suite).

Pattern_1.txt: 
ABC Pattern_1 123 
DEF Pattern_1 456 
... 

Pattern_2.txt: 
ZYR Pattern_2 678 
OPZ Pattern_2 888 
... 

En principe, je pourrais une boucle pour chaque modèle et faire un fgrep chaque fois et enregistrer les résultats dans les fichiers. Mais y a-t-il une façon plus élégante de canaliser les résultats du fgrep à la volée dans de nombreux fichiers en fonction du motif. Cela est d'autant plus important que le fichier contenant le pattern est énorme et qu'il faut du temps pour lancer fgrep. Est-ce possible? J'ai joué avec des clauses if après piping mais je ne suis pas capable d'obtenir la bonne syntaxe pour faire ce que je veux faire. Est-ce possible?

Merci. Carsten

+0

Pouvez-vous donner un exemple du fichier que vous cherchez dans? –

+0

Merci beaucoup! J'ai mis à jour la question. Le format d'entrée n'est pas tabulé mais séparé par des tabulations et au début de chaque ligne il y a un @. – user2251977

Répondre

0

Heres une doublure awk one que je pense fait ce que vous exigez.

awk 'NR==FNR{a[$1]}{for(i in a){if(i==$2)print $0 >> $2}}' Pattern.txt hugefile 

Cela devrait fonctionner pour les spécifications mises à jour, n'a pas eu le temps de le rendre agréable.

awk -F";" 'NR==FNR{a[$0]}{for(i in a){if(i==substr($3,4))print substr($1,2),substr($3,4),$2 >> substr($3,4)}}' Pattern.txt hugefile 

légèrement réduit et

awk -F";" 'NR==FNR{a[$0]}{x=substr($3,4);for(i in a){if(i==x)print substr($1,2),x,$2 >> x}}' Pattern.txt hugefile 
+0

Merci! C'est très très proche de ce que je cherche. Comme je n'ai pas de fichier d'entrée tabulé (voir la question modifiée et mise à jour), la clause if est un problème (je pense ... - mais peut-être que je me trompe). – user2251977

+0

sont les lignes dans le fichier d'entrée toujours la même longueur? –

+0

Malheureusement, pas. – user2251977

Questions connexes