Apakah ada cara di bawah linux / terminal untuk menghitung, berapa kali karakter muncul dalam file teks biasa?
Apakah ada cara di bawah linux / terminal untuk menghitung, berapa kali karakter muncul dalam file teks biasa?
Jawaban:
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.
\r
atau \n
karakter; yang tr -cd f
jawabannya tidak bekerja untuk itu.
a
, b
dan c
, gunakan egrep
: egrep -o 'a|b|c' <file> | wc -l
.
wc -c
seperti pada tr
jawaban: karena grep
output baris demi baris, wc
akan menghitung end-of-line sebagai karakter (karenanya menggandakan jumlah karakter).
\r
, tetapi untuk menghitung \n
mengapa tidak hanya digunakan wc -l
?
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
, tr
dan bc
untuk file yang sama:
real 0m0.168s
user 0m0.059s
sys 0m0.115s
Waktu untuk Rob Hruska menjawab tr
, sed
dan wc
untuk file yang sama:
real 0m0.465s
user 0m0.411s
sys 0m0.080s
Waktu untuk jawaban Jefromi dengan fgrep
dan wc
untuk file yang sama:
real 0m0.522s
user 0m0.477s
sys 0m0.023s
a
, b
dan c
: tr -cd abc < file | wc -l
.
tr -cd abc < file | wc -c
sebagai gantinya
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
cat
, memberikan nama file sebagai argumen untuk wc
dan tr
.
stdin
, tapi itu bisa disalurkan daripada cat
ed:tr -d 'A' < <file> | wc ...
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.
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:
$ cat file
abcdefgabcdefgababababbbba
1234gabca
$ tr -d '\n' < file | sed 's/a/a\n/g' | wc -l
9