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

时间:2016-01-28 17:02:09

标签: php bash shell diff comm

我正在寻找提前两个文件比较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

file2的

.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)

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

file3的:

 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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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