Como contar as vezes que um caractere específico aparece em um arquivo?


18

Por exemplo, queremos contar tudo quote ( ") caracteres; apenas nos preocupamos se os arquivos tiverem mais aspas do que deveriam.

Por exemplo:

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 esperados:

16


Respostas:


25

Você pode combinar tr(traduzir ou excluir caracteres) com wc(contar palavras, linhas, caracteres):

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

( -delimine todos os caracteres no csuplemento de "e conte os ccaracteres.)


20

abordagem grep :

grep -o '"' file | wc -l
16 
  • -o - produz apenas substrings correspondentes

Ou com um único gawk :

awk -v RS='' -v FPAT='"' '{print NF}' file
16
  • RS='' - separador de registros vazio (em vez de nova linha)

  • FPAT='"' - padrão que define o valor do campo


-oé uma extensão GNU não padrão para o greputilitário padrão . Não é mencionado na documentação do POSIX paragrep .
Andrew Henle 23/08

4

Se duas linhas no arquivo tiverem um número ímpar de aspas duplas, a soma total de aspas duplas será par e você não detectará aspas desequilibradas (é isso que eu presumo que você gostaria de fazer, mas posso estar errado )

Este awkscript relata qualquer linha na linha de entrada que tenha um número ímpar de aspas:

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

Definimos o separador de campo ( FS) como "com o -F'"'que significa que, se uma linha tiver um número par de campos, ela terá aspas ímpares. NFé o número de campos no registro recente e NRé o número ordinal do registro atual ("o número da linha").

Dada a seguinte 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"

Nós temos

$ 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

retornaria "14" para este arquivo.



2

Pure BASH:

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

É tmpuma matriz? Se sim, tmpé uma matriz de quê?
Tim

@ Tim, não. tmpneste trecho é uma variável de shell normal. E eu estou votando negativamente nesta resposta, porque isso conta o número de vezes que um caractere aparece em uma variável ( var) e não em um arquivo, conforme especificado na pergunta.
Curinga

0

experimentar:

grep -0 '"' File -c

no entanto, isso não funcionará se dois ou mais caracteres na mesma linha. Eles serão contados como um caractere


1
Bem-vindo ao U&L! Isso não parece realmente responder à pergunta, pois contará linhas em vez de caracteres. A criação de respostas eficazes é fortemente incentivada em U&L - consulte Resposta no centro de ajuda. Você pode querer melhorar este.
fra-san


0

Método GNU duplo excêntrico grep:

grep -o \" file | grep -c .
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.