我有两个文件名为1)文件-新的2)文件-旧。它们包含如下所示的数据
案例1
文件-新
7! J9AA-104445-A-BOM-50! REINF RR KIT FLR S/M LH! 35!
8! J9BB-103365-A-BOM-50! MBR REINF FLR SD LH! 22!
7! JWZZ-102225-A-MOM-50! RZFIF RR KRT FLR W/Z LH! 15!文件-旧
7! J9AA-104445-A-BOM-50! REINF RR KIT FLR S/M LH! 34!
8! J9BB-103365-A-BOM-50! MBR REINF FLR SD LH! 21!
7! JWZZ-102225-A-MOM-50! RZFIF RR KRT FLR W/Z LH! 14!当我们为两个文件运行awk -F"!" 'NR==FNR{++a[$2,$4];next} !(a[$2,$4])'逻辑时,预期的输出是,
$ /usr/xpg4/bin/awk -F"!" 'NR==FNR{++a[$2,$4];next}
!(a[$2,$4])' "File-New" "File-Old"
7! J9AA-104445-A-BOM-50! REINF RR KIT FLR S/M LH! 34!
8! J9BB-103365-A-BOM-50! MBR REINF FLR SD LH! 21!
7! JWZZ-102225-A-MOM-50! RZFIF RR KRT FLR W/Z LH! 14!从输出中我们可以看到命令-F"!" 'NR==FNR{++a[$2,$4];next} !(a[$2,$4])'的逻辑是用来打印“File”中的差异的。但是,如果两个文件的数据都发生了如下所示的更改,则上述逻辑将失败,
案例2
文件-新
7! J9AA-104445-A-BOM-50! REINF RR KIT FLR S/M LH! 35!
8! J9BB-103365-A-BOM-50! MBR REINF FLR SD LH! 22!
7! JWZZ-102225-A-MOM-50! RZFIF RR KRT FLR W/Z LH! 15!
7! J9AA-104445-A-BOM-50! REINF RR KIT FLR S/M LH! 34!
8! J9BB-103365-A-BOM-50! MBR REINF FLR SD LH! 21!档案-旧
7! J9AA-104445-A-BOM-50! REINF RR KIT FLR S/M LH! 34!
8! J9BB-103365-A-BOM-50! MBR REINF FLR SD LH! 21!
7! JWZZ-102225-A-MOM-50! RZFIF RR KRT FLR W/Z LH! 14!
7! J9AA-104445-A-BOM-50! REINF RR KIT FLR S/M LH! 34!
8! J9BB-103365-A-BOM-50! MBR REINF FLR SD LH! 21!对case 2运行相同的逻辑
$ /usr/xpg4/bin/awk -F"!" 'NR==FNR{++a[$2,$4];next}
!(a[$2,$4])' "File-New" "File-Old"
7! JWZZ-102225-A-MOM-50! RZFIF RR KRT FLR W/Z LH! 14!预期的结果是
7! J9AA-104445-A-BOM-50! REINF RR KIT FLR S/M LH! 34!
8! J9BB-103365-A-BOM-50! MBR REINF FLR SD LH! 21!
7! JWZZ-102225-A-MOM-50! RZFIF RR KRT FLR W/Z LH! 14!是有人能够提出我需要改变的逻辑-F“!'NR==FNR{++a$2,$4;next}!($2,$4)',以获得case 2的预期输出,而不更改文件顺序" file -New“"File-Old”。
注意:我们必须保持文件传递到命令的顺序是Fix,即" file -New“"File-Old”
发布于 2016-12-02 09:08:10
您使用的awk片段构造了一个字典,其键等于第二和第四个字段中的值(使用"!“)。分开的字段)。它无法实现您的期望,因为例如,对于这一行(“File”中的第2行):
8! J9BB-103365-A-BOM-50! MBR REINF FLR SD LH! 22!对此行的更改。
8! J9BB-103365-A-BOM-50! MBR REINF FLR SD LH! 21!"File-old“中还有另一行,具有相同的第2和第4字段。因此,数组[J9BB-103365-A-BOM-50,21]的a键处的值不是零,因此该行没有打印。如果希望监视这两个字段上每一行的更改,还必须将行号存储在数组中,从而产生如下结果:
awk -F'!' 'NR==FNR{++a[$2,$4,FNR];next}
!(a[$2,$4,FNR])' "File-New" "File-Old"也许您希望通过打印行号来完成此操作:
awk -F'!' 'NR==FNR{++a[$2,$4,FNR];next}
!(a[$2,$4,FNR]){printf "Line %d changed: %s\n", FNR, $0}' "File-New" "File-Old"输出:
Line 1 changed: 7! J9AA-104445-A-BOM-50! REINF RR KIT FLR S/M LH! 34!
Line 2 changed: 8! J9BB-103365-A-BOM-50! MBR REINF FLR SD LH! 21!
Line 3 changed: 7! JWZZ-102225-A-MOM-50! RZFIF RR KRT FLR W/Z LH! 14!https://stackoverflow.com/questions/40925519
复制相似问题