2016-09-27 65 views
0

我試圖運行在以下格式的bash命令不是最後一個字符:逃跑〜!在AWK(bash命令),反斜槓就行

declare "test${nb}"="$(cat file.txt | awk '{if($3>0.5 && $3 !~ "ddf") $2="NA"; print $1,$2}')" 

其中$ NB是一個整數(如2),並file.txt的含有一個包含各種數字和字符串值的表格(如果需要,我可以提供更多細節,但這裏不應該有關)

當運行這個時,shell替換!〜作爲我擁有的文件的名稱(不確定爲什麼)。我試圖逃離這個使用這樣反斜槓:

declare "test${nb}"="$(cat file.txt | awk '{if($3>0.5 && $3 \!~ "ddf") $2="NA"; print $1,$2}')" 

但後來我得到這個錯誤:

awk: {if($3>0.5 && $3 \!~ "ddf") $2="NA"; print $1,$2} 
awk:    ^backslash not last character on line 

我也試過有包含在變量「VAR」表,寫這樣說:

declare test[$nb]=$(echo "$var" | awk '{if($3>0.5 && $3 !~ "ddf") $2="NA"; print $1,$2}') 

那麼有沒有錯誤,但輸出只是表,這是不是我不展開變量名的情況下的第一列的第一個字段。例如,如果我這樣做:

declare test2=$(echo "$var" | awk '{if($3>0.5 && $3 !~ "ddf") $2="NA"; print $1,$2}') 

然後它可以很好地工作,test2有預期的價值。但我需要能夠使用任何數字而不是2(類似於測試[$ nb])。

任何想法如何解決這個問題?任何幫助將非常感激!

感謝

回答

2

失去報價:

$ declare x="$(echo '!')" 
-bash: !': event not found 
$ declare x=$(echo '!') 
$ echo "$x" 
! 

你有很多其他的問題與你的說法,不過,包括UUOC,採用標量來模擬一個數組,非慣用AWK語法等。試試這個:

declare test[$nb]=$(awk '{print $1, (($3 > 0.5) && ($3 !~ /ddf/) ? "NA" : $2)}' file.txt) 
+0

我試過,但將其關閉,然後當我嘗試回聲「測試2 $」(例如,如果NB = 2),它有一個空的輸出... – arielle

+0

我試圖讓變量「var」中的表格,並以這種方式寫它:declare test [$ nb] = $(echo「$ var」| awk'{if($ 3> 0.5 && $ 3!〜「ddf」)$ 2 =「NA」; print $ 1,$ 2}')。沒有錯誤,但輸出只是表的第一列的第一個字段,當我不擴展變量名時不是這種情況。例如,如果我這樣做:declare test2 = $(echo「$ var」| awk'{if($ 3> 0。5 && $ 3!〜「ddf」)$ 2 =「NA」;打印$ 1,$ 2}'),那麼它完美的工作,test2具有預期的價值。 – arielle

1

你說的是交互輸入命令,或從運行命令檔案(即腳本)? !〜的歷史擴張僅在交互式使用中出現。順便說一句,bash的manpage說:如果啓用,歷史擴展將被執行,除非一個!出現在雙引號中使用反斜線進行轉義。 !之前的反斜槓!是不是刪除。

這意味着,只要你做了腳本(或者更精確的說,只要你沒有交互式shell),你就不必擔心'!'這個特殊的含義。

如果你有一個交互式shell和歷史擴展困擾你,你可以通過

set +H