Bash-Skript die Frequenz von jedem Buchstaben in einer Datei zu finden
Frage
Ich versuche, die Häufigkeit des Auftretens eines jeden Buchstaben im Alphabet Englisch in einer Eingabedatei, um herauszufinden. Wie kann ich dies in einem Bash-Skript?
Lösung
Nur ein awk Befehl
awk -vFS="" '{for(i=1;i<=NF;i++)w[$i]++}END{for(i in w) print i,w[i]}' file
Wenn Sie Groß- und Kleinschreibung wollen, fügen Sie tolower()
awk -vFS="" '{for(i=1;i<=NF;i++)w[tolower($i)]++}END{for(i in w) print i,w[i]}' file
, und wenn Sie nur Zeichen wollen,
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
, und wenn Sie nur Ziffern wollen, ändern /[a-zA-Z]/
zu /[0-9]/
Wenn Sie nicht wollen, Unicode zeigen, tun export LC_ALL=C
Andere Tipps
Meine Lösung mit grep
, sort
und uniq
.
grep -o . file | sort | uniq -c
Ignorieren Fall:
grep -o . file | sort -f | uniq -ic
Eine Lösung mit sed
, sort
und uniq
:
sed 's/\(.\)/\1\n/g' file | sort | uniq -c
Dies zählt alle Zeichen, nicht nur Buchstaben. Sie können herausfiltern mit:
sed 's/\(.\)/\1\n/g' file | grep '[A-Za-z]' | sort | uniq -c
Wenn Sie Groß- und Klein genauso berücksichtigen wollen, fügen Sie einfach eine Übersetzung:
sed 's/\(.\)/\1\n/g' file | tr '[:upper:]' '[:lower:]' | grep '[a-z]' | sort | uniq -c
Hier ist ein Vorschlag:
while read -n 1 c
do
echo "$c"
done < "$INPUT_FILE" | grep '[[:alpha:]]' | sort | uniq -c | sort -nr
Ähnlich wie mouviciel Antwort oben, aber allgemeineren für Bourne und Korn-Shell auf BSD-Systemen verwendet werden, wenn Sie GNU nicht haben sed, die unterstützt \ n in einem Ersatz, können Sie eine neue Zeile Backslash:
sed -e's/./&\
/g' file | sort | uniq -c | sort -nr
oder die visuelle Split auf dem Bildschirm zu vermeiden, legen Sie eine wörtlichen Newline nach Typ STRG + V STRG + J
sed -e's/./&\^J/g' file | sort | uniq -c | sort -nr