2010-05-12 5 views
4

Dans mon script shell, j'essaie de rechercher à l'aide des termes trouvés dans un fichier source $ par rapport au même fichier $ target, encore et encore.Optimisation de grep (ou utilisation d'AWK) dans un script shell

Mon sourcefile $ est formaté en tant que tel:

pattern1 
pattern2 
etc... 

La boucle inefficace, je dois chercher avec est:

for line in $(< $sourcefile);do 
    fgrep $line $targetfile | fgrep "RID" >> $outputfile 
done 

Je comprends qu'il serait possible d'améliorer ce soit par le chargement de l'ensemble $ targetfile en mémoire, ou peut-être en utilisant AWK?

Merci

+0

Ne pouvez-vous pas simplement joindre le fichier source et egrep pour (pattern1 | pattern2 ...)? –

+0

Bonne idée ... aurait besoin d'egrep pour des options comme 4000 ... mais les modèles varieraient en fonction du nombre de lignes dans le fichier source. – Ode

Répondre

7

Ai-je raté quelque chose, ou pourquoi pas juste fgrep -f "$sourcefile" "$targetfile"?

+0

WOW! C'était plus rapide que les deux autres. Les résultats semblent corrects, aussi. Je veux dire, la foudre est rapide. Impressionnant! – Ode

2

Une solution sed:

sed 's/\(.*\)/\/\1\/p/' $sourcefile | sed -nf - $targetfile

Ceci transforme chaque ligne de $ sourcefile à une commande de correspondance de motif sed:

matchstring

à

/matchstring/p

Vous auriez besoin d'échapper à des caractères spéciaux pour faire cela, cependant robuste,.

+0

Merci! J'essaie maintenant. Déjà semble plus rapide que l'utilisation de grep, bien que le fichier source a environ 4000 lignes et recherche un fichier cible de 300 meg, donc je pense que cela prendra encore un peu de temps. Voyons ce qui se passe. – Ode

2

Utiliser awk pour lire dans le sourcefile puis la recherche dans targetfile (non testé):

nawk ' 
    NR == FNR {patterns[$0]++; next} 
    /RID/ { 
     for (pattern in patterns) { 
      # since fgrep considers patterns as strings not regular expressions, 
      # use string lookup and not pattern matching ("~" operator). 
      if (index($0, pattern) > 0) { 
       print 
       break 
      } 
     } 
    } 
' "$sourcefile" "$targetfile" > "$outputfile" 

Est-ce également avec gawk.

+0

Merci pour la suggestion, va également essayer. – Ode

+0

Était assez rapide mais le fgrep -f comme suggéré était plus ce dont j'avais besoin. – Ode

Questions connexes