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

yael
fonte
Consulte A maneira mais fácil de encontrar uma cotação ausente em um script bash? se é isso que você realmente quer saber.
G-Man diz 'Reinstate Monica

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

Ulrich Schwarz
fonte
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

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

Kusalananda
fonte
2

Outra gawkabordagem única :

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

Pure BASH:

var="$(< file.txt)"
tmp="${var//[^\"]/}"
echo ${#tmp}
Thunderbeef
fonte
É 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

Abdulkarim Malkadi
fonte
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

grep -oF '"' arquivo | wc -l

-F significa string fixa

shinek
fonte
É o mesmo que a primeira parte da resposta de RomanPerekhrest, exceto que você adicionou a -Fbandeira, que não é necessária aqui.
G-Man diz 'Restabelecer Monica
0

Método GNU duplo excêntrico grep:

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