2009-10-21 13 views
111

Y a-t-il un moyen, sous linux/terminal, de compter, combien de fois le caractère se trouve dans un fichier texte?Comptabiliser les occurrences d'un caractère dans un fichier texte brut

+4

appartient à super-utilisateur – Malfist

+8

Techniquement, cela pourrait être considéré comme un sh/bash/etc. question de programmation, donc je pense qu'il a une validité à l'un ou l'autre endroit. –

+0

@Rob Hruska: oui, je pense aussi que la programmation bash ... @abrashka: la réponse à votre première et deuxième question est "NON"! – cupakob

Répondre

159

Que diriez-vous de thi s:

fgrep -o f <file> | wc -l 

Note: Outre beaucoup plus facile à mémoriser/dupliquer et personnaliser, c'est environ trois fois (désolé, éditer! bâclé le premier test) plus vite que la réponse de Vereb.

+0

Celui-ci ne fonctionne pas si vous avez besoin de compter les caractères' \ r' ou '\ n'; la réponse 'tr -cd f' fonctionne pour ça. – bjnord

+1

Pour compter plusieurs caractères, par ex. 'a',' b' et 'c', utilisez' egrep': 'egrep -o 'a | b | c' | wc -l'. –

+0

De même, prenez garde de NE PAS utiliser 'wc -c' comme dans la réponse' tr': puisque 'grep' sort ligne par ligne,' wc' compte les fins de ligne comme caractères (doublant ainsi le nombre de caractères). –

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

où A est le caractère

temps pour cette commande avec un fichier avec 4,9 Mo et 1100000 occurences du caractère recherché:

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

Cela devient environ un tiers plus rapide si vous enlevez le 'chat 'inutile, en donnant le nom de fichier comme argument à' wc' et 'tr'. – Cascabel

+0

malheureusement tr fonctionne uniquement sur l'entrée standard – Vereb

+1

Si vous voulez vraiment optimiser cela lit le fichier une seule fois: echo $ (stat -c% s ) - $ (cat | tr -d 'A' | wc -c) | bc – Vereb

3

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

Remplacement des deux occurrences de "A" avec votre personnage, et "fichier" avec votre fichier d'entrée.

  • tr -d '\n' < file: supprime les nouvelles lignes
  • sed 's/A/A\n/g: ajoute une nouvelle ligne après chaque occurrence de "A"
  • wc -l: compte le nombre de lignes

Exemple:

$ cat file 
abcdefgabcdefgababababbbba 


1234gabca 

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

Si tout ce que vous devez faire est de compter le nombre de lignes contenant votre personnage, cela fonctionne:

grep -c 'f' myfile 

Cependant, il compte plusieurs occurrences de « f » sur la même ligne en un seul match.

56

encore plus rapide:

tr -cd f < file | wc -c 

temps pour cette commande avec un fichier avec 4,9 Mo et 1100000 occurences du caractère recherché:

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

temps pour la réponse Vereb avec echo, cat, tr et bc pour le même fichier:

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

temps pour répondre Rob Hruska avec tr, sed et wc pour le même fichier:

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

temps pour la réponse Jefromi avec fgrep et wc pour le même fichier:

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

Pour compter plusieurs caractères, par ex. 'a',' b' et 'c':' tr -cd abc

+0

Vous m'avez sauvé trouver la bonne syntaxe pour 'tr'! – Pysis