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

Unix awk查找两个文件中第二个字段之间的差异,unix,awk,Unix,Awk,我使用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)不匹配,我希望将差异打印到单独的文件中 我目前使用以下

我使用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==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}' 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
非常感谢您的帮助

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

输出:

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

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

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