Contare le occorrenze di un carattere in un file di testo semplice


132

Esiste un modo per contare su Linux / Terminal, quante volte il carattere f si presenta in un file di testo semplice?


9
Tecnicamente questo potrebbe essere considerato un sh / bash / ecc. domanda di programmazione, quindi penso che abbia validità in entrambi i posti.
Rob Hruska,

@Rob Hruska: sì, penso anche che sia una programmazione bash ... @abrashka: la risposta per la tua prima e seconda domanda è "NO"!
Cupakob,

Risposte:


178

Cosa ne pensi di questo:

fgrep -o f <file> | wc -l

Nota: oltre a essere molto più facile da ricordare / duplicare e personalizzare, questo è circa tre volte (scusate, modificate! Il primo test è fallito) più velocemente della risposta di Vereb.


Questo non funziona se devi contare \ro \ncaratteri; la tr -cd frisposta funziona per quello.
bjnord,

3
Per contare più caratteri, ad esempio a, be c, usare egrep: egrep -o 'a|b|c' <file> | wc -l.
Skippy le Grand Gourou,

Inoltre, fai attenzione a NON usare wc -ccome nella trrisposta: poiché le grepuscite riga per riga, wccontano la fine delle righe come caratteri (raddoppiando quindi il numero di caratteri).
Skippy le Grand Gourou,

@bjnord Ok per \r, ma per contare \nperché non usare semplicemente wc -l?
Skippy le Grand Gourou,

67

ancora più veloce:

tr -cd f < file | wc -c

Tempo per questo comando con un file con 4.9 MB e 1100000 occorrenze del carattere cercato:

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

Tempo per la risposta Vereb con echo, cat, tre bcper lo stesso file:

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

Tempo per Rob Hruska risposta con tr, sede wcper lo stesso file:

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

Tempo di risposta di Jefromi con fgrep e wcper lo stesso file:

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

3
Per contare più caratteri, ad esempio a, be c: tr -cd abc < file | wc -l.
Skippy le Grand Gourou,

sei sicuro? non è stato supponiamo di essere tr -cd abc < file | wc -cinvece
Mithun B

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

dove la A è il personaggio

Tempo per questo comando con un file con 4.9 MB e 1100000 occorrenze del carattere cercato:

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

1
Questo diventa circa un terzo più veloce se si eliminano i messaggi non necessari cat, fornendo il nome del file come argomento a wce tr.
Cascabel,

1
Se vuoi davvero ottimizzare questo, legge il file solo una volta: echo $ (stat -c% s <file>) - $ (cat <file> | tr -d 'A' | wc -c) | aC
Vereb,

@Vereb - tr legge solo stdin, ma può essere reindirizzato anziché cated:tr -d 'A' < <file> | wc ...
dsz

7

Se tutto ciò che devi fare è contare il numero di righe che contengono il tuo personaggio, questo funzionerà:

grep -c 'f' myfile

Tuttavia, conta più occorrenze di "f" sulla stessa riga di una singola corrispondenza.


4

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

Sostituendo le due occorrenze di "A" con il tuo personaggio e "file" con il tuo file di input.

  • tr -d '\n' < file: rimuove le nuove righe
  • sed 's/A/A\n/g: aggiunge una nuova riga dopo ogni occorrenza di "A"
  • wc -l: conta il numero di righe

Esempio:

$ cat file
abcdefgabcdefgababababbbba


1234gabca

$ tr -d '\n' < file | sed 's/a/a\n/g' | wc -l
9
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.