2013-10-25 1 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 

로 출력 단어의 발행 수를 원하는 경우에는 다음 출력 $ 할려고을 비난 {occs [*]}는 별을 도달하고 내가 할 때 "occs [*] : 잘못된 배열 첨자". 이 문을 처리하기 위해 if 문을 사용할 수는 있지만 이스케이프 된 키를 사용하여 배열 키를 채울 수 있는지 알고 싶습니다.

+2

당신은 위의 문제를 보여줍니다 작은 샘플 입력을 추가시겠습니까? 'declare -A occs; i = "*"; occs [$ i] = 100; echo "$ i : $ {occs [$ i]}" "는 예상대로 작동합니다. 따라서 문제는 다른 곳에서 발생해야합니다. 결합 배열을 선언 했습니까? – Rubens

+0

예 선언을 -A로 선언했습니다. 위 코드를 사용하여 위의 $ predfile에 다음과 같은 내용으로 파일을 만들 수 있습니다 : somethingthing * (줄 바꿈으로 분리 된 *를 포함한 모든 단어) – nico1510

+0

문제는'*' '((...))'표현식 안에있는 index와 같다. 이 문제를 해결할 수있는 방법이 있을지 모르지만, 나는 당신이하려고하는 것은 무엇이든 '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에게 내가 *의 특별한 의미를 의미하지 않는다는 것을 알릴 수있는 방법이 있다는 것입니다. 그러나 분명히 thats는 불가능합니다. – nico1510

관련 문제