Saya mencari perintah untuk menghitung jumlah semua kata dalam file. Misalnya jika file seperti ini,
today is a
good day
maka harus dicetak 5, karena ada 5kata - kata di sana.
Saya mencari perintah untuk menghitung jumlah semua kata dalam file. Misalnya jika file seperti ini,
today is a
good day
maka harus dicetak 5, karena ada 5kata - kata di sana.
Jawaban:
Perintahnya wcalias. jumlah kata dapat melakukannya:
$ 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 -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.
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.
wc -w < "$file"untuk HANYA angkanya.
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.
wcmengambil ~ 14detik sementara Perl mengambil ~ 5detik!
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.
wcakan secara signifikan lebih cepat, seperti halnya dengan PERLIO=:utf8, perlakan secara signifikan lebih lambat.
$ 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
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:
wcmemberi 28.Untuk referensi, POSIX vi mengatakan:
Di lokal POSIX, vi harus mengenali lima jenis kata:
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
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
Satu atau lebih baris kosong berurutan
Karakter pertama dalam buffer edit
Non-terakhir
<newline>dalam buffer edit
wc -w $FILE?