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.

1
mauro 2 Jän. 2016 im 08:30

2 Antworten

Beste Antwort

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
2
mauro 2 Jän. 2016 im 10:30

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
6
anubhava 6 Aug. 2020 im 07:13