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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top