Avec GNU awk (gawk
) vous pouvez utiliser un BEGINFILE
règle pour lire un nouveau modèle à chaque fois que le fichier d'entrée change :
$ gawk 'BEGINFILE{getline pat < "search.patterns"} $0 ~ pat' file\ {1..3}.txt
home 3
dog 1
cat 4
Vous devriez vraiment vérifier que getline
renvoie un nouveau motif, par exemple
gawk '
BEGINFILE {
if((getline pat < "search.patterns") <= 0) {
print "Error reading pattern" > "/dev/stderr"
exit 1
}
}
$0 ~ pat
' file\ {1..3}.txt
Notez que awk
les motifs sont étendus expressions régulières, similaires à celles prises en charge par grep
avec le -E
option.
Vous pourriez obtenir la même chose en non-GNU awk
en passant search.patterns
comme premier fichier et en utilisant NR
et FNR
de manière appropriée soit pour lire les motifs dans un tableau indexé, soit pour rechercher le motif suivant dans le tableau.
Utilisation de bash
:
#!/bin/bash
files=( 'file 1.txt' 'file 2.txt' 'file 3.txt' )
while IFS= read -r pattern; do
grep -e "$pattern" "${files[0]}"
files=( "${files[@]:1}" )
done <search.patterns
Le tester :
$ bash script.sh
home 3
dog 1
cat 4
Le script enregistre les noms de fichiers pertinents dans le files
tableau, puis procède à la lecture des motifs à partir du search.patterns
dossier. Pour chaque motif, le premier fichier dans le files
liste est interrogée. Le fichier traité est alors supprimé du files
list (produisant un nouveau premier nom de fichier dans la liste).
Si le nombre de modèles dépasse le nombre de fichiers dans files
, il y aura des erreurs de grep
.
Vous pouvez utiliser paste
pour faire correspondre le modèle avec le fichier :
paste <(printf "%s\n" *.txt) search.patterns | while IFS=$'\t' read -r file pattern; do
grep -- "$pattern" "$file"
done
Je suppose que les noms de fichiers ne contiennent pas d'onglets.