Con GNU awk (gawk ) potresti usare un BEGINFILE regola per leggere un nuovo modello ogni volta che il file di input cambia:
$ gawk 'BEGINFILE{getline pat < "search.patterns"} $0 ~ pat' file\ {1..3}.txt
home 3
dog 1
cat 4
Dovresti davvero controllare quel getline restituisce un nuovo modello, ad esempio
gawk '
BEGINFILE {
if((getline pat < "search.patterns") <= 0) {
print "Error reading pattern" > "/dev/stderr"
exit 1
}
}
$0 ~ pat
' file\ {1..3}.txt
Nota che awk i modelli sono estesi espressioni regolari, simili a quelle supportate da grep con il -E opzione.
Potresti ottenere lo stesso in awk non GNU superando search.patterns come primo file e utilizzando NR e FNR in modo appropriato per leggere i modelli in un array indicizzato o cercare il modello successivo nell'array.
Usando 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
Testandolo:
$ bash script.sh
home 3
dog 1
cat 4
Lo script salva i nomi dei file rilevanti nel files array, quindi procede alla lettura dei modelli dal search.patterns file. Per ogni modello, il primo file nel files elenco viene interrogato. Il file elaborato viene quindi eliminato dal files list (rendendo un nuovo primo nome file nell'elenco).
Se il numero di modelli supera il numero di file in files , ci saranno errori da grep .
Potresti usare paste per abbinare lo schema al file:
paste <(printf "%s\n" *.txt) search.patterns | while IFS=$'\t' read -r file pattern; do
grep -- "$pattern" "$file"
done
Suppongo che i nomi dei file non contengano tabulazioni.