열별로 파일에서 중복 찾기

열별로 파일에서 중복 찾기

세미콜론으로 구분되고 md5 해시로 정렬된 파일 경로와 해당 md5sum을 포함하는 입력 파일이 있습니다.

/media/LaCie/Images/recup2/recup_dir.1/f1295328.jpg;0080ececd3da8533f5d11e449cf73287
/media/LaCie/Documents/pics/897_FUJI/DSCF7042.JPG;0081cd15705f0c541995e13ad3e405b8
/media/LaCie/Documents/Pictures/124_FUJI/DSCF4729.JPG;00829232ae6b181654ee87ff32d161f8
/media/LaCie/Images/Trashes/501/IMG_0651.JPG;00833c74523d5361641af863f5d92387
/media/LaCie/Images/2009-09/IMG_0651.JPG;00833c74523d5361641af863f5d92387

해시를 기반으로 중복 항목을 찾아 인쇄하는 방법을 알고 싶습니다. 따라서 위 입력에 대한 출력은 다음과 같습니다.

/media/LaCie/Images/Trashes/501/IMG_0651.JPG;00833c74523d5361641af863f5d92387
/media/LaCie/Images/2009-09/IMG_0651.JPG;00833c74523d5361641af863f5d92387

시도했지만 uniq필드 구분 기호를 공백에서 세미콜론으로 변경하는 방법을 찾을 수 없습니다(일부 파일 경로에는 공백이 있을 수 있음).

답변1

경로에 공백이나 세미콜론이 포함되어 있지 않으면 세미콜론을 공백으로 변경하면 됩니다.

tr ';' ' ' | uniq -f 1 -d | tr ' ' ';'

경로에 공백이 있지만 탭이나 세미콜론이 없는 경우 기본적으로 동일한 작업을 수행할 수 있습니다. 단, 일시적으로 공백을 세미콜론으로 변환하고 탭을 필드 구분 기호로 사용합니다.

tr '; ' '\t;' | uniq -f 1 -d | tr '\t;' '; '

파일 이름에 대해 (개행 문자를 포함하지 않는 것 제외) 가정하고 싶지 않다면 awk가 작업을 수행하도록 할 수 있습니다.

awk -F ';' '{
    if ($NF == current) {
        if (first != "") print first;
        first = "";
        print;
    } else {
        first = $0;
        current = $NF;
    }
}'

답변2

가능한 해결책은 다음 방법을 사용할 수 있습니다 awk.

awk -F";" 'FNR == NR { x[$2]++; next; } { if ($2 in x && x[$2] > 1) print; }' file file

파일을 두 번 읽습니다. 첫 번째 패스에서는 반복 횟수를 세어 배열에 저장하고, 두 번째 패스에서는 카운터가 1보다 크면 줄을 인쇄합니다.

답변3

매우 간단합니다 perl(보너스 포인트의 경우 md5sum에도 이 작업을 수행할 수 있습니다).

그러나 다음과 같은 것 :

#!/usr/bin/env perl
use strict;
use warnings;

my %file_md5; 

while ( <> ){
   chomp; 
   my ( $filename, $hash ) = split /;/; 
   if ( $file_md5{$hash} ) { 
       print "$filename has the same md5sum as $file_md5{$hash}\n";
   }
   $file_md5{$hash} = $filename;
}

<>매직 파일 핸들을 참고하세요 . STDIN명령줄이나 파일을 통해 데이터를 스크립트로 전송합니다 ../myscript.pl file_containing_data

답변4

cut더 똑똑한 솔루션에는 md5sum을 출력하고 이를 실행하여 실제 고유 값을 잘라내기 uniq -c위한 카운트를 얻은 awk다음 나머지 md5sum을 for루프를 통해 전달하여 grep다음 값과 일치시키는 무차별적인 "원 라이너"가 있습니다. 원본 파일. 확실히 Gilles의 all-awk 솔루션만큼 우아하지는 않으며 입력 파일을 두 번 읽는 단점이 있습니다.

for md5 in $(cut -d\; -f2 inputfile-here | uniq -c | awk '$1 > 1 { print $2 }')
do 
  grep ";$md5\$" inputfile-here
  echo  ## gratuitous blank line to separate the duplicates
done

예제 입력 파일에 추가 중복 항목을 추가했습니다.

/media/LaCie/Images/recup2/recup_dir.1/f1295328.jpg;0080ececd3da8533f5d11e449cf73287
/media/LaCie/Documents/pics/897_FUJI/DSCF7042.JPG;0081cd15705f0c541995e13ad3e405b8
/media/LaCie/Documents/Pictures/124_FUJI/DSCF4729.JPG;00829232ae6b181654ee87ff32d161f8
/media/LaCie/Documents/Pictures/124_FUJI/DSCF4729-1.JPG;00829232ae6b181654ee87ff32d161f8
/media/LaCie/Documents/Pictures/124_FUJI/DSCF4729-2.JPG;00829232ae6b181654ee87ff32d161f8
/media/LaCie/Images/Trashes/501/IMG_0651.JPG;00833c74523d5361641af863f5d92387
/media/LaCie/Images/2009-09/IMG_0651.JPG;00833c74523d5361641af863f5d92387

위의 루프는 다음을 생성합니다.

/media/LaCie/Documents/Pictures/124_FUJI/DSCF4729.JPG;00829232ae6b181654ee87ff32d161f8
/media/LaCie/Documents/Pictures/124_FUJI/DSCF4729-1.JPG;00829232ae6b181654ee87ff32d161f8
/media/LaCie/Documents/Pictures/124_FUJI/DSCF4729-2.JPG;00829232ae6b181654ee87ff32d161f8

/media/LaCie/Images/Trashes/501/IMG_0651.JPG;00833c74523d5361641af863f5d92387
/media/LaCie/Images/2009-09/IMG_0651.JPG;00833c74523d5361641af863f5d92387

관련 정보