bagaimana cara menghitung jumlah kata dalam suatu file?


Jawaban:


39

Perintahnya wcalias. jumlah kata dapat melakukannya:

$ wc -w <file>

contoh

$ 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
Perhatikan bahwa kata - kata untuk wc -wtidak memiliki definisi yang sama dengan GNU grep -w. Untuk wckata adalah urutan satu atau lebih karakter non-spasi ( [:space:]kelas karakter di lokal saat ini). Misalnya foo,bardan foo bar(dengan ruang yang tidak putus-putus) adalah satu kata.
Stéphane Chazelas

7

Saya datang dengan ini hanya untuk nomor:

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

5

Saya juga suka wc -w < [file]pendekatannya

Akhirnya, untuk menyimpan hanya jumlah kata dalam variabel, Anda bisa menggunakan yang berikut ini:

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

Ini memungkinkan Anda melewatkan nama file dengan elegan.


14
wc -w < "$file"untuk HANYA angkanya.
Stéphane Chazelas

3

Solusi yang lebih baik menggunakan Perl:

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

@Bernhard

Anda dapat memeriksa kode sumber wcperintah dari coreutils, saya menguji di mesin saya, dengan file subst.cdalam sumber bash 4.2.

time wc -w subst.c

real    0m0.025s
user    0m0.016s
sys     0m0.000s

Dan

time perl -nle '$word += scalar(split(" ", $_)); END{print $word}' subst.c

real    0m0.021s
user    0m0.016s
sys     0m0.004s

Semakin besar file, Perl semakin efisien wc.


13
Mengapa ini lebih baik dari wc?
Sparr

2
@Parr untuk satu hal karena, yang sangat mengejutkan saya, sepertinya jauh lebih cepat. Saya mencobanya pada file teks dengan 141813504 kata dan wcmengambil ~ 14detik sementara Perl mengambil ~ 5detik!
terdon

3
Saya pikir masalah 'lebih besar' benar-benar merupakan jawaban yang memiliki ketergantungan pada Perl dan saya tidak pernah menjadi penggemar berat ketergantungan seperti itu. Jika pertanyaannya adalah tentang kinerja, itu akan menjadi hal lain.
Michael Durrant

5
Perhatikan bahwa sebuah splitpada /\s+/seperti split(' ')kecuali bahwa setiap spasi terkemuka menghasilkan medan pertama null. Perbedaan itu akan memberi Anda satu kata ekstra (bidang nol pertama, yaitu) per tautan baris . Jadi gunakan (split(" ", $_))sebaliknya untuk file yang dibuat seperti ini: echo -e "unix\n linux" > testfileone-liner Anda melaporkan 3 kata.
don_crissti

1
Pengaturan waktu Anda menunjukkan bahwa wc lebih cepat (waktu pengguna dan sistem yang penting di sana). Dengan LC_ALL = C, wcakan secara signifikan lebih cepat, seperti halnya dengan PERLIO=:utf8, perlakan secara signifikan lebih lambat.
Stéphane Chazelas

3

Mari kita gunakan 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

Ini mencantumkan frekuensi setiap kata yang muncul dalam file yang disediakan. Saya tahu itu bukan yang Anda minta, tapi lebih baik! Jika Anda ingin melihat kemunculan kata Anda, Anda bisa melakukan ini:

$ cat your_file.txt | wordfrequency | grep yourword

Saya bahkan menambahkan fungsi ini ke .dotfiles saya


Sumber: Ruby AWK-ward


Itu menghitung kata-kata, jadi itu cukup baik untukku! :-)
aggsol

3

The wcProgram menghitung "kata", tetapi mereka tidak misalnya "kata" bahwa banyak orang akan melihat ketika mereka memeriksa file. The viProgram misalnya menggunakan ukuran yang berbeda "kata", pembatasan mereka berdasarkan kelas karakter mereka, sementara wchanya menghitung hal-hal yang dipisahkan oleh spasi . Kedua ukuran tersebut bisa sangat berbeda. Pertimbangkan contoh ini:

first,second

vimelihat tiga kata ( pertama dan kedua serta koma yang memisahkannya), sementara wcmelihat satu kata (tidak ada spasi putih pada baris itu). Ada banyak cara untuk menghitung kata, ada yang kurang berguna daripada yang lain.

Sementara Perl akan lebih cocok untuk menulis penghitung untuk kata-kata vi-style, berikut adalah contoh cepat menggunakan sed, trdan wc(cukup portabel menggunakan pengembalian kereta literal ^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

Membandingkan jumlah:

  • Menjalankan skrip sendiri, memberi saya 76 kata.
  • Contoh dalam Perl oleh @cuonglm memberi 31.
  • Menggunakan wcmemberi 28.

Untuk referensi, POSIX vi mengatakan:

Di lokal POSIX, vi harus mengenali lima jenis kata:

  1. Urutan maksimal huruf, angka, dan garis bawah, dibatasi pada kedua ujungnya dengan:

    • Karakter selain huruf, angka, atau garis bawah

    • Awal atau akhir suatu garis

    • Awal atau akhir buffer edit

  2. Urutan maksimal karakter selain huruf, angka, garis bawah, atau karakter, dibatasi pada kedua ujungnya dengan:

    • Huruf, angka, garis bawah
    • <blank> karakter
    • Awal atau akhir suatu garis
    • Awal atau akhir buffer edit
  3. Satu atau lebih baris kosong berurutan

  4. Karakter pertama dalam buffer edit

  5. Non-terakhir <newline>dalam buffer edit

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.