2013-02-27 2 views
23

쉘에서 문자열의 단어 수를 계산하고 싶습니다. 쉘을 사용하여 문자열에서 단어 수를 계산하는 방법

은 문자열입니다 가정 :

input="Count from this String" 

여기에 구분 기호 공간 ' '과 예상 출력은 4 도 "Count from this String " 같은 입력 문자열에 공백 문자를 후행가있을 수 있습니다.

문자열에 후행 공백이 있으면 동일한 출력 4를 생성해야합니다. 어떻게해야합니까?

+1

왜 downvote 질문? 또는 누군가가 무언가를 모르고 다른 사람들이 그것을 안다면, 그들은 단순히 downvote 할 수 있다는 것을 의미합니까? –

답변

30
echo "$input" | wc -w 

단어의 수를 계산하려면 wc -w를 사용하십시오.

또는 개정 향풀의 제안에 따라

는, 에코도 제거 가지고 할 수 있습니다

wc -w <<< "$input" 

경우 < < <는 쉘에서 지원하지 않는이 변형 시도 할 수 있습니다 :

wc -w << END_OF_INPUT 
$input 
END_OF_INPUT 
+6

그건 [에코의 쓸모없는 사용] (http://fahdshariff.blogspot.com/2012/12/useless-use-of-echo.html)입니다.대신에'wc -w <<< "$ input"'을 사용하십시오. – dogbane

+0

회신에 Tuxdude와 dogbane을 보내 주셔서 감사합니다. wc -w <<< "$ input"을 사용하면 오류가 발생합니다. ** 구문 오류 : got <&, expecting Word **. 어떤 아이디어? –

+0

어느 쉘을 실행하고 있습니까? – Tuxdude

27

wc과 같은 외부 명령은 더 효율적이기 때문에 순수 bash에서 수행 할 수 있기 때문에 필요하지 않습니다.

문자열을 배열로 변환하고 배열 요소 수 :

$ input="Count from this String " 
$ words=($input) 
$ echo ${#words[@]} 
4 
대안

는 다음 위치 매개 변수를 설정하고 set를 사용하여 그들을 계수 :

$ input="Count from this String " 
$ set -- $input 
$ echo $# 
4 
+3

두 번째 변형은 명령 줄에서받은 매개 변수 나 함수에 전달 된 매개 변수와 같은 위치 매개 변수를 덮어 쓰는 부작용이 있습니다 (이러한 행이 함수 내에있는 경우). 그래서 $ 1, $ 2 등에 의존하지 말고, set - $ input을 사용하십시오. – Tuxdude

+0

@Tuxdude 매우 중요했습니다. 감사합니다 –

+0

@ 도그 뱅 당신이 제안한 두 번째 해결책은 제게 잘 작동하고 있지만 Tuxdude가 지적했듯이 현재 매개 변수를 새 매개 변수로 바꿀 수는 없으므로 현재 흐름을 깨뜨릴 수 있습니다. 나는 첫 번째 해결책을 구현하려고 시도했지만 불행히도 오류가 발생했다. ** 구문 오류 : 개행을 기대한다. ** –

5

가 그것을 위해서는 부작용을 피할 수있는 순수한 bash는 다음과 같습니다.

$ input="Count from this string " 
$ echo $(IFS=' '; set -f; set -- $input; echo $#) 
4 

그것은뿐만 아니라 다른 구분와 함께 작동 :

$ input="dog,cat,snake,billy goat,horse" 
$ echo $(IFS=,; set -f; set -- $input; echo $#) 
5 
$ echo $(IFS=' '; set -f; set -- $input; echo $#) 
2 

참고 발신자가 확장이가 (모자 팁 @의 mkelement0) 사전에 수행해야 원하는, 그래서 만약 서브 쉘에서 bash filename expansion을 비활성화 "-f 설정"의 사용. 그것은 기본적 c() 함수를 정의하고, 인수로 공백으로 구분 인자의 요소 $# 반환 번호 $input 전달

echo $(c() { echo $#; }; c $input) 

:

+2

멋지게 끝났으며 각'set' 명령 앞에'set -f;'를 추가하는 것이 좋다. (예 : _separate_ 명령)을 사용하여 경로명 확장을 (일시적으로) 비활성화 할 수 있습니다. 이것은'*'와 같은 입력 토큰이 우발적으로 확장되지 않도록 보장합니다 .. – mklement0

3

는 다음의 한 줄을보십시오. 구분 기호를 변경하려면 IFS (특수 변수)을 변경할 수 있습니다.

3
echo "$input" | awk '{print NF}' 
+0

'NF-x'에서 x는 임의의 숫자입니다. 자리를 비울 필드는 계산되지 않습니다. – PdC

0

난 그냥 펄 한 줄 ('에코의 불필요한 사용을'피)에 차임 있습니다 :

perl -lane 'print scalar(@F)' <<< $input 
관련 문제