¿Cómo contar las veces que aparece un personaje específico en un archivo?

18

Por ejemplo, queremos contar todos los caracteres de comillas ( "); solo nos preocupamos si los archivos tienen más citas de las que deberían.

Por ejemplo:

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

Resultados previstos:

16

yael
fuente
¿Ves la forma más fácil de encontrar una cita faltante en un script bash? si eso es lo que realmente quieres saber.
G-Man dice 'Restablecer a Monica' el

Respuestas:

25

Puede combinar tr(traducir o eliminar caracteres) con wc(contar palabras, líneas, caracteres):

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

( -delija todos los caracteres en la cejecución de ", y luego cuente los ccaracteres).

Ulrich Schwarz
fuente
20

enfoque grep :

grep -o '"' file | wc -l
16 
  • -o - salida solo subcadenas coincidentes

O con un solo gawk :

awk -v RS='' -v FPAT='"' '{print NF}' file
16
  • RS='' - separador de registro vacío (en lugar de nueva línea)

  • FPAT='"' - patrón que define el valor del campo

RomanPerekhrest
fuente
-oes una extensión GNU no estándar de la greputilidad estándar . No se menciona en la documentación POSIX paragrep .
Andrew Henle
4

Si dos líneas en el archivo tienen un número impar de comillas dobles, la suma total de comillas dobles será par y no detectará comillas desequilibradas (esto es lo que supongo que le gustaría hacer, pero podría estar equivocado )

Este awkscript informa cualquier línea en la línea de entrada que tenga un número impar de comillas:

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

Establecemos el separador de campo ( FS) "con lo -F'"'que significa que si una línea tiene un número par de campos, tiene comillas impares. NFes el número de campos en el registro reciente y NRes el número ordinal del registro actual ("el número de línea").

Dada la siguiente entrada:

$ 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"

obtenemos

$ 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"

Algo como

$ grep -o '"' | wc -l

devolvería "14" para este archivo.

Kusalananda
fuente
2

Otro gawkenfoque único :

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

BASH puro:

var="$(< file.txt)"
tmp="${var//[^\"]/}"
echo ${#tmp}
Thunderbeef
fuente
Es tmpuna matriz? En caso afirmativo, ¿ tmpes una variedad de qué?
Tim
@Tim, no. tmpen este fragmento hay una variable de shell normal. Y estoy rechazando esta respuesta porque esto cuenta el número de veces que aparece un carácter en una variable ( var) en lugar de en un archivo como se especifica en la pregunta.
Comodín el
0

tratar:

grep -0 '"' File -c

sin embargo, esto no funcionará si dos o más caracteres en la misma línea. Se contarán como un personaje

Abdulkarim Malkadi
fuente
1
Bienvenido a U&L! Esto no parece responder realmente la pregunta, ya que contará líneas en lugar de caracteres. Se recomienda escribir respuestas efectivas en U&L; consulte Respuestas en el centro de ayuda. Es posible que desee mejorar este.
fra-san
0

grep -oF '"' archivo | wc -l

-F significa cuerda fija

shinek
fuente
Esto es lo mismo que la primera parte de la respuesta de RomanPerekhrest, excepto que agregó la -Fbandera, que no es necesaria aquí.
G-Man dice 'reinstalar a Monica' el
0

Método excéntrico de doble GNU grep :

grep -o \" file | grep -c .
agc
fuente