当其他人做的时,AWK柱根本不打印?

时间:2016-07-07 16:50:52

标签: awk

我有一个非常奇怪的问题,我正在使用两个文件

我的awk脚本:

它意味着匹配行相等的两个文件的第一个字段。然后在其他字段上执行其他条件并检查它们是否匹配。这似乎适用于所有其他字段,但第一个文件的第二个字段$ 2无法填充。

#!/bin/awk -f
BEGIN { 
    FS=OFS=","
    total = 0; 
}

FNR==NR{
    reg[$1] = $1;
    reg_s[$2] = $2;
    account[$3] = $3;
    site_name[$4] = $4;
    next;
}
{
    if ($1 in reg)
        if ( (($2 != "Yes") && (reg_s[$2] == "3")) || (($2 == "Yes") && (reg_s[$2] != "3")) ) {
            print  "Status Error";
            total++;
        }           
}
END { 
    print " - DONE - " total" Errors"
}

我哪里错了?

文件1:

abcd,3,Paper,go
abcde,3,stapler,staples
abb,0,pencil,sharpener

file2的:

abcd,Yes,Paper,go
abcde,Yes,stapler,staples
abb,No,pencil,sharpener

运行它:

awk -f myscript.awk file1 file2

2 个答案:

答案 0 :(得分:0)

使用以下调试修改运行脚本。当您填充数组时,它会调试第一部分:

#!/bin/awk -f
BEGIN {
    FS=OFS=","
    total = 0;
}

FNR==NR{
    reg[$1] = $1;
    reg_s[$2] = $2;
    account[$3] = $3;
    site_name[$4] = $4;
    next;
}
{
    print "----------reg----------------"
    for (key in reg) { print key " : " reg[key] }
    print "----------reg_s--------------"
    for (key in reg_s) { print key " : " reg_s[key] }
    print "----------account------------"
    for (key in account) { print key " : " account[key] }
    print "-----------site_name---------"
    for (key in site_name) { print key " : " site_name[key] }
    print "============================"
}

输出结果为:

----------reg----------------
abcd : abcd
abb : abb
abcde : abcde
----------reg_s--------------
0 : 0
3 : 3
----------account------------
stapler : stapler
Paper : Paper
pencil : pencil
-----------site_name---------
staples : staples
go : go
sharpener : sharpener
============================

正如您所看到的,除了reg_s之外,所有数组都有三个项目,这是因为reg_s使用相同的键" 3"分配两次,而在awk中为数组项分配现有键时,它不会创建一个新的数组项,而是替换prevoius值。

这就是为什么所有数组都包含三个元素的原因,因为它们具有所有不同的键,除了这一个,reg_s,它只使用两个不同的键填充," 3"和" 0"

希望有这个帮助,如果需要,我可以编辑和详细说明。

答案 1 :(得分:0)

这是你可以使用的东西......

$ join -t, <(sort file1) <(sort file2) | 
  awk -F, '($2==3) != ($5=="Yes"){count++} END{print count+0}'

通过密钥加入文件(需要先排序),计算匹配的记录。请注意,!a && b || a && !b是xor的定义,可以像上面一样简单地编写为a!=b

这应该打印为零。 (count+0是将值初始化为数字,以防它永远不满足条件)