同じフォルダー内の別々のファイルにテキストファイルの複数のリビジョンがあります。
どうすればgrep
同じテキストを持つ行の重複をリストせずに、そのフォルダ内のすべてのファイルを使用できますか?
いかがですか
cat * | grep exampletext | sort -u
私が使う:
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;'
多分このようなものはあなたが想像するものに近いかもしれません(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
結果をソートにパイプして、重複をフィルタリングします。
grep -re pattern files and dirs ... | sort -ut: -k2
-t:
および-k2
sortのオプションは、ソートとマージを行うときにファイル名を無視するようにします。
または、ファイル名が不要な場合は、次のようにします。
grep -hre pattern files and dirs ... | sort -u