awk if-then-else 语句错误

awk if-then-else 语句错误

我正在 bash 脚本中使用 awk 编写 if-then-else 语句。

我想要做的是识别 col 1 值与特定字符串(rs 或 chr)不匹配的行,并将前缀 (chr) 附加到这些已识别行的 col 1 值。所有具有匹配字符串的行都应按原样打印 - 不附加。

到目前为止我的代码行是:

awk '{if (! ($1 ~ /rs/ || $1 ~ /chr/)) {($1 == "chr"$1); print $0}}; else {print $0}' filename > newfilename

我不断收到此代码的语法错误消息。

我可以自行成功执行识别和附加,但在将它们组合成一个命令时遇到问题。

答案1

这是您的代码,为了便于查看而进行了扩展:

awk '
    {
        if (! ($1 ~ /rs/ || $1 ~ /chr/) )
        {
            ($1 == "chr"$1);
            print $0}
        };
        else
        { print $0 }
' filename > newfilename

我想到了很多与此相关的问题

  1. 您使用相等比较而不是赋值来尝试添加chr前缀
  2. 您已将应为作业的内容放在括号中
  3. }第一个之后有一个无关的print $0
  4. else该部分之前不应有分号
  5. }您错过了代码后的最后关闭

这是一个固定版本,仍然扩展:

awk '
    {
        if (! ($1 ~ /rs/ || $1 ~ /chr/) )
        {
            $1 = "chr" $1;
            print $0
        }
        else
        { print $0 }
    }
' filename > newfilename

然后我们可以看到一个简单的优化,将重复的内容移出print $0您的条件:

awk '
    {
        if (! ($1 ~ /rs/ || $1 ~ /chr/) )
        {
            $1 = "chr" $1
        }
        print $0
    }
' filename > newfilename

由于这基本上是一个简单的“条件→修改”,因此您实际上可以使用awk的标准结构来进一步简化。这里我们有两个awk语句,对输入文件的每一行按顺序处理。第一行"chr"根据需要添加前缀。第二个打印每一行。

awk '
    (! ($1 ~ /rs/ || $1 ~ /chr/) ) { $1 = "chr" $1 }
    1
' filename > newfilename

因为这样,awk它甚至可以卷成一行,尽管可读性会受到一点影响

awk '(! ($1 ~ /rs|chr/) ) { $1 = "chr" $1 } 1' filename > newfilename

答案2

使用这条线似乎工作得很好:

awk '!($1 ~ /rs/ || /chr/) {$1="chr"$1}1'

相关内容