Düz metin dosyasında bir karakterin oluşumlarını sayma


132

Linux / terminal altında bir düz metin dosyasında char f'nin kaç kez olduğunu saymanın bir yolu var mı?


9
Teknik olarak bu bir sh / bash / etc olarak düşünülebilir. programlama sorusu, bu yüzden her iki yerde de geçerliliği olduğunu düşünüyorum.
Rob Hruska

@Rob Hruska: evet, bence bash programlama da ... @abrashka: birinci ve ikinci sorunuzun cevabı "HAYIR"!
cupakob

Yanıtlar:


178

Buna ne dersin:

fgrep -o f <file> | wc -l

Not: Hatırlanması / çoğaltılması ve özelleştirilmesi çok daha kolay olmasının yanı sıra, bu, Vereb'in cevabından yaklaşık üç kat daha hızlıdır (üzgünüm, düzenleyin! İlk testte başarısız oldu).


Eğer saymak gerekirse bu bir işe yaramaz \rya da \nkarakterler; tr -cd fCevap bunun için çalışır.
bjnord

3
Örneğin birkaç karakter saymak için a, bve ckullanımı egrep: egrep -o 'a|b|c' <file> | wc -l.
Skippy le Grand Gourou

Ayrıca KULLANMAYIN bundan kaçının wc -colduğu gibi trcevap: beri grepçizgi ile çıkışlar hattı, wcuçtan-hatların (dolayısıyla karakter sayısını iki katına) karakterler olarak sayılır.
Skippy le Grand Gourou

@bjnord Tamam \r, ama saymak için \nneden sadece kullanmıyorsun wc -l?
Skippy le Grand Gourou

67

daha hızlı:

tr -cd f < file | wc -c

4,9 MB ve 1100000 aranan karakterin geçtiği bir dosyaya sahip bu komutun zamanı :

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

Vereb yanıtı için echo, catile trve bcaynı dosya için zaman:

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

İle Rob Hruska cevap zamanı tr, sedve wcaynı dosya için:

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

İle Jefromi yanıt için süre fgrepve wcaynı dosya için:

real   0m0.522s
user   0m0.477s
sys    0m0.023s 

3
Birkaç karakteri, örneğin saymak için a, bve c: tr -cd abc < file | wc -l.
Skippy le Grand Gourou

Emin misiniz? tr -cd abc < file | wc -cbunun yerine olmaması gerekiyordu
Mithun B

10
echo $(cat <file>  | wc -c) - $(cat <file>  | tr -d 'A' | wc -c) | bc

A karakteri nerede

4,9 MB ve aranan karakterin 1100000 kez geçtiği bir dosyaya sahip bu komutun zamanı:

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

1
Gereksiz hale getirirsek Bu daha hızlı üçte alır cats bir argüman olarak dosya adı vererek wcve tr.
Cascabel

1
Bunu gerçekten optimize etmek istiyorsanız, dosyayı sadece bir kez okur: echo $ (stat -c% s <dosya>) - $ (cat <dosya> | tr -d 'A' | wc -c) | bc
Vereb

@Vereb - tr yalnızca okur stdin, ancak bu cated yerine tr -d 'A' < <file> | wc ...
aktarılabilir

7

Tek yapmanız gereken karakterinizin bulunduğu satır sayısını saymaksa, bu işe yarayacaktır:

grep -c 'f' myfile

Ancak, tek bir eşleşme olarak aynı satırda birden fazla "f" oluşumunu sayar.


4

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

"A" nın iki oluşumunu kendi karakterinizle ve "dosya" yı girdi dosyanızla değiştirmek.

  • tr -d '\n' < file: yeni satırları kaldırır
  • sed 's/A/A\n/g: "A" nın her oluşumundan sonra yeni bir satır ekler
  • wc -l: satır sayısını sayar

Misal:

$ cat file
abcdefgabcdefgababababbbba


1234gabca

$ tr -d '\n' < file | sed 's/a/a\n/g' | wc -l
9
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.