使用 bash 脚本比较两个文件并打印详细的差异报告
Compare two files using bash script and print detailed diff report
我在 Unix 系统上有 2 个大文件,每个文件有数千行和大约 80 列。
我已经根据一组唯一键对文件进行了排序,以便我们始终比较相同的行。为了便于理解,我在这里只给出了 3 行和 7 列。
文件 1:
d_report_ref_date="2021-03-31" system_id="VTX" contract_id="1130" credit_line_cd="ABC123" contract_id="ABC123" src_system_id="PRA" entity_cd="U0525"
d_report_ref_date="2021-03-31" system_id="VTX" contract_id="1130" credit_line_cd="ABC124" contract_id="ABC124" src_system_id="PRA" entity_cd="U0526"
d_report_ref_date="2021-03-31" system_id="VTX" contract_id="1130" credit_line_cd="ABC125" contract_id="ABC125" src_system_id="PRA" entity_cd="U0527"
文件 2:
d_report_ref_date="2021-03-31" system_id="VTX" contract_id="1130" credit_line_cd="ABC123" contract_id="ABC123" src_system_id="PRA" entity_cd="U0525"
d_report_ref_date="2021-03-31" system_id="VTX" contract_id="1130" credit_line_cd="ABC124" contract_id="ABC124" src_system_id="PRB" entity_cd="V0528"
d_report_ref_date="2021-03-31" system_id="VTX" contract_id="1130" credit_line_cd="ABC125" contract_id="ABC125" src_system_id="PRA" entity_cd="U0530"
预期输出:
Mismatch in row 2 : file1.src_system_id=PRA file2.src_system_id=PRB, file1.entity_cd=U0526 file2.entity_cd=V0528
Mismatch in row 3 : file1.entity_cd=U0527 file2.entity_cd=U0530
是否可以使用 bash 脚本实现此目的?我尝试了 AWK,它没有给我想要的输出-
paste -d' ' file1 file2|
awk -F' ' '{w=NF/2;
for(i=1;i<=w;i++)
if($i!=$(i+w)) printf "%d %d %s %s", NR,i,$i,$(i+w);
print ""}'
提前致谢!!!
看看 wdiff
,这样的东西可能有用:
$ wdiff -w$'\e[31m' -x $'\e[0m' -y $'\e[32m' -z $'\e[0m' file1 file2
选项-wxyz
分别定义删除和插入的前缀和后缀。在这种情况下,我们天真地尝试将删除着色为红色,将插入着色为绿色。
在每个 Unix 机器上的任何 shell 中使用任何 awk:
$ cat tst.awk
BEGIN { FS="[= ]" }
NR==FNR {
for (i=1; i<NF; i+=2) {
file1[NR,i] = $(i+1)
}
next
}
{
msg = sep = ""
for (i=1; i<NF; i+=2) {
if ( $(i+1) != file1[FNR,i] ) {
msg = msg sep " " ARGV[1] "." $i "=" file1[FNR,i] " " FILENAME "." $i "=" $(i+1)
sep = ","
}
}
if ( msg != "" ) {
print "Mismatch in row " FNR " :" msg ORS
}
}
$ awk -f tst.awk file1 file2
Mismatch in row 2 : file1.src_system_id="PRA" file2.src_system_id="PRB", file1.entity_cd="U0526" file2.entity_cd="V0528"
Mismatch in row 3 : file1.entity_cd="U0527" file2.entity_cd="U0530"
以上假设:
- 您引用的字符串不能包含
=
或空格
- 文件 1 一行中的每个标签也出现在文件 2 的同一行中
- 标签在给定行中始终以相同顺序出现
- 给定行中可以有多个重复标签
我在 Unix 系统上有 2 个大文件,每个文件有数千行和大约 80 列。 我已经根据一组唯一键对文件进行了排序,以便我们始终比较相同的行。为了便于理解,我在这里只给出了 3 行和 7 列。
文件 1:
d_report_ref_date="2021-03-31" system_id="VTX" contract_id="1130" credit_line_cd="ABC123" contract_id="ABC123" src_system_id="PRA" entity_cd="U0525"
d_report_ref_date="2021-03-31" system_id="VTX" contract_id="1130" credit_line_cd="ABC124" contract_id="ABC124" src_system_id="PRA" entity_cd="U0526"
d_report_ref_date="2021-03-31" system_id="VTX" contract_id="1130" credit_line_cd="ABC125" contract_id="ABC125" src_system_id="PRA" entity_cd="U0527"
文件 2:
d_report_ref_date="2021-03-31" system_id="VTX" contract_id="1130" credit_line_cd="ABC123" contract_id="ABC123" src_system_id="PRA" entity_cd="U0525"
d_report_ref_date="2021-03-31" system_id="VTX" contract_id="1130" credit_line_cd="ABC124" contract_id="ABC124" src_system_id="PRB" entity_cd="V0528"
d_report_ref_date="2021-03-31" system_id="VTX" contract_id="1130" credit_line_cd="ABC125" contract_id="ABC125" src_system_id="PRA" entity_cd="U0530"
预期输出:
Mismatch in row 2 : file1.src_system_id=PRA file2.src_system_id=PRB, file1.entity_cd=U0526 file2.entity_cd=V0528
Mismatch in row 3 : file1.entity_cd=U0527 file2.entity_cd=U0530
是否可以使用 bash 脚本实现此目的?我尝试了 AWK,它没有给我想要的输出-
paste -d' ' file1 file2|
awk -F' ' '{w=NF/2;
for(i=1;i<=w;i++)
if($i!=$(i+w)) printf "%d %d %s %s", NR,i,$i,$(i+w);
print ""}'
提前致谢!!!
看看 wdiff
,这样的东西可能有用:
$ wdiff -w$'\e[31m' -x $'\e[0m' -y $'\e[32m' -z $'\e[0m' file1 file2
选项-wxyz
分别定义删除和插入的前缀和后缀。在这种情况下,我们天真地尝试将删除着色为红色,将插入着色为绿色。
在每个 Unix 机器上的任何 shell 中使用任何 awk:
$ cat tst.awk
BEGIN { FS="[= ]" }
NR==FNR {
for (i=1; i<NF; i+=2) {
file1[NR,i] = $(i+1)
}
next
}
{
msg = sep = ""
for (i=1; i<NF; i+=2) {
if ( $(i+1) != file1[FNR,i] ) {
msg = msg sep " " ARGV[1] "." $i "=" file1[FNR,i] " " FILENAME "." $i "=" $(i+1)
sep = ","
}
}
if ( msg != "" ) {
print "Mismatch in row " FNR " :" msg ORS
}
}
$ awk -f tst.awk file1 file2
Mismatch in row 2 : file1.src_system_id="PRA" file2.src_system_id="PRB", file1.entity_cd="U0526" file2.entity_cd="V0528"
Mismatch in row 3 : file1.entity_cd="U0527" file2.entity_cd="U0530"
以上假设:
- 您引用的字符串不能包含
=
或空格 - 文件 1 一行中的每个标签也出现在文件 2 的同一行中
- 标签在给定行中始终以相同顺序出现
- 给定行中可以有多个重复标签