파일의 모든 단어 수를 계산하는 명령을 찾고 있습니다. 예를 들어 파일이 이와 같은 경우
today is a
good day
단어가 5
있기 때문에 인쇄해야합니다 5
.
파일의 모든 단어 수를 계산하는 명령을 찾고 있습니다. 예를 들어 파일이 이와 같은 경우
today is a
good day
단어가 5
있기 때문에 인쇄해야합니다 5
.
답변:
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
wc -w
는 GNU와 동일한 정의 를 갖지 않습니다 grep -w
. wc
단어의 경우 공백이 아닌 하나 이상의 문자 시퀀스입니다 ( [:space:]
현재 로케일의 문자 클래스). 예를 들어 foo,bar
및 foo bar
(비 깨는 공간)와 각각 한 단어.
나는 단지 숫자를 위해 이것을 생각해 냈다.
wc -w [file] | cut -d' ' -f1
5
나는 또한 wc -w < [file]
접근 방식을 좋아한다
마지막으로 단어 개수 만 변수에 저장하려면 다음을 사용할 수 있습니다.
myVar=($(wc -w /path/to/file))
이를 통해 파일 이름을 우아하게 건너 뛸 수 있습니다.
wc -w < "$file"
그냥 숫자입니다.
더 나은 솔루션은 Perl을 사용하는 것입니다.
perl -nle '$word += scalar(split(/\s+/, $_)); END{print $word}' filename
B
wc
coreutils에서 소스 코드 명령을 확인할 수 있습니다 . 내 컴퓨터 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
입니다.
wc
했고 펄은 ~ 5 초가 걸리는 동안 ~ 14 초가 걸렸습니다!
split
/\s+/
split(' ')
(split(" ", $_))
echo -e "unix\n linux" > testfile
wc
단지와 마찬가지로, 상당히 빠른 것 PERLIO=:utf8
, perl
현저하게 느려집니다.
$ 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- 워드 루비
이 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
카운트 비교 :
wc
28.참고로 POSIX vi 는 다음과 같이 말합니다.
POSIX 로케일에서 vi는 5 가지 단어를 인식해야합니다.
문자, 숫자 및 밑줄의 최대 순서는 다음과 같이 양쪽 끝으로 구분됩니다.
문자, 숫자 또는 밑줄 이외의 문자
줄의 시작 또는 끝
편집 버퍼의 시작 또는 끝
문자, 숫자, 밑줄 또는 문자 이외의 최대 문자 시퀀스는 다음과 같이 양쪽 끝에 구분됩니다.
- 문자, 숫자, 밑줄
<blank>
문자- 줄의 시작 또는 끝
- 편집 버퍼의 시작 또는 끝
하나 이상의 순차적 빈 줄
편집 버퍼의 첫 번째 문자
<newline>
편집 버퍼에서 마지막이 아닌
wc -w $FILE
?