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

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

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

次の形式(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」に感謝します。)

答え2

そしてsortuniq

sort file.txt | uniq -w 32 --all-repeated=separate
542ed609dfc4d0cae44c4b7be6d66382 mba.txt
542ed609dfc4d0cae44c4b7be6d66382 tyrion final.txt

5ee434a2ebcf4c3c98ee07e9c1efddc0 foo.txt
5ee434a2ebcf4c3c98ee07e9c1efddc0 imac.txt
  • -w 32MD5ハッシュに比較を制限します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

関連情報