script bash per trovare la frequenza di ogni lettera in un file
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?
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