これを行うための「簡単な」方法が必要ですが、それが何であるかわかりません。
次の形式(md5の後にファイル名がオーム)の行を含むプレーンテキスト「file.txt」があるとします。
5ee434a2ebcf4c3c98ee07e9c1efddc0 foo.txt
365a6d8b18cab348d92db610dfc46264 bar.txt
ae42d992bf622bdc425d37b04ec9c2d5 mini.txt
b8e9ff5502d5dbe38b3fd5e3363caacf tyrion.txt
5ee434a2ebcf4c3c98ee07e9c1efddc0 imac.txt
542ed609dfc4d0cae44c4b7be6d66382 mba.txt
310ee92ebc69ed79c1837fc53983b7f8 mini luoma.txt
542ed609dfc4d0cae44c4b7be6d66382 tyrion final.txt
ソートして出力したいですfile.txt
。
- md5 sumがファイルが重複していることを示す場合にのみ行を表示
- 重複した各「グループ」の間に空白行を置きます。
したがって、次のようになります。
542ed609dfc4d0cae44c4b7be6d66382 mba.txt
542ed609dfc4d0cae44c4b7be6d66382 tyrion final.txt
5ee434a2ebcf4c3c98ee07e9c1efddc0 foo.txt
5ee434a2ebcf4c3c98ee07e9c1efddc0 imac.txt
(実際には2個または10個以上が重複することがあります。)
ruby
この問題を解決できる専門家や専門家があると思いますpython
が、私はほとんどすべての実用的な解決策に開いています。
答え1
$ sort file.txt \
| grep -f <(cut -d' ' -f1 file.txt | sort | uniq -d) \
| awk 'last && last != $1 { printf "\n" }; { last=$1 ; print}'
542ed609dfc4d0cae44c4b7be6d66382 mba.txt
542ed609dfc4d0cae44c4b7be6d66382 tyrion final.txt
5ee434a2ebcf4c3c98ee07e9c1efddc0 foo.txt
5ee434a2ebcf4c3c98ee07e9c1efddc0 imac.txt
(awkの提案をいただいた「cas」に感謝します。)
(バグを発見してくれた「steeldriver」に感謝します。)
答え2
そしてsort
uniq
sort file.txt | uniq -w 32 --all-repeated=separate
542ed609dfc4d0cae44c4b7be6d66382 mba.txt
542ed609dfc4d0cae44c4b7be6d66382 tyrion final.txt
5ee434a2ebcf4c3c98ee07e9c1efddc0 foo.txt
5ee434a2ebcf4c3c98ee07e9c1efddc0 imac.txt
-w 32
MD5ハッシュに比較を制限しますuniq
(したがって、同じMD5を持つ同じ行を考慮します)。--all-repeated=separate
空行でグループを区切っている間に重複項目を表示するように指示します。
答え3
Perl配列ハッシュの使用:
$ perl -alne '
push @{ $h{$F[0]} }, $_
}{
for $k (sort keys %h) {
@a = @{ $h{$k} };
print join "\n", @a, "" if $#a > 0
}
' file.txt
542ed609dfc4d0cae44c4b7be6d66382 mba.txt
542ed609dfc4d0cae44c4b7be6d66382 tyrion final.txt
5ee434a2ebcf4c3c98ee07e9c1efddc0 foo.txt
5ee434a2ebcf4c3c98ee07e9c1efddc0 imac.txt
最後のレコードの後に空白行が印刷されます。オプションですsort
。
GNU awkでも同様のことがあります:
gawk '
{a[$1][NR] = $0}
END {
for(k in a){
if(length(a[k]) > 1) {
for(v in a[k]) print a[k][v];
print "";
}
}
}
' file.txt