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.