2013-05-21 24 views
62

Devo contare il numero di occorrenze di un carattere in una stringa utilizzando Bash.Conteggiare occorrenze di un carattere in una stringa utilizzando Bash

Nel seguente esempio, quando il carattere è (per esempio) t, è echo s il corretto numero di occorrenze di t in var, ma quando il carattere è virgola o virgola, esso stampa a zero:

var = "text,text,text,text" 
num = `expr match $var [,]` 
echo "$num" 
+0

http: //unix.stackexchange.it/questions/18736/how-to-count-the-number-of-a-specific-character-in-each-line –

risposta

66

vorrei utilizzare il awk seguente comando:

string="text,text,text,text" 
char="," 
awk -F"${char}" '{print NF-1}' <<< "${string}" 

sto dividendo la stringa $char e stampare il numero di campi risultanti meno 1.

Se la shell non supporta l'operatore <<<, utilizzare echo:

echo "${string}" | awk -F"${char}" '{print NF-1}' 
+0

cosa succede se var è un file con testo. come può essere modificato per quanto sopra? – HattrickNZ

+0

@HattrickNZ Quindi utilizzare: '$ (grep -o" $ needle " hek2mgl

+0

@ hek2mgi. ma questo esce 3?! quando echo "number_of_occurences" – Amir

68

è possibile ad esempio rimuovere tutti gli altri caratteri e contare la cosa rimane, come :

var="text,text,text,text" 
res="${var//[^,]}" 
echo "$res" 
echo "${#res}" 

stamperà

,,, 
3 

o

tr -dc ',' <<<"$var" | awk '{ print length; }' 

o

tr -dc ',' <<<"$var" | wc -c #works, but i don't like wc.. ;) 

o

awk -F, '{print NF-1}' <<<"$var" 

o

grep -o ',' <<<"$var" | grep -c . 

o

perl -nle 'print s/,//g' <<<"$var" 
+1

[un altro trucco qui] (http://www.cyberciti.biz/faq/unix-linux-appleosx-bsd-bash-count-characters-variables/) come 'y =" $ {x // [^ s | S]} "; echo "$ {# y}" ' –

+4

usa il primo, dovrebbe sempre evitare di ricorrere allo spawn di un altro processo per fare un lavoro come questo, può avere un impatto negativo sulle prestazioni quando si usa con cicli di iterazione di grandi dimensioni. Di norma, l'esecuzione di un processo esterno dovrebbe essere l'ultima risorsa quando si utilizzano iterazioni o operazioni ripetitive. – osirisgothra

+0

Perché non ti piace 'wc'? Si golf! –

1

awk funziona bene se il vostro server ha

var="text,text,text,text" 
num=$(echo "${var}" | awk -F, '{print NF-1}') 
echo "${num}" 
15

Puoi farlo combinando tr e wc comandi. Ad esempio, per contare e nella stringa referee

echo "referee" | tr -cd 'e' | wc -c 

uscita

4 

Spiegazioni: Comando tr -cd 'e' rimuove tutti i caratteri diversi da 'e', ​​e Command wc -c conta i caratteri rimanenti.

linee multiple di ingresso sono buone anche per questa soluzione, come il comando cat mytext.txt | tr -cd 'e' | wc -c lattina conta e nel file mytext.txt, anche pensato che il file può contenere molte linee.

+0

La tua soluzione sembra essere la più pulita e facile da ricordare, grazie! – jirislav

Problemi correlati