1つのファイル名に一致するパターンのみを印刷するにはどうすればよいですか?

1つのファイル名に一致するパターンのみを印刷するにはどうすればよいですか?

一致するパターンと一緒にファイル名を印刷したいのですが、ファイルで複数のパターン一致が発生しても一度だけ印刷したいと思います。

たとえば、パターンのリストがあります。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 -ugrepが完了したときにのみ実行されます。現実の世界には、list_of_patterns.txt私の中に何百ものパターンがあります。時には作業を完了するのに1時間かかります。

このプロセスをスピードアップするより良い方法はありますか?

修正する:一部のファイルにはパターンが100回以上一致しました。たとえば、/file4このパターンはA900回発生します。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) - 出力順序を入力順序と同じに保つ
  • ::: argumentsarguments- stdin(標準入力)の代わりにコマンドラインを入力ソースとして使用する

関連情報