1

次のコードは機能しますが、非常に低速です。

#!/bin/bash
for f in *.xml; do
  for r in $(cat ../reports.txt); do
    grep -q "$r" $f

    if [ $? -eq 0 ]; then
      echo "$r,$f"
    fi
  done
done

これは、次を使用して高速化できます。

for f in *.xml; do
  grep -lif ../reports.txt $f
done

reports.txtただし、これには、ファイル()と一致することが判明した行は表示されません$f

reports.txt各ファイルで見つかった一致する行を、1つ以上一致したファイルの名前とともにどのように表示しますreports.txtか?

たとえば、次がreports.txt含まれている場合:

aardvark
aardwolf
anteater

そして、ファイルの1つ(たとえば、story.txt)には次のものが含まれています。

This is a story about an aardvark and an aardwolf.

次に、次の出力を生成しようとしています。

story.txt,aardvark
story.txt,aardwolf

それが役立つ場合、の行reports.txtは正規表現ではありません。プレーンテキストの文字列です。

何か案は?

4

1 に答える 1

3

これを見てください、それはあなたの要件に合っていますか?

kent$  head report.txt story.txt
==> report.txt <==
aardvark
aardwolf
anteater

==> story.txt <==
is a story about an aardvark and an aardwolf.

kent$  grep -Hof report.txt story.txt
story.txt:aardvark
story.txt:aardwolf

テストはgrepで行われました:

kent$  grep --version|head -1
grep (GNU grep) 2.14
于 2013-01-29T00:17:54.363 に答える