web-dev-qa-db-ja.com

重複のないGrep?

同じフォルダー内の別々のファイルにテキストファイルの複数のリビジョンがあります。

どうすればgrep同じテキストを持つ行の重複をリストせずに、そのフォルダ内のすべてのファイルを使用できますか?

1
neverMind9

いかがですか

cat * | grep exampletext | sort -u
2
RudiC

私が使う:

grep -h test files* | puniq

puniqは:Perl -ne '$seen{$_}++ or print;'

これはsort -uに似ていますが、入力をソートせず、実行中に出力を提供します。

ファイル名が必要で、各ファイルの重複行を避けたい場合:

parallel --tag --lb 'grep string {} | puniq' ::: files*

ファイル名が必要で、どのファイルからの重複行も必要ない場合(ファイル名にタブ(\ t)を含めることはできません):

parallel --tag --lb grep string {} ::: files* |
  Perl -ne '/^[^\t]+(.*)/ and $seen{$1}++ or print;'
1
Ole Tange

多分このようなものはあなたが想像するものに近いかもしれません(gnu awkで動作します):

cat file1
1
2
3
22

cat file11
1
2
3
8
9

cat file111
1
2
3
5
6

awk '{seen[$0]++;fname[$0]=FILENAME};END{for (k in seen) {if (seen[k]==1) print fname[k],":",k}}' file1*
file111 : 5
file111 : 6
file11 : 8
file11 : 9
file1 : 22
1
George Vasiliou

結果をソートにパイプして、重複をフィルタリングします。

grep -re pattern files and dirs ... | sort -ut: -k2

-t:および-k2 sortのオプションは、ソートとマージを行うときにファイル名を無視するようにします。

または、ファイル名が不要な場合は、次のようにします。

grep -hre pattern files and dirs ... | sort -u 
1
Jon Reinhold