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 5kelimeler 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 5kelimeler var.
Yanıtlar:
wcAka 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 -wGNU için aynı tanıma yok grep -w. İçin wcbir kelime bir veya daha fazla boşluk bir karakter dizisi (bir [:space:]mevcut yerel karakter sınıfı). Örneğin foo,barve 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.c4.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.
wcPerl ~ 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" > testfiletek 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
wcProgram 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 wcbasitçe şeyler sayar boşlukla ayrılmış . İki önlem radikal olarak farklı olabilir. Bu örneği düşünün:
first,second
vigören üç (kelime önce ve ikinci ise, hem de bunları ayıran virgül) wcgö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, trve 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:
wc28 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 $FILEmi