awk 查找两个文件中第二个字段之间的差异

Posted

技术标签:

【中文标题】awk 查找两个文件中第二个字段之间的差异【英文标题】:awk find difference between second field in two files 【发布时间】:2014-06-20 00:28:51 【问题描述】:

我正在使用 awk 根据字段 1 查找两个不同文件中字段 2 之间的差异。

我的文件如下:

文件1:

2014-04-28|2667066
2014-04-29|5484549
2014-04-23|5484572
2014-04-24|2822096

文件2:

2014-04-27|2667066
2014-04-28|7746836
2014-04-29|5484549
2014-04-30|2822060

对于每个日期(字段 1),如果计数(字段 2)不匹配,我想将差异打印到单独的文件中。

我目前有以下脚本来查找差异,但是它没有显示文件 1 中但文件 2 中的记录:

awk -F\| 'NR==FNRa[$1]=$2;nexta[$1]!=$NFprintf "%s, %s Cnt:%d %s Cnt:%d\n",$1,ARGV[1],a[$1],ARGV[2],$NF' file1 file2
2014-04-27, file1 Cnt:0       file2 Cnt:2667066
2014-04-28, file1 Cnt:2667066 file2 Cnt:7746836
2014-04-30, file1 Cnt:0       file2 Cnt:2822060 

要求的结果:

2014-04-23, file1 Cnt:5484572 file2 Cnt:0
2014-04-24, file1 Cnt:2822096 file2 Cnt:0
2014-04-27, file1 Cnt:0       file2 Cnt:2667066
2014-04-28, file1 Cnt:2667066 file2 Cnt:7746836
2014-04-30, file1 Cnt:0       file2 Cnt:2822060

非常感谢任何帮助。

【问题讨论】:

【参考方案1】:
awk -F\| '
NR==FNR  a[$1] = $2; next 
a[$1]!=$NF 
    printf "%s, %s Cnt:%d %s Cnt:%d\n", $1, ARGV[1], a[$1], ARGV[2], $NF

 delete a[$1]  
END 
    for (i in a) 
        printf "%s, %s Cnt:%d %s Cnt:%d\n", i, ARGV[1], a[i], ARGV[2], 0
    
' file1 file2 | sort -k1

输出:

2014-04-23, file1 Cnt:5484572 file2 Cnt:0
2014-04-24, file1 Cnt:2822096 file2 Cnt:0
2014-04-27, file1 Cnt:0 file2 Cnt:2667066
2014-04-28, file1 Cnt:2667066 file2 Cnt:7746836
2014-04-30, file1 Cnt:0 file2 Cnt:2822060

它删除数组中匹配file2 的元素,然后打印数组中所有剩余的元素。这不会保存行的顺序,所以我将其通过管道发送到sort -k1

【讨论】:

【参考方案2】:

我认为您在 awk 的第一个条件中排除了一个文件中不存在的日期。删除 NR==FNR 并保留分配 a[$1]=$2;

【讨论】:

以上是关于awk 查找两个文件中第二个字段之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

查找熊猫中两个日期之间差异的最简单方法

在 MS Access 或 SQL Server 中查找 2 个表之间的差异

在 PostgreSQL 中查找两个大表之间的差异

当与第二个字段相关时,在一个字段中查找完整匹配项

查找两个文本文件之间的差异,每行一项[重复]

查找 SQL 表之间的差异