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.
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:
Jawaban:
Bagaimana dengan ini:
Catatan: Selain jauh lebih mudah diingat / digandakan dan dikustomisasi, ini sekitar tiga kali (maaf, edit! Gagal tes pertama) lebih cepat daripada jawaban Vereb.
sumber
\r
atau\n
karakter; yangtr -cd f
jawabannya tidak bekerja untuk itu.a
,b
danc
, gunakanegrep
:egrep -o 'a|b|c' <file> | wc -l
.wc -c
seperti padatr
jawaban: karenagrep
output baris demi baris,wc
akan menghitung end-of-line sebagai karakter (karenanya menggandakan jumlah karakter).\r
, tetapi untuk menghitung\n
mengapa tidak hanya digunakanwc -l
?bahkan lebih cepat:
Waktu untuk perintah ini dengan file dengan 4,9 MB dan 1100000 kejadian karakter yang dicari:
Waktu untuk Vereb jawaban dengan
echo
,cat
,tr
danbc
untuk file yang sama:Waktu untuk Rob Hruska menjawab
tr
,sed
danwc
untuk file yang sama:Waktu untuk jawaban Jefromi dengan
fgrep
danwc
untuk file yang sama:sumber
a
,b
danc
:tr -cd abc < file | wc -l
.tr -cd abc < file | wc -c
sebagai gantinyadi mana A adalah karakter
Waktu untuk perintah ini dengan file dengan 4,9 MB dan 1100000 kejadian karakter yang dicari:
sumber
cat
, memberikan nama file sebagai argumen untukwc
dantr
.stdin
, tapi itu bisa disalurkan daripadacat
ed:tr -d 'A' < <file> | wc ...
Jika yang perlu Anda lakukan adalah menghitung jumlah baris yang mengandung karakter Anda, ini akan berhasil:
Namun, itu menghitung beberapa kemunculan 'f' pada baris yang sama dengan satu pertandingan.
sumber
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 barused 's/A/A\n/g
: menambahkan baris baru setelah setiap kemunculan "A"wc -l
: menghitung jumlah garisContoh:
sumber