ファイルのリストが与えられると、一部は重複し、一部は重複しません。重複項目のチェックサムのみを表示します。

ファイルのリストが与えられると、一部は重複し、一部は重複しません。重複項目のチェックサムのみを表示します。

これを行うための「簡単な」方法が必要ですが、それが何であるかわかりません。

次の形式(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

  1. md5 sumがファイルが重複していることを示す場合にのみ行を表示
  2. 重複した各「グループ」の間に空白行を置きます。

したがって、次のようになります。

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」に感謝します。)

おすすめ記事