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

6

Por exemplo, queremos contar todos os caracteres de citação ( " ); nos preocupamos se os arquivos tiverem mais citações 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

    
por yael 22.08.2017 / 14:32

6 respostas

17

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

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

( -d elete todos os caracteres no c omplement de " e depois conta os c caracteres.)

    
por 22.08.2017 / 14:35
11
abordagem

grep :

grep -o '"' file | wc -l
16 
  • -o - saída apenas substrings correspondidas

Ou com um único gawk :

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

  • FPAT='"' - valor do campo de definição do padrão

por 22.08.2017 / 14:43
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 (isto é o que eu presumo que você gostaria de fazer, mas eu pode estar errado).

Este script awk informa 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 -F'"' , o 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 recebemos

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

    
por 22.08.2017 / 14:49
2

Outra abordagem única de gawk :

awk -v RS=\" 'END{print NR-1}'
    
por 22.08.2017 / 21:06
2

Pure BASH:

var="$(< file.txt)"
tmp="${var//[^\"]/}"
echo ${#tmp}
    
por 22.08.2017 / 20:49
0

tente:

grep -0 '"' File -c

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

    
por 01.12.2018 / 20:41