파일의 모든 단어 수를 계산하는 명령을 찾고 있습니다. 예를 들어, 파일이 다음과 같다면,
today is a
good day
5
그러면 거기에 단어 가 있기 때문에 인쇄되어야 합니다 5
.
답변1
이 명령 wc
은 라고도 합니다. 단어 수는 다음과 같습니다.
$ wc -w <file>
예
$ cat sample.txt
today is a
good day
$ wc -w sample.txt
5 sample.txt
# just the number (thanks to Stephane Chazelas' comment)
$ wc -w < sample.txt
5
답변2
나는 단지 숫자 때문에 이것을 생각해 냈습니다.
wc -w [file] | cut -d' ' -f1
5
나도 이 wc -w < [file]
방법 좋아함
마지막으로 변수에 단어 수만 저장하려면 다음을 사용할 수 있습니다.
myVar=($(wc -w /path/to/file))
이를 통해 파일 이름을 정상적으로 건너뛸 수 있습니다.
답변3
더 나은 해결책은 Perl을 사용하는 것입니다.
perl -nle '$word += scalar(split(/\s+/, $_)); END{print $word}' filename
@bernhard
coreutils에서 명령의 소스 코드를 확인할 수 있습니다 wc
. 제 컴퓨터에서 테스트했는데 파일은 subst.c
bash 4.2 소스 코드에 있습니다.
time wc -w subst.c
real 0m0.025s
user 0m0.016s
sys 0m0.000s
그리고
time perl -nle '$word += scalar(split(" ", $_)); END{print $word}' subst.c
real 0m0.021s
user 0m0.016s
sys 0m0.004s
파일이 클수록 Perl이 wc
.
답변4
프로그램 wc
은 "단어"를 계산하지만 이는 많은 사람들이 파일을 검사할 때 보는 "단어"가 아닙니다. 예를 들어, vi
프로그램은 "단어"에 대한 다양한 측정값을 사용하여 문자 범주에 따라 구분하고 wc
단순히 숫자를 세는 것입니다.공백으로 구분. 두 측정값은 상당히 다를 수 있습니다. 다음 예를 고려하십시오.
first,second
vi
보다삼성격(첫 번째그리고두번째및 이를 구분하는 쉼표)도 wc
참조하세요 .하나(이 줄에는 공백이 없습니다). 단어 수를 세는 방법은 여러 가지가 있지만 일부는 다른 것보다 덜 유용합니다.
Perl은 vi 스타일 단어에 대한 카운터를 작성하는 데 더 적합하지만 다음은 sed
, tr
및 를 사용하는 간단한 예 wc
입니다(리터럴 캐리지 리턴을 사용하면 적당히 이식 가능 ^M
).
#!/bin/sh
in_words="[[:alnum:]_]"
in_punct="[][{}\\|:\"';<>,./?\`~!@#$%^&*()+=-]"
sed -e "s/\($in_words\)\($in_punct\)/\1^M\2/g" \
-e "s/\($in_punct\)\($in_words\)/\1^M\2/g" \
-e "s/[[:space:]]/^M/g" \
"$@" |
tr '\r' '\n' |
sed -e '/^$/d' |
wc -l
개수 비교:
- 스크립트 자체를 실행하면 76개의 단어가 나왔습니다.
- @cuonglm의 Perl 예제는 31을 제공합니다.
- 사용하면
wc
28이 됩니다.
참고로,POSIX vi설명하다:
POSIX 로케일에서 vi는 다섯 가지 유형의 단어를 인식해야 합니다.
다음 구분 기호로 구분된 문자, 숫자, 밑줄의 최대 순서:
문자, 숫자, 밑줄 이외의 문자
줄의 시작이나 끝
버퍼의 시작 또는 끝 편집
문자, 숫자, 밑줄 또는 문자를 제외한 가장 큰 문자 시퀀스이며 다음 구분 기호로 구분됩니다.
- 문자, 숫자, 밑줄
<blank>
수치- 줄의 시작이나 끝
- 버퍼의 시작 또는 끝 편집
하나 이상의 연속된 빈 줄
버퍼의 첫 번째 문자 편집
마지막 비
<newline>
편집 버퍼에서