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

时间:2014-01-16 02:39:38

标签: bash shell awk

我有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

1 个答案:

答案 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