Domanda

Sto cercando di scoprire la frequenza di comparsa di ogni lettera dell'alfabeto inglese in un file di input. Come posso fare questo in uno script bash?

È stato utile?

Soluzione

Un solo comando awk

awk -vFS="" '{for(i=1;i<=NF;i++)w[$i]++}END{for(i in w) print i,w[i]}' file

se si vuole case insensitive, aggiungere tolower()

awk -vFS="" '{for(i=1;i<=NF;i++)w[tolower($i)]++}END{for(i in w) print i,w[i]}' file

e se si vuole solo caratteri,

awk -vFS="" '{for(i=1;i<=NF;i++){ if($i~/[a-zA-Z]/) { w[tolower($i)]++} } }END{for(i in w) print i,w[i]}' file

e se si vuole solo cifre, il cambiamento /[a-zA-Z]/ a /[0-9]/

se non si desidera visualizzare unicode, fare export LC_ALL=C

Altri suggerimenti

La mia soluzione utilizzando grep, sort e uniq.

grep -o . file | sort | uniq -c

Ignora caso:

grep -o . file | sort -f | uniq -ic

Una soluzione con sed, sort e uniq:

sed 's/\(.\)/\1\n/g' file | sort | uniq -c

Questo conta tutti i caratteri, non solo lettere. È possibile filtrare fuori con:

sed 's/\(.\)/\1\n/g' file | grep '[A-Za-z]' | sort | uniq -c

Se si vuole prendere in considerazione maiuscole e minuscole come stessi, solo una traduzione:

sed 's/\(.\)/\1\n/g' file | tr '[:upper:]' '[:lower:]' | grep '[a-z]' | sort | uniq -c

Ecco un suggerimento:

while read -n 1 c
do
    echo "$c"
done < "$INPUT_FILE" | grep '[[:alpha:]]' | sort | uniq -c | sort -nr

Simile alla risposta di mouviciel sopra, ma più generico per Bourne e Korn shell utilizzato su sistemi BSD, quando non si dispone di GNU sed, che supporta \ n in una sostituzione, è possibile barra rovesciata una nuova riga:

sed -e's/./&\
/g' file | sort | uniq -c | sort -nr

o per evitare la scissione visiva sullo schermo, inserire una nuova riga letterale per tipo CTRL + V CTRL + J

sed -e's/./&\^J/g' file | sort | uniq -c | sort -nr
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top