bir dosyadaki toplam kelime sayısı nasıl hesaplanır?


Yanıtlar:


39

wcAka komutu . kelime sayısı yapabilir:

$ wc -w <file>

misal

$ 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
O Not kelimeler için 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.
Stéphane Chazelas

7

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.


14
wc -w < "$file"SADECE numara için.
Stéphane Chazelas

3

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.


13
Neden wc 'den daha iyi?
Sparr

2
@Sparr bir şey için, çünkü çok büyük bir sürpriz, çok daha hızlı görünüyor . Ben 141813504 kelime ile bir metin dosyasında denedim ve wcPerl ~ 5sn alırken ~ 14sec aldı!
terdon

3
Bence 'daha büyük' ​​mesele gerçekten Perl'e bağımlı bir cevap ve asla böyle bir bağımlılığın büyük bir hayranıyım. Soru performansla ilgili olsaydı bu başka bir şey olurdu.
Michael Durrant

5
Not o bir 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.
don_crissti

1
Zamanlamalarınız wc'nin daha hızlı olduğunu gösterir (kullanıcı ve sys zamanları önemlidir). LC_ALL = C ile, wcönemli ölçüde daha hızlı olacak, tıpkı olduğu gibi PERLIO=:utf8, perlönemli ölçüde daha yavaş olacaktır.
Stéphane Chazelas

3

AWK kullanalım!

$ 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


Kelimeleri sayar, bu yüzden benim için yeterince iyi! :-)
aggsol

3

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:

  • Senaryoyu kendi üzerine çalıştırmak bana 76 kelime veriyor.
  • @Cuonglm tarafından Perl'deki örnek 31'i verir.
  • Kullanmak wc28 verir.

Referans için POSIX vi diyor:

POSIX yerel ayarında, vi beş tür sözcüğü tanıyacaktır:

  1. 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

  2. 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
  3. Bir veya daha fazla ardışık boş satır

  4. Düzenleme arabelleğindeki ilk karakter

  5. <newline>Düzenleme arabelleğindeki son olmayan

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.