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.