grep パターンとファイルのペア

grep パターンとファイルのペア

他の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パターンは拡大するgrepwith オプション-Eがサポートする式に似た正規表現です。

最初のファイルに渡して適切に使用して、パターンをインデックス配列として読み取るか、配列内の次のパターンを見つけることで、awk非GNUでも同じ効果を得ることができます。search.patternsNRFNR

おすすめ記事