awk粘贴比较打印

标签 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

希望的结果:

filename1 = md5_checksum filename6 = md5_checksum

想象一下(或测试)输出:

md5 directoryA/* > checkA ; md5 directoryB/* > checkB
paste checkA checkB

我想说:“查看 checkA,文件名 1 也在 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 中的文件 foo (A/foo) 类似于 B/Bum

我希望输出是这样的:

A/foo B/Bum = 51ca4befb7cb5bd22766a33c73ffca5b
A/fee B/Bie = 2737b49252e2a4c0fe4c342e92b13285

最佳答案

基于以下内容:

I'd like to say: "Look in checkA, filename1 is also in checkB albeit a different name" (same checksum)

如果您有两个具有文件名和校验和值的文件,那么您可以尝试这样的操作:

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

关于awk粘贴比较打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16968082/

相关文章:

regex - 使用 sed 和/或 awk,如何对文件中的所有文本进行 sed 交换,直到我看到与正则表达式匹配的行?

compare - 使用模式比较工具处理模式重构

javascript - 为什么 (0 < 5 < 3) 返回 true?

python - 检查是否有与输入图像完全相同的图像

JavaScript 粘贴和多个剪贴板级别

regex - awk 和等价类

regex - 如何从 bash 中的字符串中提取值?

linux - 将目录路径作为输入并显示所有大小超过限制的文件的 awk 脚本?

vim - 在 vim 中粘贴文本。繁琐的操作?

javascript - 使用 JavaScript 清理 Microsoft Word 粘贴的文本