GNU awk を使用 (gawk
) BEGINFILE
を使用できます 入力ファイルが変更されるたびに新しいパターンを読み取るルール:
$ gawk 'BEGINFILE{getline pat < "search.patterns"} $0 ~ pat' file\ {1..3}.txt
home 3
dog 1
cat 4
getline
を本当に確認する必要があります たとえば、新しいパターンを返します
gawk '
BEGINFILE {
if((getline pat < "search.patterns") <= 0) {
print "Error reading pattern" > "/dev/stderr"
exit 1
}
}
$0 ~ pat
' file\ {1..3}.txt
awk
に注意してください パターンは拡張されます grep
でサポートされているものと同様の正規表現 -E
で オプション。
非 GNU awk
でも同じことができます search.patterns
を渡すことによって 最初のファイルとして NR
を使用 そして FNR
パターンをインデックス付き配列に読み込むか、配列内の次のパターンを検索します。
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
テスト:
$ bash script.sh
home 3
dog 1
cat 4
スクリプトは、関連するファイル名を files
に保存します 配列、search.patterns
からのパターンの読み取りに進みます ファイル。パターンごとに、files
の最初のファイル リストが照会されます。処理されたファイルは files
から削除されます リスト (リスト内の新しい最初のファイル名を生成します)。
パターン数が files
のファイル数を超えた場合 、grep
からエラーが発生します .
paste
を使用できます パターンをファイルと一致させるには:
paste <(printf "%s\n" *.txt) search.patterns | while IFS=$'\t' read -r file pattern; do
grep -- "$pattern" "$file"
done
ファイル名にタブが含まれていないと仮定しています。