awk粘贴比较打印

awk粘贴比较打印,awk,compare,paste,Awk,Compare,Paste,我有两个文件,每个文件都有一个文件名的md5校验和。两者都在单独的文件夹中。粘贴这些文件时,我正在寻找一种机制来执行以下操作: 如果$column 3与$column 6匹配,则单独并排打印这两个: filename1 = md5_checksum filename2 = md5_checksum filename3 = md5_checksum filename4 = md5_checksum filename5 = md5_checksum filename6 = md5_checksum

我有两个文件,每个文件都有一个文件名的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
(文件checkA和checkB上的字段均为$4)


这是我所理解的关于我所尝试的最好的解释。衷心感谢您如此迅速地回答:

# 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

基于以下几点:

我想说:“在checkA中查找,filename1也在checkB中,尽管是a 不同名称“(相同校验和)

如果有两个文件的文件名和校验和值,则可以尝试以下方法:

awk -F'=' 'NR==FNR{a[$2]=$1;next} $2 in a{print a[$2],$1,FS,$2}' checkA checkB
测试: 更新: 通过使用
gensub
功能,您可以使用
gawk
获得所需的输出

$ 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

如果您需要去掉括号,请插入
tr-d'()'

您的示例输出意味着您希望对照所有其他行扫描所有行(通过定位3 v 6),这是您的意图吗?阅读有关
(f)grep-f-f listFile infle>outFile的内容
祝你好运。谢谢,但不是真的。。。有些文件的名称不同,例如,checkA可能有一个名为foo的文件,md5校验和为5,而checkB上的文件可能是name fee(但相同的md5校验和),请考虑在测试数据中输入实际数字,而不是
md5\u校验和
。很难说出你的意图。感谢您提供的附加信息和代码示例。祝你好运。如果有一个包含两个输入文件的小示例,以及它们最终的样子,可能会有所帮助。这非常有效,谢谢Jaypal。我对输出进行了快速修改,使其通过您的解决方案工作。@munkeyoto太棒了!我更新了解决方案以匹配您的输入文件。
$ 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
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