파일 목록이 주어지면 일부는 중복되고 일부는 중복되지 않습니다. 중복 항목의 체크섬만 표시합니다.

파일 목록이 주어지면 일부는 중복되고 일부는 중복되지 않습니다. 중복 항목의 체크섬만 표시합니다.

이를 수행하는 "쉬운" 방법이 있어야 하는데 그것이 무엇인지 모르겠습니다.

다음 형식(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

그리고 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 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

관련 정보