他のtxtファイルのリストから検索したいパターンのリストを含むファイル(search.patterns)があります。
検索モード
home
dog
cat
ファイル1.txt
home 3
tiger 4
lion 1
ファイル2.txt
dolphin 6
jaguar 3
dog 1
ファイル3.txt
donkey 3
cat 4
horse 1
だから、file1でパターンファイルの最初の行、file2から2行目、file3から3行目を検索したいと思います。
出力:
home 3
dog 1
cat 4
私は次のようなコードを書いた。
for f in *.txt;
do
while IFS= read -r LINE;
do grep -f "$LINE" "$f" > "$f.out"
done < search.patterns
done
しかし、出力ファイルは空です。
どんな助けでも大変感謝します。ありがとうございます。
ベストアンサー1
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
with オプション-E
がサポートする式に似た正規表現です。
最初のファイルに渡して適切に使用して、パターンをインデックス配列として読み取るか、配列内の次のパターンを見つけることで、awk
非GNUでも同じ効果を得ることができます。search.patterns
NR
FNR