¿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


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


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


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



2

BASH puro:

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

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


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

Método excéntrico de doble GNU grep :

grep -o \" file | grep -c .
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.