Come contare le volte in cui un personaggio specifico appare in un file?


18

Ad esempio, vogliamo contare tutti i caratteri quote ( "); ci preoccupiamo solo se i file hanno più citazioni di quanto dovrebbero.

Per esempio:

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

risultati aspettati:

16


Risposte:


25

Puoi combinare tr(tradurre o eliminare caratteri) con wc(contare parole, righe, caratteri):

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

( -delimina tutti i personaggi nel ccomplemento di ", quindi conta i ccaratteri.)


20

approccio grep :

grep -o '"' file | wc -l
16 
  • -o - output solo sottostringhe corrispondenti

O con gawk singolo :

awk -v RS='' -v FPAT='"' '{print NF}' file
16
  • RS='' - separatore di record vuoto (anziché newline)

  • FPAT='"' - modello che definisce il valore del campo


-oè un'estensione GNU non standard per l' greputilità standard . Non è menzionato nella documentazione POSIX pergrep .
Andrew Henle,

4

Se due righe nel file hanno un numero dispari di virgolette doppie, la somma totale delle virgolette doppie sarà pari e non rileverai virgolette sbilanciate (questo è quello che presumo tu voglia effettivamente fare, ma potrei sbagliarmi ).

Questo awkscript riporta qualsiasi riga nella riga di input che ha un numero dispari di virgolette:

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

Impostiamo il separatore di campo ( FS) "con il -F'"'quale significa che se una riga ha un numero pari di campi ha virgolette dispari. NFè il numero di campi nel record recente ed NRè il numero ordinale del record corrente ("il numero di riga").

Dato il seguente input:

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

noi abbiamo

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

Qualcosa di simile a

$ grep -o '"' | wc -l

restituirebbe "14" per questo file.



2

BASH puro:

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

È tmpun array? Se sì, tmpè una matrice di cosa?
Tim

@ Tim, no. tmpin questo frammento è una normale variabile di shell. E sto ridimensionando questa risposta perché conta il numero di volte in cui un personaggio appare in una variabile ( var) piuttosto che in un file come specificato nella domanda.
Wildcard il

0

provare:

grep -0 '"' File -c

tuttavia, questo non funzionerà se due o più caratteri nella stessa riga. Saranno conteggiati come un carattere


1
Benvenuto in U&L! Questo non sembra effettivamente rispondere alla domanda, poiché conterà le righe anziché i caratteri. Scrivere risposte efficaci è fortemente incoraggiato in U&L - vedi Risposte nel centro assistenza. Potresti voler migliorare questo.
fra-san,


0

Metodo doppio GNU eccentrico grep:

grep -o \" file | grep -c .
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.