1

if elseawk. 每次我使用它时都会遇到语法错误。谁能告诉我如何使用这个?我收到如下所示的语法错误。

代码:

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
4

3 回答 3

3

第一个问题是,当在您的 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

于 2012-06-24T07:52:43.897 回答
1

问题

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

解决方案

您可以通过将分配移到脚本之外的 FS 来简化代码。这更具可读性且不易出错。例如:

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

为了清楚起见,您还可以将分配移动到 BEGIN 块,除非您在运行时将其重新分配给不同的东西。

BEGIN { FS = "=" }

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

于 2012-06-24T07:55:54.357 回答
0
{if(if($1=="good") {print $1;}}}

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

更多: if(if 似乎非常错误。它可能会在与其他构造一起使用时被治愈,而在大多数情况下,您只需使用 if (a && b)) 来组合多个条件,或者 if (a) if (b) c else d .

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

似乎是这里的意思。稍后我会尝试找到更多。

是的 - 有更多无与伦比的大括号。您可以考虑使用 Allman Style 缩进来控制它:每个 { 前面都有一个换行符,之后是一个新的缩进级别,直到大括号关闭。看:

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 个不匹配的右大括号。

于 2012-06-24T07:54:15.070 回答