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 5
kata - 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 5
kata - kata di sana.
Jawaban:
Perintahnya wc
alias. 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 -w
tidak memiliki definisi yang sama dengan GNU grep -w
. Untuk wc
kata adalah urutan satu atau lebih karakter non-spasi ( [:space:]
kelas karakter di lokal saat ini). Misalnya foo,bar
dan 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 wc
perintah dari coreutils, saya menguji di mesin saya, dengan file subst.c
dalam 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
.
wc
mengambil ~ 14detik sementara Perl mengambil ~ 5detik!
split
pada /\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" > testfile
one-liner Anda melaporkan 3 kata.
wc
akan secara signifikan lebih cepat, seperti halnya dengan PERLIO=:utf8
, perl
akan 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 wc
Program menghitung "kata", tetapi mereka tidak misalnya "kata" bahwa banyak orang akan melihat ketika mereka memeriksa file. The vi
Program misalnya menggunakan ukuran yang berbeda "kata", pembatasan mereka berdasarkan kelas karakter mereka, sementara wc
hanya menghitung hal-hal yang dipisahkan oleh spasi . Kedua ukuran tersebut bisa sangat berbeda. Pertimbangkan contoh ini:
first,second
vi
melihat tiga kata ( pertama dan kedua serta koma yang memisahkannya), sementara wc
melihat 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
, tr
dan 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:
wc
memberi 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
?