我有两个文件,每个文件都有一个文件名的md5校验和。两者都在单独的文件夹中。当我粘贴这些文件时,我正在寻找一种机制来执行以下操作:
如果$ column 3匹配$ column 6,则只打印出这两个并排:
filename1 = md5_checksum filename2 = md5_checksum
filename3 = md5_checksum filename4 = md5_checksum
filename5 = md5_checksum filename6 = md5_checksum
有希望的结果:
filename1 = md5_checksum filename6 = md5_checksum
想象(或测试)输出:
md5 directoryA/* > checkA ; md5 directoryB/* > checkB
paste checkA checkB
我想说:“看看checkA,filename1也在checkB中,虽然名字不同”(相同的校验和)
仅供参考,我曾尝试过:
awk > SIMILAR 'NR==FNR{ _[$4]=$4 next}{print $0, _[$4,$4] }' checkA checkB
($ 4是checkA和checkB两个文件的字段)
我认为这是我正在尝试做的最佳解释。衷心感谢您的回答如此之快:
# touch A/{fee,fie,foo,fum}
# touch B/{Bee,Bie,Boo,Bum}
# md5 B/* > checkB
# md5 A/* > checkA
# more checkA
MD5 (A/fee) = 2737b49252e2a4c0fe4c342e92b13285
MD5 (A/fie) = df8b712c4fe20a0df933819665770165
MD5 (A/foo) = 51ca4befb7cb5bd22766a33c73ffca5b
MD5 (A/fum) = a80b2c31cfc269e4aa2f48658b5349d9
# more checkB
# md5 B/*
MD5 (B/Bee) = b026324c6904b2a9cb4b88d6d61c81d1
MD5 (B/Bie) = 2737b49252e2a4c0fe4c342e92b13285
MD5 (B/Boo) = df8b712c4fe20a0df933819665770165
MD5 (B/Bum) = 51ca4befb7cb5bd22766a33c73ffca5b
如果我们在这里看到,A(A / foo)中的文件foo类似于B / Bum
我希望输出类似于:
A/foo B/Bum = 51ca4befb7cb5bd22766a33c73ffca5b
A/fee B/Bie = 2737b49252e2a4c0fe4c342e92b13285
答案 0 :(得分:4)
基于以下内容:
我想说:“看看checkA,filename1也在checkB中,虽然是 不同的名称“(相同的校验和)
如果您有两个包含文件名和校验和值的文件,那么您可以尝试这样的事情:
awk -F'=' 'NR==FNR{a[$2]=$1;next} $2 in a{print a[$2],$1,FS,$2}' checkA checkB
$ cat checkA
MD5 (A/fee) = 2737b49252e2a4c0fe4c342e92b13285
MD5 (A/fie) = df8b712c4fe20a0df933819665770165
MD5 (A/foo) = 51ca4befb7cb5bd22766a33c73ffca5b
MD5 (A/fum) = a80b2c31cfc269e4aa2f48658b5349d9
$ cat checkB
MD5 (B/Bee) = b026324c6904b2a9cb4b88d6d61c81d1
MD5 (B/Bie) = 2737b49252e2a4c0fe4c342e92b13285
MD5 (B/Boo) = df8b712c4fe20a0df933819665770165
MD5 (B/Bum) = 51ca4befb7cb5bd22766a33c73ffca5b
$ awk -F'=' 'NR==FNR {a[$2]=$1; next} $2 in a { print a[$2], $1, FS, $2}' checkA checkB
MD5 (A/fee) MD5 (B/Bie) = 2737b49252e2a4c0fe4c342e92b13285
MD5 (A/fie) MD5 (B/Boo) = df8b712c4fe20a0df933819665770165
MD5 (A/foo) MD5 (B/Bum) = 51ca4befb7cb5bd22766a33c73ffca5b
您可以使用gawk
功能使用gensub
来获得所需的输出。
$ gawk -F'=' 'NR==FNR {a[$2]=$1; next} $2 in a {print a[$2]=gensub(/.*\(([^)]+)\)/,"\\1","G",a[$2]), $1=gensub(/.*\(([^)]+)\)/,"\\1","G",$1), FS, $2}' checkA checkB
A/fee B/Bie = 2737b49252e2a4c0fe4c342e92b13285
A/fie B/Boo = df8b712c4fe20a0df933819665770165
A/foo B/Bum = 51ca4befb7cb5bd22766a33c73ffca5b
答案 1 :(得分:2)
join -o 1.2,2.2,1.3,1.4 -j 4 <(sort -k4,4 checkA) <(sort -k4,4 checkB)
(A/fee) (B/Bie) = 2737b49252e2a4c0fe4c342e92b13285
(A/foo) (B/Bum) = 51ca4befb7cb5bd22766a33c73ffca5b
(A/fie) (B/Boo) = df8b712c4fe20a0df933819665770165
如果您需要删除括号,请输入tr -d '()'
。