2013-10-25 61 views
1

我正在嘗試在文件中進行單詞計數,並將文件中的每個單詞用作關聯數組中的鍵。值應該是這個詞的出現。Bash將星形字符視爲關聯數組中的單詞

while read line; do 
    ((occs["$line"]=${occs[$line]}+1)) 
done < $predfile 

現在的問題是,有可能是文件中的*(星號),我希望把這個明星作爲一個詞。然而,當我要輸出的字的出現次數與

for i in "${!occs[@]}" 
do 
    echo "$i : ${occs[$i]}" >> $resultfile 
done 

然後bash改掉輸出$ {用OCC [*]}當它到達的明星和我「的OCC [*]:壞數組下標」。我可以使用if語句來處理這個問題,但我想知道是否可以使用轉義鍵填充數組鍵。

+2

你介意加入一個小樣本的輸入,顯示上述問題?注意:'declare -A occs; I = 「*」;的OCC [$ I] = 100; echo「$ i:$ {occs [$ i]}」'按預期工作。所以這個問題一定在別的地方。你有沒有聲明關聯數組? – Rubens

+0

是的,我用declare -A聲明瞭它。你可以使用我上面的代碼,並創建一個文件,你可以用上面的$ predfile作爲我的$ predfile文件,其中包含以下內容:* * *(每個單詞包括用換行符分隔的*) – nico1510

+0

這個問題似乎源於嘗試使用'*'如在'((...))'表達式中的索引中。可能有一種方法可以解決這個問題,但我認爲這是一個標誌,表明「bash」對於你正在做的任何事情都是錯誤的語言。 – chepner

回答

1

當您嘗試分配數組元素時發生錯誤,而不是當您使用它時。 *@作爲數組下標具有特殊含義,顯然bash不會讓您將這些值用作常規數組下標。您必須特別處理*@

數組下標必須是整數。如果要將任意單詞存儲爲數組鍵,則需要將變量聲明爲關聯數組。

declare -A occs 
while read line; do 
    [[ $line = "*" ]] && line=star 
    [[ $line = "@" ]] && line=asterisk 
    ((occs["$line"]++)) 
done < <(printf "%s\n" a b c \* \* c b a \* 1 2 3 \@) 

for key in "${!occs[@]}"; do 
    printf "%s\t%d\n" "$key" "${occs[$key]}" 
done | column -t 
star  3 
a   2 
b   2 
c   2 
asterisk 1 
1   1 
2   1 
3   1 
+0

是的,我可以這樣做,我只是有一種方法讓bash知道我並不是指*的特殊含義,但顯然這是不可能的 – nico1510

相關問題