首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >外壳脚本逻辑NR==FNR在第2种情况下失败

外壳脚本逻辑NR==FNR在第2种情况下失败
EN

Stack Overflow用户
提问于 2016-12-02 05:40:52
回答 1查看 79关注 0票数 0

我有两个文件名为1)文件-新的2)文件-旧。它们包含如下所示的数据

案例1

文件-新

代码语言:javascript
复制
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!

文件-旧

代码语言:javascript
复制
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])'逻辑时,预期的输出是,

代码语言:javascript
复制
$ /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

文件-新

代码语言:javascript
复制
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!

档案-旧

代码语言:javascript
复制
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运行相同的逻辑

代码语言:javascript
复制
$ /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!

预期的结果是

代码语言:javascript
复制
  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”

EN

回答 1

Stack Overflow用户

发布于 2016-12-02 09:08:10

您使用的awk片段构造了一个字典,其键等于第二和第四个字段中的值(使用"!“)。分开的字段)。它无法实现您的期望,因为例如,对于这一行(“File”中的第2行):

代码语言:javascript
复制
8! J9BB-103365-A-BOM-50! MBR REINF  FLR SD LH! 22!

对此行的更改。

代码语言:javascript
复制
8! J9BB-103365-A-BOM-50! MBR REINF  FLR SD LH! 21!

"File-old“中还有另一行,具有相同的第2和第4字段。因此,数组[J9BB-103365-A-BOM-50,21]a键处的值不是零,因此该行没有打印。如果希望监视这两个字段上每一行的更改,还必须将行号存储在数组中,从而产生如下结果:

代码语言:javascript
复制
awk -F'!' 'NR==FNR{++a[$2,$4,FNR];next} 
                       !(a[$2,$4,FNR])' "File-New" "File-Old"

也许您希望通过打印行号来完成此操作:

代码语言:javascript
复制
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"

输出:

代码语言:javascript
复制
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!
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40925519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档