各行には文字列ファイルがあります。
たとえば、
AAAAA
BBBBB
CCCCC
etc
特定のディレクトリの一連のファイルに各文字列が存在するかどうかを1つずつ確認したいと思います。
私は何ができるかを知っています。grep -f filename
すぐに検索をすることです。しかし、私に必要なのは、より具体的な結果を得るために1行に1つ以上の正規表現を使用することです。文字列を含むファイルはサイズが大きく頻繁に変更されるため、式を追加するために各行を変更することは意味がありません。
したがって、私にとって必要なのは、grep -f filename
ファイルの各行を繰り返し(そしてファイルからそれらをgrepしながら)、より多くの条件を追加することです。例えばAAAAA
そして [0-9]{1,3}$
同じ行にも存在します。
答え1
grep
パイプラインを使用して、このステップを段階的に実行できます。
grep -f your_file list_of_files|grep -E extra_condition
または
while read line; do
grep -E -e "$line" -e extra_condition list_of_files
done < your_file
どちらの場合も、-E
次の形式(数値数量子を含む)のパターンを使用するには[0-9]{1,3}$
切り替える必要があります。
編集する
Drav Sloanのコメントのおかげで、私たちは2番目のバージョン(loop while
)を次のように単純化することができます。
grep -E -e "extra_condition" -f your_file list_of_files
しかし、実際にはパターンを探します。またはもう一つはパターンではありませんそしてもう一つ。最初の形式に固執する必要があります。
答え2
awk
andを使用する別の方法を示すためのものですgrep
。
サンプル
$ cat patterns.txt
AAAA
BBBB
CCCC
DDDD
EEEE
$ cat sample.txt
AAAA 1
AAAA 2
AAAA 3
AAAA 4
DDDD 1
DDDD 2
YYYY 1
YYYY 2
はい
奇妙な#1:
$ awk 'FNR==NR{a[$0]; next}($1 in a)' patterns.txt sample.txt | grep -E "[0-9]{1,3}$"
AAAA 1
AAAA 2
AAAA 3
AAAA 4
DDDD 1
DDDD 2
調整が必要になる可能性が高いですが、調整方法の入力を求められます。
奇妙な#2:
$ awk 'FNR==NR{a[$0];next};{for (i in a){if (match($0,i)) print}}' patterns.txt sample.txt | grep -E "[0-9]{1,3}$"
AAAA 1
AAAA 2
AAAA 3
AAAA 4
DDDD 1
DDDD 2
これはより柔軟で、サンプルデータ行内のどこからでもパターン文字列を処理できます。