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}}
。
我正在寻找高级两个文件比较 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}}
。