2番目のファイル(md5)の各行をハッシュし、次のように最初のファイルと1行ずつ比較する必要があります。
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に表示されるEメールアドレス):
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
。デフォルトでは、結合はスペースで区切られた最初のフィールドで発生します。