我正在寻找提前两个文件比较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
答案 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}}
添加到结尾。