2015-08-24 107 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