我有用于检查通过解析csv文件创建的变量内容的代码。但是下面的代码不起作用。
$3 ~ ($2 == "\"[ABCDEFGUHIJKLMNOPQRSTUVWXYZ]\"" ? "^\"[[:digit:]]\"$" : "\"\"$") {
print "15th field invalid-OFFENCE FILE"
}
下面的示例数据
"ABC","A","","a" --- # This should fail because of no data in field 3
"ABC","","","a" --- # This should pass because of no data in field 2 thus it should use the else statement of empty
"ABC","A","2","a" --- # This should pass because of data in field 2 and 3
无论如何,实际发生的是应该通过的第二个样本失败了,我无法终生找出原因
答案 0 :(得分:2)
对此进行更改,看看它是否有效:
$3 ~ ($2 ~ /"[A-Z]"/ ? "^\"[[:digit:]]\"$" : "\"\"$") {
print "15th field invalid-OFFENCE FILE"
}
确切地说,您可以进一步更改为$2 ~ /^"[A-Z]"$/
。
但是使用print
行,您实际上看不到差异。
您可以将其更改为:
print "Line: " FNR "\t15th field invalid-OFFENCE FILE"
然后您将看到区别。
更新:
我们误会了您的意思,
如果 fail 表示打印,而 pass 则忽略,那么这就是您想要的:
$3 ~ ($2 ~ /"[A-Z]"/ ? "\"\"$" : "^\"[[:digit:]]\"$") {
print "Line: " FNR "\t15th field invalid-OFFENCE FILE"
}
更改两个分支的位置即可。
答案 1 :(得分:2)
查看您的脚本,这似乎有点尴尬。让我们翻译一下您完成的工作。
注意:我假设您使用awk -F, -f file.awk inputfile
$3 ~ expr
::此行尝试将字段3与expr
表示的扩展正则表达式进行匹配。($2 == "\"[ABCDEFGUHIJKLMNOPQRSTUVWXYZ]\"" ? "^\"[[:digit:]]\"$" : "\"\"$")
:上面的ERE中使用的表达式expr
是三元运算:
$2 == "\"[ABCDEFGUHIJKLMNOPQRSTUVWXYZ]\""
::如果字段2 等于字符串"[ABCDEFGUHIJKLMNOPQRSTUVWXYZ]"
,则^\"[[:digit:]]\"$"
:将字段3与ERE ^"[[:digit:]]"$
匹配,否则"\"\"$"
:,否则匹配空字符串""
。问题在于三元运算符的条件,应为$2 ~ /"[A-Z]"/
而不是相等运算符。
$3 ~ ($2 ~ /"[A-Z]"/ ? "^\"[[:digit:]]\"$" : "\"\"$") {
print "15th field invalid-OFFENCE FILE"
}
这可能更易读:
($2 ~ /"[A-Z]"/ && $3 ~ /^"[[:digit:]]"$/) ||
($2 !~ /"[A-Z]"/ && $3 ~ /^""$/) {
print "15th field invalid-OFFENCE FILE"
}
$ awk -F, '($2 ~ /"[A-Z]"/ ? "^\"[[:digit:]]\"$" : "\"\"$")' file
"ABC","","","a"
"ABC","A","2","a"