【发布时间】:2016-12-02 17:50:52
【问题描述】:
我有两个文件名 1) File-New 2) File-Old。它们包含如下所示的数据,
案例 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-Old”中的差异而编写的。但是如果两个文件的数据发生如下变化,上述逻辑就会失败,
案例 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!
对 案例 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} !(a[$2,$4])' 在不更改文件的情况下获得 case 2 的预期输出订购“新文件”“旧文件”。
注意:我们必须保持传递给命令的文件顺序是 Fix,即“File-New”“File-Old”
【问题讨论】:
-
请说明您希望达到的目标。是的,我们可以看到你的命令的逻辑,但它输出的正是它应该输出的,所以你的期望很可能是错误的。
-
你必须明确你想要得到什么。您的代码打印 old 文件中与 new 文件不同的行。但是您的预期输出包括公共行和一个不同的行!
-
我的期望是在比较两个文件之后只打印 $2 相同和 $4 不同的行。也不要在 File-New 中打印新添加的行。一位专家“Valentin B”在逻辑下方建议 /usr/xpg4/bin/awk -F'!' 'NR==FNR{++a[$2,$4,FNR];next} !(a[$2,$4,FNR])' "File-New" "File-Old" 这可以正常工作,但如果 "File-New " 包含 File-Old 中不存在的新条目,则此逻辑失败。任何人都可以改进上述代码以获得上述预期结果。