Zum Beispiel habe ich eine Datei 1.txt
, die enthält:
Moscow
Astana
Tokyo
Ottawa
Ich möchte die Anzahl aller Zeichen zählen als:
a - 4,
b - 0,
c - 1,
...
z - 0
command-line
bash
text-processing
Set-xx
quelle
quelle
Antworten:
Sie könnten dies verwenden:
Das
sed
Teil fügt nach jedem Zeichen eine neue Zeile ein. Dann geben wirsort
die Ausgabe in alphabetischer Reihenfolge ein. Und schließlichuniq
zählt die Anzahl der Vorkommen. Die Markierung-i
vonuniq
kann weggelassen werden, wenn Sie keine Unterscheidung zwischen Groß- und Kleinschreibung wünschen.quelle
sort -k 2
eine alphanumerische Liste umzuleiten.sed -e $'s/\(.\)/\\1\\\n/g'
(siehe auch stackoverflow.com/a/18410122/179014 )| sort -rnk 1
. Und wenn Sie mit sehr großen Dateien arbeiten, wie ich es bin, können Sie einfach ein paar Tausend Zeilencat 1.txt | shuf -n 10000 | sed 's/\(.\)/\1\n/g' | sort | uniq -ic | sort -rnk 1
Etwas spät, aber um das Set zu vervollständigen, ein anderer Python (3) -Ansatz, sortiertes Ergebnis:
Erläuterung
Lesen Sie die Datei, überspringen Sie Leerzeichen und geben Sie sie als "Zeichen" zurück:
Erstellen Sie eine (sortierte) Menge von Unikaten:
Zähle und drucke das Vorkommen für jedes der Zeichen:
Wie benutzt man
chars_count.py
Führen Sie es mit der Datei als Argument aus:
wenn das Skript ausführbar ist, oder:
wenn nicht
quelle
Standardmäßig in awk die F ield S eparator (FS) ist Raum oder Tab . Da wir jedes Zeichen zählen möchten, müssen wir den FS in nothing (
FS=""
) umdefinieren , um jedes Zeichen in einer separaten Zeile zu teilen und in einem Array zu speichern. Am Ende desEND{..}
Blocks geben wir dessen Gesamtvorkommen mit dem folgenden awk- Befehl aus:Im
{for (i=1;i<=NF;i++) a[$i]++} ... FS="" ...
Block teilen wir nur die Zeichen. Undim
END{for (c in a) print c,a[c]}
Block werden diea
gespeicherten Zeichenprint c
und ihre Häufigkeit in einer Schleife angeordnet und gedruckta[c]
quelle
Führen Sie eine
for
Schleife für alle Zeichen durch, die Sie zählen möchten, und verwenden Sie diesegrep -io
, um alle Vorkommen des Zeichens abzurufen und Groß- und Kleinschreibung zu ignorierenwc -l
Instanzen zu zählen und das Ergebnis auszudrucken.So was:
Das Skript gibt Folgendes aus:
BEARBEITEN nach Kommentar
So erstellen Sie eine Schleife für alle druckbaren Zeichen:
Dies zählt alle ANSI-Zeichen von 32 bis 126 - die am häufigsten lesbaren. Beachten Sie, dass dies keine Groß- und Kleinschreibung verwendet.
Ausgabe davon wird sein:
quelle
i
aus dem grep. (In Ihrer Frage hatten Sie nur 3 im erwarteten Ergebnis)grep
den gesamten Eingang wiederholt.Hier eine andere Lösung (in awk) ...
quelle
cat file | awk '...'
: Sie können direkt sagenawk '...' file
.Der folgende
perl
Oneliner wird die Zählung durchführen. Ich habe den regulären Ausdruck in den Listenkontext gestellt (um die Anzahl der Übereinstimmungen zu erhalten) und das in den skalaren Kontext gestellt:quelle
perl -Mfeature=say -e '$a=join("",<>);say join(",\n", map { sprintf("%s - %d", $_, ($d=()=$a=~/$_/gi)); } ("a".."z"))'
Hier ist eine Lösung mit Python:
Hier haben wir
collections
dieCounter
Klasse des Moduls verwendet, um die Anzahl der Vorkommen jedes Zeichens zu zählen, und zum Drucken haben wir dasstring
Modul verwendet, um alle Kleinbuchstaben der Variablen abzurufenstring.lowercase
.Speichern Sie das obige Skript in einer Datei, und geben Sie ihm einen beliebigen Namen, z
count.py
. Von demselben Verzeichnis aus, in dem die Datei gespeichert ist, können Sie sie einfachpython count.py
ausführen. In jedem anderen Verzeichnis verwenden Sie den absoluten Pfad zur Datei, um sie auszuführenpython /absolute/path/to/count.py
.quelle
Vor einiger Zeit habe ich ein C-Programm dafür geschrieben, weil ich es brauchte, um große Dateien zu betrachten und Statik zu erzeugen.
kompiliere mit (vorausgesetzt der Quellcode befindet sich in
character-distribution.c
):lauf mit:
Wenn Sie keinen C-Compiler bereit haben, installieren Sie GCC:
quelle
Ähnliche Lösung zu @heemayl, mit engerem Code, der auf Python 2.7 und Python 3 funktioniert.
Die erste Aussage
count = collections.Counter(…)
erledigt die ganze wirkliche Arbeit.fileinput.input()
Liest jede Zeile der Eingabe, die über stdin oder als Befehlszeilenargumente weitergeleitet werden kann.*
Lässt es ein Zeichen auf einmal betrachten, anstatt eine Zeile auf einmal.count = Counter(…)
Zählt die Vorkommen jedes Zeichens effizient in einem Durchgang und speichert das Ergebnis in dercount
Variablen.Die zweite Zeile gibt nur die Ergebnisse aus.
'{} - {}'.format(c, count[c] + count[c.upper()]) for c in string.ascii_lowercase
erstellt eine Liste aller Zeichen und ihrer Anzahl.print(',\n'.join(…))
Versetzt es in das gewünschte Format: eins pro Zeile, getrennt durch Kommas, aber kein Komma in der letzten Zeile.quelle
GNU awk 4.1
Wenn Sie eine frühere Version von GNU awk haben, können Sie diese verwenden
for (c in b) print c, b[c]
.quelle
Hier ist die Antwort mit Rubin. Dazu wird die Zeichenfolge in eine eindeutige Liste der verschiedenen Zeichen geändert und für jedes Zeichen die Zählmethode verwendet.
quelle