두 번째 파일(md5)의 각 줄을 해시하고 다음과 같이 첫 번째 파일과 한 줄씩 비교해야 합니다.
awk -F, 'FNR==NR {a[$1]; next}; !(md5($1) in a)' file1 file2 > file3
이 작업을 수행하려면 어떻게 해야 합니까 awk
?
파일 1:
5ca4136a060a2574a936cdf6881f733c
8068123f8384b305d133add978a3c12c
파일 2:
[email protected]
[email protected]
그리고 다음 예를 들어보세요:
5ca4136a060a2574a936cdf6881f733c = [email protected]
산출:
[email protected]
답변1
노력하다.
awk 'NR==FNR{seen[$0];next}{x="echo " $0 "|md5sum| cut -d- -f1|cut -f1 ";
x|getline l;close(x);md5[l]=$0}
END{for (M in md5) {chk=md5[M];gsub (" ", "", M);for (U in seen) if(M==U){print M, chk}}
}' file1 file2
입력하다:
==> file1 <==
5ca4136a060a2574a936cdf6881f733c
8068123f8384b305d133add978a3c12c
96653200bf87722738bc4abf7b3d5589
731a1f0a260d40c758aa18237de3fe6c
==> file2 <==
[email protected]
[email protected]
UNIX.stackexchange.com
STACKECHANGE.COM
출력(해시가 file1에 표시되는 이메일 주소):
731a1f0a260d40c758aa18237de3fe6c UNIX.stackexchange.com
96653200bf87722738bc4abf7b3d5589 [email protected]
사용하는 것은 매우 간단합니다 grep
.
grep -Ff file1 \
<(awk '{x="echo " $0 "|md5sum| cut -d- -f1"; x|getline l;print l, $0}' file2)
96653200bf87722738bc4abf7b3d5589 [email protected]
731a1f0a260d40c758aa18237de3fe6c UNIX.stackexchange.com
답변2
또는 join
에서 MD5 계산에 Perl을 사용 하거나 :bash
ksh93
zsh
$ join -v1 <( perl -MDigest::MD5 -ne 'chomp; printf("%s %s\n",Digest::MD5::md5_hex($_),$_)' text-file | sort ) \
<( sort md5-file )
5a09ab8a3f03376046a6e6eec0a0d511 [email protected]
join
파일에 있는 정렬된 MD5 해시를 이메일 주소 및 MD5 파일에 있는 해시와 연결하고 주소 파일에서 일치하지 않는 각 줄을 인쇄하라는 메시지가 표시됩니다.
해시 값도 인쇄되지만 다음을 사용하여 필터링할 수 있습니다 cut -d ' ' -f 2-
.
$ join -v1 <( perl -MDigest::MD5 -ne 'chomp; printf("%s %s\n",Digest::MD5::md5_hex($_),$_)' text-file | sort ) \
<( sort md5-file ) | cut -d ' ' -f 2-
[email protected]
표의 Perl 코드 출력
5ca4136a060a2574a936cdf6881f733c [email protected]
5a09ab8a3f03376046a6e6eec0a0d511 [email protected]
이것이 분류되어 주어지는 것입니다 join
. 기본적으로 조인은 공백으로 구분된 첫 번째 필드에서 발생합니다.