Comment compter le nombre d'apparitions d'un caractère spécifique dans un fichier?

18

Par exemple, nous voulons compter tous les caractères quote ( "); nous nous inquiétons juste si les fichiers ont plus de citations qu'il ne devrait.

Par exemple:

cluster-env,"manage_dirs_on_root","true"
cluster-env,"one_dir_per_partition","false"
cluster-env,"override_uid","true"
cluster-env,"recovery_enabled","false"

Résultats attendus:

16

Yael
la source
Voir La manière la plus simple de trouver une citation manquante dans un script bash? si c'est ce que vous voulez vraiment savoir.
G-Man dit `` Réintègre Monica '' le

Réponses:

26

Vous pouvez combiner tr(traduire ou supprimer des caractères) avec wc(compter les mots, les lignes, les caractères):

tr -cd '"' < yourfile.cfg | wc -c

( -dsupprimez tous les caractères dans le ccomplément de ", puis comptez les caractères c.)

Ulrich Schwarz
la source
20

approche grep :

grep -o '"' file | wc -l
16 
  • -o - sortie uniquement des sous-chaînes correspondantes

Ou avec un seul gawk :

awk -v RS='' -v FPAT='"' '{print NF}' file
16
  • RS='' - séparateur d'enregistrement vide (au lieu de la nouvelle ligne)

  • FPAT='"' - modèle définissant la valeur du champ

RomanPerekhrest
la source
-oest une extension GNU non standard de l' greputilitaire standard . Ce n'est pas mentionné dans la documentation POSIX pourgrep .
Andrew Henle
4

Si deux lignes du fichier ont un nombre impair de guillemets doubles, la somme totale des guillemets doubles sera paire et vous ne détecterez pas les guillemets asymétriques (c'est ce que je suppose que vous aimeriez réellement faire, mais je peux me tromper ).

Ce awkscript signale toute ligne de la ligne d'entrée qui a un nombre impair de guillemets:

awk -F'"' 'NF % 2 == 0 { printf("Line %d has odd quoting: %s\n", NR, $0) }'

Nous avons mis le séparateur de champ ( FS) à "avec ce -F'"'qui signifie que si une ligne a un nombre pair de domaines , il a des citations étranges. NFest le nombre de champs de l'enregistrement récent et NRle nombre ordinal de l'enregistrement en cours ("le numéro de ligne").

Étant donné l'entrée suivante:

$ cat file
cluster-env,"manage_dirs_on_root","true"
cluster-env,"one_dir_per_partition","false"
cluster-env,override_uid","true"
cluster-env,recovery_enabled","false"

on a

$ awk -F'"' 'NF % 2 == 0 { printf("Line %d has odd quoting: %s\n", NR, $0) }' file
Line 3 has odd quoting: cluster-env,override_uid","true"
Line 4 has odd quoting: cluster-env,recovery_enabled","false"

Quelque chose comme

$ grep -o '"' | wc -l

retournerait "14" pour ce fichier.

Kusalananda
la source
2

Une autre gawkapproche unique :

awk -v RS=\" 'END{print NR-1}'
αғsнιη
la source
2

BASH pur:

var="$(< file.txt)"
tmp="${var//[^\"]/}"
echo ${#tmp}
Thunderbeef
la source
Est tmpun tableau? Si oui, tmpest un tableau de quoi?
Tim
@Tim, non. tmpdans cet extrait est une variable shell normale. Et je downvoting cette réponse parce que cela compte le nombre de fois qu'un caractère apparaît dans une variable ( var) plutôt que dans un fichier comme spécifié dans la question.
Wildcard
0

essayer:

grep -0 '"' File -c

cependant, cela ne fonctionnera pas si deux ou plusieurs caractères sur la même ligne. Ils seront comptés comme un caractère

Abdulkarim Malkadi
la source
1
Bienvenue sur U&L! Cela ne semble pas vraiment répondre à la question, car il comptera des lignes au lieu de caractères. La rédaction de réponses efficaces est fortement encouragée sur U&L - voir Répondre dans le centre d'aide. Vous voudrez peut-être améliorer celui-ci.
fra-san
0

grep -oF '"' fichier | wc -l

-F signifie chaîne fixe

shinek
la source
C'est la même chose que la première partie de la réponse de RomanPerekhrest, sauf que vous avez ajouté le -Fdrapeau, qui n'est pas nécessaire ici.
G-Man dit `` Réintègre Monica '' le
0

Méthode double excentrique GNU grep :

grep -o \" file | grep -c .
agc
la source