Ich muss - in Bash - die Nummer eines bestimmten (Einzelbyte-) Zeichens in einer Datei zählen. Zum Beispiel: Zählen Sie die Anzahl der Kommas oder Punkte oder Großbuchstaben 'C' oder ... jedes andere Zeichen.
Grundsätzlich benötige ich eine generalisierte Version von wc -l
, um jedes einzelne Bytezeichen (nicht nur neue Zeilen) zu zählen, das in einer bestimmten Datei enthalten ist.
Ich muss es mit sehr großen Dateien (mehrere GB) verwenden, damit es schnell und ressourceneffizient ist. Idealerweise das gleiche Leistungsniveau wie bei wc -l
, wenn Sie neue Zeilen zählen mussten.
2 Antworten
Hier die Ergebnisse einiger Tests zu Dokumentationszwecken veröffentlichen ... Ich habe die Anzahl der Punkte in einer Datei gezählt, die 1.807.076.940 Bytes und 100-ml-Zeilen enthält. Jede Zeile enthält genau einen Punkt:
$ time wc -l xnorm.dat # takes 1.047 seconds(this count new-lines)
$ time grep -o '\.' xnorm.dat | wc -l # takes 87.443 seconds
$ time awk -v RS='.' 'END{print NR-1}' xnorm.dat # takes 53.947 seconds
$ time tr -d -C '\.' < xnorm.dat | wc -c # takes 3.732 seconds
Bearbeiten
Schrieb ein kleines Programm (fcc = Fast Char Counter) in C gemäß 4ae1e1 Vorschlag:
$ time fcc -i xnorm.dat -c \. # takes 1.327 seconds
Sie können grep -o
mit wc -l
verwenden. z.B. um die Anzahl der Buchstaben C
in Ihrer Eingabedatei zu zählen:
grep -Fo 'C' file | wc -l
Um dies in Einzelbefehl zu erledigen, können Sie gnu awk
mit benutzerdefiniertem RS
verwenden:
awk -v RS='C' 'END{print NR-1}' file
Neue Fragen
bash
Bei Fragen zu Skripten, die für die Bash-Befehlsshell geschrieben wurden. Überprüfen Sie Shell-Skripte mit Fehlern / Syntaxfehlern mit dem Shellcheck-Programm (oder auf dem Web-Shellcheck-Server unter https://shellcheck.net), bevor Sie sie hier veröffentlichen. Fragen zur interaktiven Verwendung von Bash sind bei Super User eher themenbezogen als bei Stack Overflow.