Shell 将两个文件与awk并排比较,以获得预期的输出

Shell 将两个文件与awk并排比较,以获得预期的输出,shell,awk,Shell,Awk,我有两个文件1.xml和2.xml。文件已排序且长度不同。我想使用awk来比较和打印预期格式的匹配行和不匹配行 1.xml AGPS=1\u AGPS->allowedAudit==false AGPS=1\u AGPS->allowedAudit==false AGPS=1\uu AGPS->水平精度==100 AGPS=1\uu AGPS->水平精度==50 AGPS=1\uu AGPS->id==1 AGPS=1\uu AGPS->id==2 AGPS=1\uu AGPS->电离层模型允许

我有两个文件1.xml和2.xml。文件已排序且长度不同。我想使用awk来比较和打印预期格式的匹配行和不匹配行

1.xml

AGPS=1\u AGPS->allowedAudit==false

AGPS=1\u AGPS->allowedAudit==false

AGPS=1\uu AGPS->水平精度==100

AGPS=1\uu AGPS->水平精度==50

AGPS=1\uu AGPS->id==1

AGPS=1\uu AGPS->id==2

AGPS=1\uu AGPS->电离层模型允许==true

AGPS=1\uu AGPS->maxNumGPSSatels==8

AGPS=1\uu AGPS->maxNumGPSSatels==8

AGPS=1_u_AGPS->maxUeBasedAGPSProcedureTime==24

2.xml

AGPS=1\u AGPS->allowedAudit==false

AGPS=1\uu AGPS->allowedAudit==true

AGPS=1\u AGPS->水平精度==120

AGPS=1\uu AGPS->水平精度==50

AGPS=1\uu AGPS->id==1

AGPS=1\uu AGPS->id==3

AGPS=1\uu AGPS->电离层模型允许==true

AGPS=1\uu AGPS->maxNumGPSSatels==8

使用的代码

awk -F"==" 'FNR==NR { array1[$1]=$2;array[$2]=$2; next } { print ($2 in array ? $0 : $0" "array1[$1]" ""NM"), array[$2] }' 2.xml 1.xml
输出

AGPS=1\u AGPS->allowedAudit==false

AGPS=1\u AGPS->allowedAudit==false

AGPS=1_uuAGPS->水平精度==100 50纳米

AGPS=1\uu AGPS->水平精度==50

AGPS=1\uu AGPS->id==1

AGPS=1_uuAGPS->id==2 3纳米

AGPS=1\uu AGPS->电离层模型允许==true

AGPS=1\uu AGPS->MaxNumGPSSatels==8

AGPS=1\uu AGPS->MaxNumGPSSatels==8

AGPS=1_uu\AGPS->MaxueBasedAgpProcedureTime==24纳米

预期产量

AGPS=1\u AGPS->allowedAudit==false

AGPS=1\u AGPS->allowedAudit==false

AGPS=1_uuAGPS->水平精度==100 120纳米

AGPS=1\uu AGPS->水平精度==50

AGPS=1\uu AGPS->id==1

AGPS=1_uuAGPS->id==2 3纳米

AGPS=1\uu AGPS->电离层模型允许==true

AGPS=1\uu AGPS->MaxNumGPSSatels==8

AGPS=1_uuuAGPS->MaxNumGPSSatelites==8 NF

AGPS=1_uu\AGPS->maxUeBasedAGPSProcedureTime==24 NF

如果找不到不匹配的行,则需要额外的代码

对于某些不匹配的情况,逻辑也会失败,但对于某些情况,它会起作用

实际文件很大,我取得了部分成功。

谢谢

$ awk -F' == ' 'NR==FNR {a[$1,++c[$1]]=$2; next} 
                        {print $1 FS $2, v=a[$1,++d[$1]], (v!=$2)?"NM":""; 
                         delete a[$1,d[$1]]} 
                END     {for(k in a) 
                           {split(k,ks,SUBSEP); 
                            print ks[1] FS a[k],"NF"}}' file1 file2

AGPS=1_<Class>_AGPS -> allowedAudit == false false
AGPS=1_<Class>_AGPS -> allowedAudit == true false NM
AGPS=1_<Class>_AGPS -> horizontalAccuracy == 120 100 NM
AGPS=1_<Class>_AGPS -> horizontalAccuracy == 50 50
AGPS=1_<Class>_AGPS -> id == 1 1
AGPS=1_<Class>_AGPS -> id == 3 2 NM
AGPS=1_<Class>_AGPS -> ionosphericModelAllowed == true true
AGPS=1_<Class>_AGPS -> maxNumGPSSatellites == 8 8
AGPS=1_<Class>_AGPS -> maxNumGPSSatellites == 8 NF
AGPS=1_<Class>_AGPS -> maxUeBasedAGPSProcedureTime == 24 NF
这通过将计数器添加为密钥的一部分来解释重复密钥。匹配是通过协调计数器来实现的。最终,多余的记录被打印为NF


注:记录2的预期输出错误。

请使用多行代码格式,而不是为每行开始和结束代码格式的部分;这很难阅读,也很难编辑……此外,请询问您在自己实现所需逻辑时遇到的具体问题。不要只显示您的数据并描述您想要完成的工作-这是一个付费承包商的工作,而不是Q&a数据库。这两个文件都有$1和$2的重复值,这意味着在处理第一个文件的过程中FNR==NR连续的数组分配会覆盖以前的数组分配;当要匹配的字段有重复项时,您计划使用什么逻辑来匹配文件之间的行?可用于比较成对的XML文档,例如,支持c14n命令。感谢Karakfa提供的解决方案。是的,我后来确实介意记录2的预期输出是错误的。