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


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.)


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


-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.



2

BASH pur:

var="$(< file.txt)"
tmp="${var//[^\"]/}"
echo ${#tmp}

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


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

Méthode double excentrique GNU grep :

grep -o \" file | grep -c .
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.