linux - 使用 bash 脚本比较两个文件并打印详细的差异报告

标签 linux bash unix awk

我在 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 ""}'

提前致谢!!!

最佳答案

在每个 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. file1 行中存在的每个标签也存在于 file2 的同一行中
  3. 标签始终以相同的顺序出现在给定行中
  4. 给定行中可以有多个重复的标签

关于linux - 使用 bash 脚本比较两个文件并打印详细的差异报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70620601/

相关文章:

Unix命令删除目录中的所有文件但保留目录

python - 在 gdb 中加载 python 支持

linux - Apache 中子目录的权限被拒绝

linux - 使用sudo时如何保持环境变量

linux - 如何在变量上添加参数?

linux - 收到 'ambiguous redirect' 错误

linux - centos-8 用户可以创建文件或文件夹但限制删除

linux - Awk、颜色和音频

linux - 语法错误,文件意外结束。

Linux 更改目录快捷方式