Technisch könnte dies als sh / bash / etc. Programmierfrage, also denke ich, dass es an beiden Stellen Gültigkeit hat.
Rob Hruska
@Rob Hruska: Ja, ich denke auch Bash-Programmierung ... @abrashka: Die Antwort auf Ihre erste und zweite Frage lautet "NEIN"!
Cupakob
Antworten:
178
Wie wäre es damit:
fgrep -o f <file> | wc -l
Hinweis: Abgesehen davon, dass es viel einfacher ist, sich zu merken / zu duplizieren und anzupassen, ist dies ungefähr dreimal (sorry, bearbeiten! Den ersten Test verpfuscht) schneller als Verebs Antwort.
Dieser funktioniert nicht, wenn Sie zählen \roder \nZeichen benötigen ; Die tr -cd fAntwort funktioniert dafür.
Bjnord
3
Um mehrere Zeichen zu zählen, zum Beispiel a, bund cverwenden egrep: egrep -o 'a|b|c' <file> | wc -l.
Skippy le Grand Gourou
Achten Sie auch darauf, NICHT wc -cwie in der trAntwort zu verwenden: Da die grepAusgabe zeilenweise erfolgt, wcwürde das Zeilenende als Zeichen gezählt (wodurch sich die Anzahl der Zeichen verdoppelt).
Skippy le Grand Gourou
@bjnord Ok für \r, aber um zu zählen, \nwarum nicht einfach verwenden wc -l?
Skippy le Grand Gourou
67
noch schneller:
tr -cd f < file | wc -c
Zeit für diesen Befehl mit einer Datei mit 4,9 MB und 1100000 Vorkommen des gesuchten Zeichens:
real 0m0.089s
user 0m0.057s
sys 0m0.027s
Zeit für Vereb Antwort mit echo, cat, trund bcfür die gleiche Datei:
real 0m0.168s
user 0m0.059s
sys 0m0.115s
Zeit für Rob Hruska Antwort mit tr, sedund wcfür die gleiche Datei:
real 0m0.465s
user 0m0.411s
sys 0m0.080s
Zeit für Jefromi Antwort mit fgrepund wcfür die gleiche Datei:
Antworten:
Wie wäre es damit:
Hinweis: Abgesehen davon, dass es viel einfacher ist, sich zu merken / zu duplizieren und anzupassen, ist dies ungefähr dreimal (sorry, bearbeiten! Den ersten Test verpfuscht) schneller als Verebs Antwort.
quelle
\r
oder\n
Zeichen benötigen ; Dietr -cd f
Antwort funktioniert dafür.a
,b
undc
verwendenegrep
:egrep -o 'a|b|c' <file> | wc -l
.wc -c
wie in dertr
Antwort zu verwenden: Da diegrep
Ausgabe zeilenweise erfolgt,wc
würde das Zeilenende als Zeichen gezählt (wodurch sich die Anzahl der Zeichen verdoppelt).\r
, aber um zu zählen,\n
warum nicht einfach verwendenwc -l
?noch schneller:
Zeit für diesen Befehl mit einer Datei mit 4,9 MB und 1100000 Vorkommen des gesuchten Zeichens:
Zeit für Vereb Antwort mit
echo
,cat
,tr
undbc
für die gleiche Datei:Zeit für Rob Hruska Antwort mit
tr
,sed
undwc
für die gleiche Datei:Zeit für Jefromi Antwort mit
fgrep
undwc
für die gleiche Datei:quelle
a
,b
undc
:tr -cd abc < file | wc -l
.tr -cd abc < file | wc -c
stattdessen seinwo das A das Zeichen ist
Zeit für diesen Befehl mit einer Datei mit 4,9 MB und 1100000 Vorkommen des gesuchten Zeichens:
quelle
cat
s entfernen und den Dateinamen als Argument fürwc
und angebentr
.stdin
, aber das kann eher geleitet alscat
ed:tr -d 'A' < <file> | wc ...
Wenn Sie nur die Anzahl der Zeilen zählen müssen, die Ihren Charakter enthalten, funktioniert dies:
Es werden jedoch mehrere Vorkommen von 'f' in derselben Zeile wie bei einer einzelnen Übereinstimmung gezählt.
quelle
tr -d '\n' < file | sed 's/A/A\n/g' | wc -l
Ersetzen Sie die beiden Vorkommen von "A" durch Ihren Charakter und "Datei" durch Ihre Eingabedatei.
tr -d '\n' < file
: Entfernt Zeilenumbrüchesed 's/A/A\n/g
: fügt nach jedem Auftreten von "A" eine neue Zeile hinzuwc -l
: zählt die Anzahl der ZeilenBeispiel:
quelle