如果不是这样,则在 awk 中出现语法错误



我在awk中使用if else语句。 每次使用它时,我都会收到语法错误。谁能告诉我如何使用它?我收到如下所示的语法错误。

法典:

awk '{ FS = "=" ;if($1 ~ /Hi/) {if (!($1=="Hi")) {print $1;}} else {if($1=="bye") {print $1;}}} else {if(if($1=="good") {print $1;}}} END {print $1}'

输出:

awk: { FS = "=" ;if($1 ~ /Hi/) {if (!($1=="Hi")) {print $1;}} else {if($1=="bye") {print $1;}}} else {if(if($1=="good") {print $1;}}} END {print $1}
awk:                                                                                            ^ syntax error
awk: { FS = "=" ;if($1 ~ /Hi/) {if (!($1=="Hi")) {print $1;}} else {if($1=="bye") {print $1;}}} else {if(if($1=="good") {print $1;}}} END {print $1}
awk:                                                                                                     ^ syntax error
awk: { FS = "=" ;if($1 ~ /Hi/) {if (!($1=="Hi")) {print $1;}} else {if($1=="bye") {print $1;}}} else {if(if($1=="good") {print $1;}}} END {print $1}
awk:                                                                                                                                ^ syntax error

第一个问题是,在 3 个右大括号的序列中,您已经完成了整个脚本,因此该行的其余部分会导致语法错误。

您还有一个if条件中的if语句。

我不确定你想写什么,但像这样的东西可能是你在想的:

{ 
    FS = "=";
    if ($1 ~ /Hi/) {
        if (!($1=="Hi")) {print $1;}
    } else if ($1=="bye") {
        print $1;
    } else if ($1=="good") {
        print $1;
    }
} 
END {
    print $1
}

在 http://ideone.com/srNzp

问题

你的代码有很多问题。大括号不平衡、间距差以及其他使调试困难的问题。最终,您会遇到语法和引用问题。

解决 方案

可以通过将赋值移动到脚本外部的 FS 来简化代码。这更具可读性且不易出错。例如:

$ echo "foo=bar" | awk -F= '{print $1}'
foo

为了清楚起见,您还可以将分配移动到 BEGIN 块,除非您在运行时将其重新分配给其他内容。

BEGIN { FS = "=" }

不管你做什么,如果你重构代码以提高可读性,你将更容易调试你的脚本。

{if(if($1=="good") {print $1;}}}

是错误的。第一个大括号在第二个右大括号处关闭,其中只有一个圆括号已关闭。

更多:如果(如果看起来很不对。当遵循其他结构时,它可能会被治愈,而在大多数情况下,你只使用if(a&&b))来组合多个条件,或者if(a)if(b)celse d。

 {if($1=="good") {print $1;}} 

似乎是指这里。一会儿我会尝试找到更多。

是的 - 还有更多不匹配的牙套。您可以考虑使用 Allman 样式缩进来控制它:在每个 { 前面有一个换行符,之后是一个新的缩进级别,直到大括号关闭。看:

awk '{ FS = "=" ;
if($1 ~ /Hi/) 
{
    if (!($1=="Hi")) 
    {
        print $1;
    }
} else 
{
    if($1=="bye") 
    {
        print $1;
    }
}
} // <- doesn't match any open brace
else 
{
    if ($1=="good") 
    {
        print $1;
    }
}
} // <- again
END {print $1}'

如果将光标放在其中一个大括号旁边,许多编辑器有助于突出显示匹配的大括号。您至少还有 2 个不匹配的闭合大括号。

最新更新