Con GNU awk (gawk ) podrías usar un BEGINFILE regla para leer un nuevo patrón cada vez que cambia el archivo de entrada:
$ gawk 'BEGINFILE{getline pat < "search.patterns"} $0 ~ pat' file\ {1..3}.txt
home 3
dog 1
cat 4
Realmente deberías comprobar que getline devuelve un nuevo patrón, por ejemplo
gawk '
BEGINFILE {
if((getline pat < "search.patterns") <= 0) {
print "Error reading pattern" > "/dev/stderr"
exit 1
}
}
$0 ~ pat
' file\ {1..3}.txt
Tenga en cuenta que awk los patrones son extendidos expresiones regulares, similares a las admitidas por grep con el -E opción.
Podría lograr lo mismo en no GNU awk pasando search.patterns como primer archivo y usando NR y FNR adecuadamente para leer los patrones en una matriz indexada o buscar el siguiente patrón en la matriz.
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
Probándolo:
$ bash script.sh
home 3
dog 1
cat 4
El script guarda los nombres de archivo relevantes en el files matriz, y luego procede a leer patrones del search.patterns expediente. Para cada patrón, el primer archivo en el files se consulta la lista. Luego, el archivo procesado se elimina del files list (lo que produce un nuevo primer nombre de archivo en la lista).
Si el número de patrones excede el número de archivos en files , habrá errores de grep .
Podrías usar paste para hacer coincidir el patrón con el archivo:
paste <(printf "%s\n" *.txt) search.patterns | while IFS=$'\t' read -r file pattern; do
grep -- "$pattern" "$file"
done
Supongo que los nombres de los archivos no contienen tabulaciones.