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

AWK三元运算符条件语句不工作,awk,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",

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

然而,实际发生的是,第二个应该通过的样本失败了,我一辈子都无法找出为什么要改成这个,看看它是否有效:

$3 ~ ($2 ~ /"[A-Z]"/ ? "^\"[[:digit:]]\"$" : "\"\"$") {
  print "15th field invalid-OFFENCE FILE"
}
更确切地说,您可以进一步更改为$2~/^[A-Z]$/

但是有了那条打印线,你就看不出有什么区别了。 您可以将其更改为:

print "Line: " FNR "\t15th field invalid-OFFENCE FILE"
然后你会看到区别

更新: 我们误解了你的意思, 如果失败意味着打印,并通过忽略,那么这就是您想要的:

$3 ~ ($2 ~ /"[A-Z]"/ ? "\"\"$" : "^\"[[:digit:]]\"$") {
  print "Line: " FNR "\t15th field invalid-OFFENCE FILE"
}

更改两个分支的位置即可。

更改为此,查看它是否工作:

$3 ~ ($2 ~ /"[A-Z]"/ ? "^\"[[:digit:]]\"$" : "\"\"$") {
  print "15th field invalid-OFFENCE FILE"
}
更确切地说,您可以进一步更改为$2~/^[A-Z]$/

但是有了那条打印线,你就看不出有什么区别了。 您可以将其更改为:

print "Line: " FNR "\t15th field invalid-OFFENCE FILE"
然后你会看到区别

更新: 我们误解了你的意思, 如果失败意味着打印,并通过忽略,那么这就是您想要的:

$3 ~ ($2 ~ /"[A-Z]"/ ? "\"\"$" : "^\"[[:digit:]]\"$") {
  print "Line: " FNR "\t15th field invalid-OFFENCE FILE"
}

更改两个分支的位置就可以了。

看看您的脚本,似乎有点尴尬。让我们来翻译一下你所做的

注意:我假设您使用awk-F,-F file.awk inputfile调用了awk

$3~expr:此行尝试将字段3与expr表示的扩展正则表达式匹配。 $2==\[ABCDEFGUHIJKLMNOPQRSTUVXYZ]\^\[[:digit:]\$:\\$:上述ERE中使用的表达式expr是三元运算: $2=\[ABCDEFGUHIJKLMNOPQRSTUVXYZ]\:如果字段2等于字符串[ABCDEFGUHIJKLMNOPQRSTUVXYZ],则 ^\[[: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,-F file.awk inputfile调用了awk

$3~expr:此行尝试将字段3与expr表示的扩展正则表达式匹配。 $2==\[ABCDEFGUHIJKLMNOPQRSTUVXYZ]\^\[[:digit:]\$:\\$:上述ERE中使用的表达式expr是三元运算: $2=\[ABCDEFGUHIJKLMNOPQRSTUVXYZ]\:如果字段2等于字符串[ABCDEFGUHIJKLMNOPQRSTUVXYZ],则 ^\[[: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"
}

您使用了$2==,但==之后的内容似乎是正则表达式。如果您想使用正则表达式,请改为~是,它可以使用其中一个,但我遇到的问题的结果是您使用的$2==相同,但==之后的内容似乎是正则表达式。如果您想使用正则表达式,请改为~是,它可以使用其中一个,但我遇到的问题的结果是sameI使用了[[ABCDEFGUHIJKLMNOPQRSTUVXYZ]为了防止由于UTF 8字符集中可能出现大量匹配而意外匹配非语言环境字符,我将检查您的答案是否有效:检查两个选项后,两个选项似乎都不起作用,但仍然遵循错误的选项regex@jordanb111如何调用awk命令。是否指定FS=,?@jordanb111我有将我的命令输出添加到帖子中。我相信它是正确的。因此,我用'awk-F'解析csv文件,BEGIN{FPAT=[^,]+\124;\[^\]+\}NF!=17{打印围栏文件中的字段数量不正确;}`我使用的是[[ABCDEFGUHIJKLMNOPQRSTUVWXYZ]为了防止由于UTF 8字符集中可能出现大量匹配而意外匹配非语言环境字符,我将检查您的答案是否有效:检查两个选项后,两个选项似乎都不起作用,但仍然遵循错误的选项regex@jordanb111如何调用awk命令。是否指定FS=,?@jordanb111我有将我的命令输出添加到帖子中。我相信它是正确的。因此,我用'awk-F'解析csv文件,BEGIN{FPAT=[^,]+\124;\[^\]+\}NF!=17{打印围栏文件中的字段数量不正确;}`不,这也不起作用,如果$2和$3为空,它仍然显示打印行,而它应该不显示任何内容。通过表示程序不打印第15个字段无效行不,这也不起作用。如果$2和$3为空,它仍然显示打印行,而它应该不显示任何内容。通过表示程序不打印第15个字段无效行程序不打印第15个字段的无效行