Shell - 每行中的文件和参数之间的差异

Shell - diff between files and parameters in each line

我正在寻找高级两个文件比较 shell/bash/php。假设我有这样的文件:

文件 1

.run file=test_script.sql rev=1.1
.run file=test_sql.sql rev=1.1
.run file=test_drop.sql rev=1.2

文件2

.run file=test_drop.sql rev=1.2
.run file=test_grant.sql rev=1.1
.run file=test_script.sql rev=1.2

获取这些文件之间的差异(忽略行顺序)

.run file=test_grant.sql rev=1.1 #(because new line wasn't in file1 at all)
.run file=test_script.sql rev=1.2 #(because rev changed from rev=1.1 to rev=1.2)

但这还不是全部,我想检查旧文件中是否有相同的 (.运行 file=name),如果是,则获取它的 (rev=number)。这样最终的输出将如下所示:

文件 3:

 test_grant.sql 1.1 1.1
 test_script.sql 1.1 1.2

到目前为止: fgrep -x -v -f file1 file2

获得

.run file=test_grant.sql rev=1.1
.run file=test_script.sql rev=1.2

这个 awk 脚本应该做你想做的事:

awk 'NR==FNR {
    map[]=
    next;
}

!map[] || (map[] != ) {
    sub3=substr(, index(,"=")+1)
    subm2=substr(map[], index(map[],"=")+1)
    print substr(, index(,"=")+1), subm2?subm2:sub3, sub3
}' file1 file2

在查看第一个文件 (NR==FNR) 时,将 rev 字段存储在 map 数组中的 file 键下。

查看第二个文件(第二个块)时,如果此行中的 file 字段不在 map 数组中或当前 rev 字段不在匹配匹配的 rev 字段然后打印当前行。

要处理已删除的行,您需要在第二个块之后添加 {delete map[]},然后在末尾添加 END {for (rev in map) {print "Missing: .run "map[rev]" "rev}}