我们必须仅打印 File-1 和 File-2 中的旧条目 Delta(Difference)。 files-1 中新添加的实体无需打印。
在我的 unix 服务器上,每天都会从系统中提取新报告,然后与昨天的报告进行比较。
当日报告中新添加的行由单独的逻辑打印,效果完美。
现在我的要求是在与昨天的报告进行比较后识别今天的报告中更新的字段(对于 $2 检查修改的 $4)。因此,逻辑应该运行逐行检查 $2,以从 File1 中找出 $4 更新的字段并打印相同的内容。
我有 NR=FNR 逻辑来这样做,但它不适用于以下情况
/usr/xpg4/bin/awk -F'!' 'NR==FNR{++a[$2,$4];next} !a[$2,$4]++ || NR==FNR{++a[$4];hold} a[$4]++' file-1 file-2
然而,对于以下字段组合,这种新逻辑已经失败,
文件-新建
7! J9AA-50! LHR! 35!
7! J9AA-50! LHR! 34!
8! J9BB-50! LHW! 22!
8! J9BB-50! LHW! 22!
7! test3! test3! 8!
7! test3! test3! 8!
7! JWZZ-50! LHN! 15!
7! J9AA-50! LHR! 34!
8! J9BB-50! LHW! 21!
文件旧
7! J9AA-50! LHR! 34!
7! J9AA-50! LHR! 34!
8! J9BB-50! LHW! 22!
8! J9BB-50! LHW! 22!
7! test3! test3! 8!
7! test3! test3! 8!
7! JWZZ-50! LHN! 14!
7! J9AA-50! LHR! 34!
8! J9BB-50! LHW! 21!
使用新的比较和打印命令。以下逻辑无法打印预期结果,
/usr/xpg4/bin/awk -F'!' 'NR==FNR{++a[$2,$4];next} !a[$2,$4]++ || NR==FNR{++a[$4];hold} a[$4]++' File-New File-Old
该命令不必要地打印这些行
8! J9BB-50! LHW! 22!
7! test3! test3! 8!
7! J9AA-50! LHR! 34!
当前结果,
7! J9AA-50! LHR! 34!
8! J9BB-50! LHW! 22!
7! test3! test3! 8!
7! JWZZ-50! LHN! 14!
7! J9AA-50! LHR! 34!
预期结果:
7! J9AA-50! LHR! 34!
7! JWZZ-50! LHN! 14!
没有当前结果中的第 2、3 和 5 行
我们必须打印更新的文件旧字段(2 美元检查修改的 4 美元),这些字段在今天的新报告中更新。因此,逻辑必须变为从 File-Old 到 File-new 中搜索 $2,如果 $2 存在于 File-New 中,然后比较相应的 $4 值,如果 $4 更新,则打印 File-Old 的该行。
任何人都可以建议更改/新逻辑以获得预期输出。如果使用 NR=FNR 不可能,那么我们如何使用 shell/perl 脚本获得它?
答案1
diff file_old file_new |grep '< ' |awk -F'<' '{print $2}'
7! J9AA-50! LHR! 34!
7! JWZZ-50! LHN! 14!
答案2
我将读取 File-2,然后查找 File-1 中不在数组中的行。请记住,awk 使用SUBSEP
变量来连接数组索引中的字符串:
awk -F'!' 'NR == FNR {f2[$2,$4]; next} !($2 SUBSEP $4 in f2)' File-2 File-1
产生
7! J9AA-50! LHR! 35!
7! test3! test3! 8
7! test3! test3! 8
7! JWZZ-50! LHN! 15!
答案3
另一个awk
对字段进行逐行$2
比较$4
awk 'NR==FNR{f[NR]=$2$4; next}f[FNR]!=$2$4{print }' file1 file2
输出
7! J9AA-50! LHR! 34!
7! JWZZ-50! LHN! 14!