【问题标题】:awk if-then-else statement errorawk if-then-else 语句错误
【发布时间】:2015-11-18 01:26:34
【问题描述】:

我正在 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 == "chr"$1) 是一个条件,而不是一个赋值。使用单个等号进行赋值。

标签: if-statement awk


【解决方案1】:

使用惯用的 awk,您可以将其重写为

awk '$1!~/rs/ && $1!~/chr/ {$1="chr"$1}1'

如果你喜欢

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

或者,等价

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

您可以避免分配,因为除了使用

打印之外没有其他操作
awk '!(/^rs/ || /^chr/) {print "chr"$0;next}1'

【讨论】:

  • 谢谢!我使用了第二个选项,效果很好!
  • 小心 - $1!~/rs/ && $1!~/chr/ 不等同于 !($1 ~ /rs/ || /chr/)!($1 ~ /rs/ || /chr/) 在某些方面也不等同于 !(/^rs/ || /^chr/) 并且 print "chr"$0 不等同于 $1="chr"$1; print
  • 我假设您的第二个选项是!($1 ~ /rs/ || $1 ~ /chr/) ?
【解决方案2】:

有时,多行编写代码可能会帮助您发现错误:

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

你会看到else不在{...}

保留您的代码,这将解决问题:

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

对于代码改进,请查看 karakra 的答案。

【讨论】:

    【解决方案3】:

    正确编写代码语法的方法是:

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

    但请注意,分配可能会更改文件中的空白,因此您可能真正想要的是:

    awk '!($1 ~ /rs/ || $1 ~ /chr/) {sub(/^[[:space:]]*/,"&chr")} 1' filename > newfilename
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-02
      • 2011-05-11
      相关资源
      最近更新 更多