我有一个非常奇怪的问题,我正在使用两个文件
我的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
答案 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
是将值初始化为数字,以防它永远不满足条件)