AWK三元运算符条件语句不起作用

时间:2019-03-13 09:39:28

标签: awk

我有用于检查通过解析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

无论如何,实际发生的是应该通过的第二个样本失败了,我无法终生找出原因

2 个答案:

答案 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

呼叫了awk
  1. $3 ~ expr:此行尝试将字段3与expr表示的扩展正则表达式进行匹配。
  2. ($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"