BASH:比较多个文件中的相关条目



我想比较 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....

如何比较所有文件中存在的软件包的 md5sum(打印"匹配"或"不匹配")和输出"丢失"(如果在所有文件中都找不到)?

编辑:

示例输出可以是:

pkg1 w14r1w4r w14r1w4r w14r1w4r match
pkg2 t432t432 t432t432 t432t432 match
pkg3 r321     asdf     asdf     mismatch
pkg4 12341234                   mismatch

第一列是所有包名称的列表第二个、第三个和第四个显示文件 1-3 的 md5 总和仅当所有 3 个都相同时,最后一列才显示匹配

编辑2:

如果第一个输入文件有一个额外的列(第三个),我们可以将其添加到输出文件中吗?

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

如果每个文件中没有重复的 pacakge 名称,则可以运行以下命令:

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%sn", (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

相关内容

  • 没有找到相关文章

最新更新