Hitung kemunculan char dalam file teks biasa

132

Apakah ada cara di bawah linux / terminal untuk menghitung, berapa kali karakter muncul dalam file teks biasa?

cupakob
sumber
9
Secara teknis ini dapat dianggap sebagai sh / bash / etc. pertanyaan pemrograman, jadi saya pikir itu memiliki validitas di kedua tempat itu.
Rob Hruska
@Rob Hruska: ya, saya juga berpikir pemrograman bash ... @abrashka: jawaban untuk pertanyaan pertama dan kedua Anda adalah "TIDAK"!
cupakob

Jawaban:

178

Bagaimana dengan ini:

fgrep -o f <file> | wc -l

Catatan: Selain jauh lebih mudah diingat / digandakan dan dikustomisasi, ini sekitar tiga kali (maaf, edit! Gagal tes pertama) lebih cepat daripada jawaban Vereb.

Cascabel
sumber
Yang ini tidak berfungsi jika Anda perlu menghitung \ratau \nkarakter; yang tr -cd fjawabannya tidak bekerja untuk itu.
bjnord
3
Untuk menghitung beberapa karakter, misalnya a, bdan c, gunakan egrep: egrep -o 'a|b|c' <file> | wc -l.
Skippy le Grand Gourou
Juga, berhati-hatilah untuk TIDAK menggunakan wc -cseperti pada trjawaban: karena grepoutput baris demi baris, wcakan menghitung end-of-line sebagai karakter (karenanya menggandakan jumlah karakter).
Skippy le Grand Gourou
@ bjnord Ok untuk \r, tetapi untuk menghitung \nmengapa tidak hanya digunakan wc -l?
Skippy le Grand Gourou
67

bahkan lebih cepat:

tr -cd f < file | wc -c

Waktu untuk perintah ini dengan file dengan 4,9 MB dan 1100000 kejadian karakter yang dicari:

real   0m0.089s
user   0m0.057s
sys    0m0.027s

Waktu untuk Vereb jawaban dengan echo, cat, trdan bcuntuk file yang sama:

real   0m0.168s
user   0m0.059s
sys    0m0.115s

Waktu untuk Rob Hruska menjawab tr, seddan wcuntuk file yang sama:

real   0m0.465s
user   0m0.411s
sys    0m0.080s

Waktu untuk jawaban Jefromi dengan fgrepdan wcuntuk file yang sama:

real   0m0.522s
user   0m0.477s
sys    0m0.023s 
pengguna1985553
sumber
3
Untuk menghitung beberapa karakter, misalnya a, bdan c: tr -cd abc < file | wc -l.
Skippy le Grand Gourou
apakah kamu yakin bukan seharusnya tr -cd abc < file | wc -csebagai gantinya
Mithun B
10
echo $(cat <file>  | wc -c) - $(cat <file>  | tr -d 'A' | wc -c) | bc

di mana A adalah karakter

Waktu untuk perintah ini dengan file dengan 4,9 MB dan 1100000 kejadian karakter yang dicari:

real   0m0.168s
user   0m0.059s
sys    0m0.115s
Vereb
sumber
1
Ini mendapatkan sekitar sepertiga lebih cepat jika Anda mengambil yang tidak perlu cat, memberikan nama file sebagai argumen untuk wcdan tr.
Cascabel
1
Jika Anda benar-benar ingin mengoptimalkan ini, baca file sekali saja: echo $ (stat -c% s <file>) - $ (cat <file> | tr -d 'A' | wc -c) | bc
Vereb
@ Vereb - tr hanya membaca stdin, tapi itu bisa disalurkan daripada cated:tr -d 'A' < <file> | wc ...
dsz
7

Jika yang perlu Anda lakukan adalah menghitung jumlah baris yang mengandung karakter Anda, ini akan berhasil:

grep -c 'f' myfile

Namun, itu menghitung beberapa kemunculan 'f' pada baris yang sama dengan satu pertandingan.

Jongo si Gibbon
sumber
4

tr -d '\n' < file | sed 's/A/A\n/g' | wc -l

Mengganti dua kemunculan "A" dengan karakter Anda, dan "file" dengan file input Anda.

  • tr -d '\n' < file: menghapus baris baru
  • sed 's/A/A\n/g: menambahkan baris baru setelah setiap kemunculan "A"
  • wc -l: menghitung jumlah garis

Contoh:

$ cat file
abcdefgabcdefgababababbbba


1234gabca

$ tr -d '\n' < file | sed 's/a/a\n/g' | wc -l
9
Rob Hruska
sumber