Bir dosyadaki tüm kelimelerin sayısını saymak için bir komut arıyorum. Örneğin bir dosya böyle ise,
today is a
good day
o zaman yazmalı 5
, çünkü orada 5
kelimeler var.
Bir dosyadaki tüm kelimelerin sayısını saymak için bir komut arıyorum. Örneğin bir dosya böyle ise,
today is a
good day
o zaman yazmalı 5
, çünkü orada 5
kelimeler var.
Yanıtlar:
wc
Aka komutu . kelime sayısı yapabilir:
$ 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 için aynı tanıma yok grep -w
. İçin wc
bir kelime bir veya daha fazla boşluk bir karakter dizisi (bir [:space:]
mevcut yerel karakter sınıfı). Örneğin foo,bar
ve foo bar
(kırılmayan bir alana sahip) her biri tek kelimedir.
Ben SADECE numarası için bu ile geldi:
wc -w [file] | cut -d' ' -f1
5
Ben de wc -w < [file]
yaklaşımı seviyorum
Son olarak, bir sözcükte sadece kelime sayısını saklamak için aşağıdakileri kullanabilirsiniz:
myVar=($(wc -w /path/to/file))
Bu, dosya adını zarif bir şekilde atlamanızı sağlar.
wc -w < "$file"
SADECE numara için.
Daha iyi çözüm Perl kullanmaktır:
perl -nle '$word += scalar(split(/\s+/, $_)); END{print $word}' filename
@Bernhard
wc
Çekirdek kaynak kodunu kontrol edebilirim , basut subst.c
4.2 kaynağındaki dosya ile makinemde test ederim .
time wc -w subst.c
real 0m0.025s
user 0m0.016s
sys 0m0.000s
Ve
time perl -nle '$word += scalar(split(" ", $_)); END{print $word}' subst.c
real 0m0.021s
user 0m0.016s
sys 0m0.004s
Dosya ne kadar büyük olursa, Perl'e göre o kadar verimli olur wc
.
wc
Perl ~ 5sn alırken ~ 14sec aldı!
split
üzerinde /\s+/
bir gibidir split(' ')
herhangi önündeki boşluğun boş ilk alan üreten dışında. Bu fark, her satır bağlantısı için fazladan bir sözcük (ilk olarak boş alan) verecektir . Öyleyse (split(" ", $_))
böyle oluşturulan bir dosya için başka türlü kullanın : echo -e "unix\n linux" > testfile
tek astarınız 3 kelime bildirir.
wc
önemli ölçüde daha hızlı olacak, tıpkı olduğu gibi PERLIO=:utf8
, perl
önemli ölçüde daha yavaş olacaktır.
$ 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
Bu, sağlanan dosyada oluşan her kelimenin sıklığını listeler. Ne istediğini biliyorum, ama daha iyi! Sözcüğünüzün oluşumlarını görmek istiyorsanız, bunu yapabilirsiniz:
$ cat your_file.txt | wordfrequency | grep yourword
Bu işlevi .dotfiles'ime bile ekledim
Kaynak: AWK-ward Ruby
wc
Program sayımları "kelimeleri", ancak bu örneğin bir dosyayı incelediğimizde birçok kişi görürdünüz o "sözcükleri" değildir. vi
İse örneğin programı, onların karakter sınıflarına göre bunları sınırlayan "kelimeleri" farklı bir ölçü kullanır wc
basitçe şeyler sayar boşlukla ayrılmış . İki önlem radikal olarak farklı olabilir. Bu örneği düşünün:
first,second
vi
gören üç (kelime önce ve ikinci ise, hem de bunları ayıran virgül) wc
gören bir (bu hat üzerinde herhangi bir boşluk yoktur). Kelimeleri saymanın birçok yolu vardır, bazıları diğerlerinden daha az faydalıdır.
Perl daha iyi vi tarzı kelimeler için bir sayaç yazmaya uygun olacağını, ancak burada kullanarak hızlı bir örnektir sed
, tr
ve wc
(literal satırbaşı kullanarak orta taşınabilir ^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
Sayıları karşılaştırma:
wc
28 verir.Referans için POSIX vi diyor:
POSIX yerel ayarında, vi beş tür sözcüğü tanıyacaktır:
Her iki uçta sınırlandırılmış maksimum harf, rakam ve alt çizgi dizisi:
Harfler, rakamlar veya alt çizgiler dışındaki karakterler
Satırın başı veya sonu
Düzenleme arabelleğinin başı veya sonu
Her iki uçta sınırlandırılmış harfler, rakamlar, alt çizgiler veya karakterler dışındaki maksimum karakter dizisi:
- Bir harf, rakam, alt çizgi
<blank>
karakterler- Satırın başı veya sonu
- Düzenleme arabelleğinin başı veya sonu
Bir veya daha fazla ardışık boş satır
Düzenleme arabelleğindeki ilk karakter
<newline>
Düzenleme arabelleğindeki son olmayan
wc -w $FILE
mi