我有3个md5总和的文件,我想比较一下。我在考虑最初对文件进行排序并逐行比较。但是,一个或多个文件中偶尔会丢失条目。幸运的是,包名称包含在同一行的md5总和中,如下所示:
FILE 1:
pkg1 md5sum1
pkg2 md5sum2 (this one might not be located in FILE 2, but is in FILE 3, as an example)
etc....
如何比较所有文件中存在的软件包的md5sums(打印“匹配”或“不匹配”),如果在所有文件中找不到,则输出“missing”?
修改
示例输出可以是:
pkg1 w14r1w4r w14r1w4r w14r1w4r match
pkg2 t432t432 t432t432 t432t432 match
pkg3 r321 asdf asdf mismatch
pkg4 12341234 mismatch
第一列是所有包名称的列表 第二个,第三个和第四个显示文件1-3的md5总和 仅当所有3个相同时,最后一列才显示匹配
EDIT2:
如果第一个输入文件有一个额外的列(第3个),我们可以将它添加到输出文件吗?
pkg1 md5sum1 string1
pkg2 md5sum2 string2
输出将是
pkg1 string1 w14r1w4r w14r1w4r w14r1w4r match
pkg2 string2 t432t432 t432t432 t432t432 match
pkg3 string3 r321 asdf asdf mismatch
pkg4 string4 12341234 mismatch
答案 0 :(得分:2)
如果每个文件中没有重复的包名称,您可以运行:
awk '{a[$1 FS $2]++}END{for (i in a) print i, a[i]==3?"match":"mismatch"}' file*
这是测试结果。
$ cat file1
pkg1 md5sum1
pkg2 md5sum2
$ cat file2
pkg1 md5sum1
pkg2 md5sum2
pkg1 md5sum3
pkg2 md5sum4
$ cat file3
pkg1 md5sum1
pkg2 md5sum2
pkg1 md5sum3
$ awk '{a[$1 FS $2]++}END{for (i in a) print i, a[i]==3?"match":"mismatch"}' file1 file2 file3
pkg2 md5sum2 match
pkg1 md5sum1 match
pkg2 md5sum4 mismatch
pkg1 md5sum3 mismatch
使用新版本,以下是更新后的代码:
awk '{a[FILENAME FS $1]=$2;b[FILENAME]++;c[$1]}
END{ for (i in c)
{ printf i;delete d
for (j in b)
{ printf "%20s",a[j FS i];d[a[j FS i]]}
printf "\t%s\n", (length(d)>1)?"mismatch":"match"
}
}' file1 file2 file3
pkg1 w14r1w4r w14r1w4r w14r1w4r match
pkg2 t432t432 t432t432 t432t432 match
pkg3 r321 asdf asdf mismatch
pkg4 12341234 mismatch