Ich weiß, dass ich wc verwenden kann, um die Gesamtzahl der Wörter (und Zeilen) in einer Datei zurückzugeben, indem ich:
wc <filename>
Gibt es eine Möglichkeit, die Anzahl für eine bestimmte Zeichenfolge in einer bestimmten Zeile einer Datei wie folgt zurückzugeben:
wc <filename> -<flag> <line number> -<flag> <string>
command-line
wc
Don P.
quelle
quelle
-c
zählt übereinstimmende Zeilen - nicht viel Sinn , um die Anzahl der übereinstimmenden Zeichenfolgen in einer einzelnen Zeile zu erhaltengrep
dient zum Suchen undwc
zum Zählen. Sie zu komponieren ist natürlicher, und daran ist nichts auszusetzen.sed
macht seinen Job,grep
macht seinen Job, und wir reihen sie nur aneinander. Siehe meine Antwort, ich fügte dies als Lösung hinzuDies ist ein guter Anwendungsfall, um Unix-Tools in einer Pipeline zusammenzustellen.
Der
p
Befehl sed gibt die angegebene Zeile der Datei aus und führt sie in grep ein. Die-o
Option von Grep weist an, alle Übereinstimmungen für die angegebene Zeichenfolge auszugeben, und jede Übereinstimmung wird in einer separaten Zeile ausgegeben. Die Ausgabe von Grep wird an wc weitergeleitet, wodurch die Anzahl der Zeilen gezählt wird.quelle
Python
Hier ist eine Möglichkeit, dies in Python über das Listenverständnis zu tun (siehe unten für eine alternative kürzere Version).
So funktioniert das:
-c
Flag aus, wobei Befehle in einfachen Anführungszeichen enthalten sind.input.txt
wirdstdin
über den<
Shell-Operator in den Stream des Python-Interpreters umgeleitet . Daher brauchen wir einsys
Modul.[something for item in something]
lesen wir Textzeilen aussys.stdin
.enumerate(sys.stdin,1)
ermöglicht es uns, die Zeilen zu zählen, dh mit jeder Iteration des Listenverständnisses erhalten wir die Textzeile in einel
Variable und einen Index in einei
Variable, beginnend mit der Zählung bei 1.i==2
filtert nur die Zeile heraus, deren Index gleich 2 ist. So wissen wir, welche Zeile extrahiert werden muss.0
. Wir bezeichnen diesen Artikel also als[<list comprehension stuff here>][0]
. -Das.count("word")
ist es, was eigentlich das Zählen macht. Per Definition gibt es eine Reihe von nicht überlappenden Vorkommen eines Teilstrings in einer Zeichenfolge zurück.print()
Aussage enthalten. Welche Zahl die.count()
Methode zurückgibt, wird auf dem Bildschirm angezeigt.Kürzere Version
Die kürzere Möglichkeit, dies in Python zu tun, besteht darin
readlines()
, anstelle des Listenverständnisses eine Methode zu verwenden und auf ein bestimmtes Element in der Liste zu verweisen, dasreadlines()
erstellt wird. Beachten Sie, dass dadurchreadlines()
eine Liste erstellt wird und Listen in Python 0-indiziert sind. Wenn Sie also Zeile x lesen möchten, sollten Sie auf das Listenelement x-1 verweisen. Zum Beispiel,sed + grep
Natürlich müssen wir uns nicht nur an Skriptsprachen halten.
sed
undgrep
stellen Sie ausreichende Werkzeuge zur Verfügung, die wir für unsere Bedürfnisse verwenden können. Mit könnengrep -c
wir das Auftreten übereinstimmender Zeilen zählen. Wir müssen also nur die spezifische Zeile extrahieren, die wir benötigen, und alle Wörter in dieser Zeile in separate Zeilen aufteilen. Wie so:quelle
sys.stdin
anstatt nur die Datei in Python mit zu öffnenopen("input.txt")
?open()
macht die Linie etwas länger. Es gibt jedoch keinen besonderen Vorteilpython -c 'n,w,f=2,"word",open("input.txt");[f.readline()for _ in range(n-1)];print(f.readline().count(w))'
wäre mein persönlicher vorschlag.close
Methode für das Ergebnis vonopen
ein Speicherverlust ist?awk
Lösung:X
mit Ihrer spezifischen Zeilennummer.gsub
Gibt die Anzahl der Ersetzungen des "Wortes" zurück. Es sieht so aus, als würden wir es zählen.Beispiel:
Mal sehen, wie viele 'f' wir in Zeile "2" haben:
quelle
Eine Möglichkeit, dies zu tun
perl
:quelle