S GNU awk (gawk
) můžete použít BEGINFILE
pravidlo pro čtení nového vzoru pokaždé, když se vstupní soubor změní:
$ gawk 'BEGINFILE{getline pat < "search.patterns"} $0 ~ pat' file\ {1..3}.txt
home 3
dog 1
cat 4
Měli byste opravdu zkontrolovat, že getline
vrátí nový vzor, například
gawk '
BEGINFILE {
if((getline pat < "search.patterns") <= 0) {
print "Error reading pattern" > "/dev/stderr"
exit 1
}
}
$0 ~ pat
' file\ {1..3}.txt
Všimněte si, že awk
vzory jsou rozšířené regulární výrazy, podobné těm, které podporuje grep
s -E
možnost.
Totéž můžete dosáhnout v ne-GNU awk
předáním search.patterns
jako první soubor a pomocí NR
a FNR
vhodně buď načíst vzory do indexovaného pole, nebo vyhledat další vzor v poli.
Pomocí 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
Testování:
$ bash script.sh
home 3
dog 1
cat 4
Skript uloží příslušné názvy souborů do files
pole a poté pokračuje ve čtení vzorů z search.patterns
soubor. Pro každý vzor první soubor v files
seznam je dotazován. Zpracovaný soubor je poté odstraněn z files
seznam (poskytne nový první název souboru v seznamu).
Pokud počet vzorů překročí počet souborů v files
, budou chyby od grep
.
Můžete použít paste
pro shodu vzoru se souborem:
paste <(printf "%s\n" *.txt) search.patterns | while IFS=$'\t' read -r file pattern; do
grep -- "$pattern" "$file"
done
Předpokládám, že názvy souborů neobsahují tabulátory.