파일에서 총 단어 수를 계산하는 방법?


답변:


39

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

1
에 대한 단어wc -w 는 GNU와 동일한 정의 를 갖지 않습니다 grep -w. wc단어의 경우 공백이 아닌 하나 이상의 문자 시퀀스입니다 ( [:space:]현재 로케일의 문자 클래스). 예를 들어 foo,barfoo bar(비 깨는 공간)와 각각 단어.
Stéphane Chazelas 2016 년

7

나는 단지 숫자를 위해 이것을 생각해 냈다.

wc -w [file] | cut -d' ' -f1

5

나는 또한 wc -w < [file]접근 방식을 좋아한다

마지막으로 단어 개수 만 변수에 저장하려면 다음을 사용할 수 있습니다.

myVar=($(wc -w /path/to/file))

이를 통해 파일 이름을 우아하게 건너 뛸 수 있습니다.


14
wc -w < "$file"그냥 숫자입니다.
Stéphane Chazelas 2016 년

3

더 나은 솔루션은 Perl을 사용하는 것입니다.

perl -nle '$word += scalar(split(/\s+/, $_)); END{print $word}' filename

B

wccoreutils에서 소스 코드 명령을 확인할 수 있습니다 . 내 컴퓨터 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입니다.


13
왜 이것이 화장실보다 낫습니까?
Sparr

2
@Sparr 한 가지 이유는 매우 놀랍게도 훨씬 빠르기 때문입니다. 나는 141813504 단어가있는 텍스트 파일에서 그것을 시도 wc했고 펄은 ~ 5 초가 걸리는 동안 ~ 14 초가 걸렸습니다!
terdon

3
나는 '더 큰'문제는 실제로 Perl에 의존하는 대답이라고 생각하며 결코 그런 의존성을 좋아하지 않습니다. 질문이 성능에 관한 것이면 또 다른 것일 것입니다.
Michael Durrant

5
참고 것을 에가 유사한입니다 선행 공백이 널 첫 번째 필드를 생성하는 것을 제외하고. 그 차이는 라인 링크 당 하나의 추가 단어 (널 첫 번째 필드, 즉)를 제공 합니다 . 따라서 다음 과 같이 생성 된 파일 에는 다르게 사용 하십시오. 한 줄짜리가 3 단어를보고합니다. split/\s+/split(' ') (split(" ", $_))echo -e "unix\n linux" > testfile
don_crissti 2016 년

1
당신의 타이밍은 wc가 빠르다는 것을 보여줍니다 (사용자와 sys 시간이 중요합니다). LC_ALL = C로, wc단지와 마찬가지로, 상당히 빠른 것 PERLIO=:utf8, perl현저하게 느려집니다.
Stéphane Chazelas 2016 년

3

AWK를 사용하자!

$ function wordfrequency() { awk 'BEGIN { FS="[^a-zA-Z]+" } { for (i=1; i<=NF; i++) { word = tolower($i) words[word]++ } } END { for (w in words) printf("%3d %s\n", words[w], w) } ' | sort -rn } 
$ cat your_file.txt | wordfrequency

제공된 파일에서 발생하는 각 단어의 빈도가 나열됩니다. 나는 그것이 당신이 요구 한 것이 아니라는 것을 알고 있지만 더 좋습니다! 당신이 당신의 단어의 발생을보고 싶다면, 당신은 이것을 할 수 있습니다 :

$ cat your_file.txt | wordfrequency | grep yourword

나는이 기능을 내 .dotfiles에 추가했습니다.


출처 : AWK- 워드 루비


그것은 단어를 세므로 나에게 충분합니다! :-)
aggsol

3

wc프로그램은 "단어"를 세지 만, 예를 들어 많은 사람들이 파일을 검사 할 때 볼 수있는 "단어"는 아닙니다. vi예를 들어 , 프로그램은 문자 클래스를 기준으로 구분하는 다른 단어 "단어"를 사용하며 공백으로 구분 된wc 것을 계산 합니다. 두 측정 값은 근본적으로 다를 수 있습니다. 이 예제를 고려하십시오.

first,second

vi보고 (즉 첫 번째두 번째 상태뿐만 아니라, 그것들을 분리 쉼표) wc보고 (즉, 회선에 공백이 없음). 단어를 세는 방법에는 여러 가지가 있지만 일부는 다른 것보다 유용하지 않습니다.

펄이 더 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입니다.
  • 사용 wc28.

참고로 POSIX vi 는 다음과 같이 말합니다.

POSIX 로케일에서 vi는 5 가지 단어를 인식해야합니다.

  1. 문자, 숫자 및 밑줄의 최대 순서는 다음과 같이 양쪽 끝으로 구분됩니다.

    • 문자, 숫자 또는 밑줄 이외의 문자

    • 줄의 시작 또는 끝

    • 편집 버퍼의 시작 또는 끝

  2. 문자, 숫자, 밑줄 또는 문자 이외의 최대 문자 시퀀스는 다음과 같이 양쪽 끝에 구분됩니다.

    • 문자, 숫자, 밑줄
    • <blank> 문자
    • 줄의 시작 또는 끝
    • 편집 버퍼의 시작 또는 끝
  3. 하나 이상의 순차적 빈 줄

  4. 편집 버퍼의 첫 번째 문자

  5. <newline>편집 버퍼에서 마지막이 아닌

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.