2015-08-24 109 views
0

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

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

我的代码行至今:

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

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

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

+0

' ($ 1 ==“chr”$ 1)'是一个条件,而不是一个赋值。使用单个等号进行分配。 – karakfa

回答

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' 
+0

谢谢!我使用了第二个选项,这是一种享受! – Bob

+1

小心 - '$ 1!〜/ rs/&& $ 1!〜/ chr /'不等于'!($ 1〜/ rs/||/chr /)',也不是'!$ 1〜/ rs/||/chr /)''相当于'!(/^rs/||/^ chr /)','print'chr“$ 0'不等于'$ 1 =”chr“$ 1; print'。 –

+0

我假设第二个选项的意思是'!($ 1〜/ rs/|| $ 1〜/ chr /)'? – jas

0

有时,在多行写代码可以帮助你发现错误:

'{ 
    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的答案。

0

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

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

,但是要注意的是,分配可能会在文件中改变空格所以你可能真正想要的是:

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