一致するパターンと一緒にファイル名を印刷したいのですが、ファイルで複数のパターン一致が発生しても一度だけ印刷したいと思います。
たとえば、パターンのリストがあります。list_of_patterns.txt
ファイルを見つけるために必要なディレクトリはです/path/to/files/*
。
パターンリスト.txt:
A
B
C
D
E
/パス/ターゲット/ファイル/
/file1
/file2
/file3
/file1
次のようにパターンがA
複数回表示されるとします。
/ファイル1:
A
4234234
A
435435435
353535
A
(複数のパターンが一致する他のファイルにも同様です。)
このgrepコマンドを実行しましたが、パターンが一致するたびにファイル名が印刷されます。
grep -Hof list_of_patterns.txt /path/to/files/*
出力:
/file1:A
/file1:A
/file1:A
/file2:B
/file2:B
/file3:C
/file3:B
... and so on.
私はgrepコマンドの後にパイプを介してsortがこれを行うことができることを知っていますが、grep -Hof list_of_patterns.txt /path/to/files/* | sort -u
grepが完了したときにのみ実行されます。現実の世界には、list_of_patterns.txt
私の中に何百ものパターンがあります。時には作業を完了するのに1時間かかります。
このプロセスをスピードアップするより良い方法はありますか?
修正する:一部のファイルにはパターンが100回以上一致しました。たとえば、/file4
このパターンはA
900回発生します。grep
これは、ファイル名とともにパターン一致がすべて印刷されるため、完了に1時間かかります。
たとえば、出力は次のようになります。
/file4:A
/file4:A
/file4:A
/file4:A
/file4:A
/file4:A
/file4:A
/file4:A
... and so on til' it reach 900 occurrences.
一度だけ印刷してみたいです。
たとえば、希望の出力は次のようになります。
/file4:A
/file1:A
/file2:B
/file3:A
/file4:B
答え1
このプロセスをスピードアップするより良い方法はありますか?
はい、その名前はGNUですparallel
:
parallel -j0 -k "grep -Hof list_of_patterns.txt {} | sort -u" ::: /path/to/files/*
j N
- ポジション数。N
ジョブを並列に実行します。0
できるだけ意味を与えます。k
(--keep-order
) - 出力順序を入力順序と同じに保つ::: arguments
arguments
- stdin(標準入力)の代わりにコマンドラインを入力ソースとして使用する