Mit GNU awk (gawk
) könnten Sie einen BEGINFILE
verwenden Regel, bei jeder Änderung der Eingabedatei ein neues Muster zu lesen:
$ gawk 'BEGINFILE{getline pat < "search.patterns"} $0 ~ pat' file\ {1..3}.txt
home 3
dog 1
cat 4
Das sollten Sie unbedingt überprüfen getline
gibt ein neues Muster zurück, zum Beispiel
gawk '
BEGINFILE {
if((getline pat < "search.patterns") <= 0) {
print "Error reading pattern" > "/dev/stderr"
exit 1
}
}
$0 ~ pat
' file\ {1..3}.txt
Beachten Sie, dass awk
Muster werden erweitert reguläre Ausdrücke, ähnlich denen, die von grep
unterstützt werden mit dem -E
Option.
Sie könnten dasselbe in Nicht-GNU awk
erreichen indem Sie search.patterns
übergeben als erste Datei und mit NR
und FNR
entsprechend, um entweder die Muster in ein indiziertes Array einzulesen oder das nächste Muster im Array nachzuschlagen.
Mit 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
Testen:
$ bash script.sh
home 3
dog 1
cat 4
Das Skript speichert die entsprechenden Dateinamen im files
-Array und fährt dann fort, Muster aus search.patterns
zu lesen Datei. Für jedes Muster die erste Datei im files
Liste abgefragt. Die verarbeitete Datei wird dann aus dem files
gelöscht list (ergibt einen neuen ersten Dateinamen in der Liste).
Wenn die Anzahl der Muster die Anzahl der Dateien in files
überschreitet , treten Fehler ab grep
auf .
Sie könnten paste
verwenden um das Muster mit der Datei abzugleichen:
paste <(printf "%s\n" *.txt) search.patterns | while IFS=$'\t' read -r file pattern; do
grep -- "$pattern" "$file"
done
Ich gehe davon aus, dass die Dateinamen keine Tabulatoren enthalten.