Wie finde ich die Anzahl der Vorkommen einer Zeichenkette in einer Datei mit der Windows-Befehlszeile?

8

Ich habe riesige Dateien mit E-Mail-Adressen, und ich möchte zählen, wie viele davon in dieser Datei sind. Wie kann ich das über die Windows-Befehlszeile machen?

Ich habe es versucht, aber es druckt nur die passenden Zeilen. (Übrigens: alle E-Mails sind in einer Zeile enthalten)

findstr /c:"@" mail.txt

    
Patryk 16.02.2012, 07:29
quelle

9 Antworten

12

Mit dem, was Sie haben, könnten Sie die Ergebnisse über eine find pipen. Ich habe so etwas von Zeit zu Zeit gesehen.

%Vor%

Sie zählen also die Zeilen, die sich aus Ihrem findstr -Befehl ergeben, in denen sich keine Garbage-Zeichenfolge befindet. Irgendwie ein Hack, aber es könnte für dich arbeiten. Alternativ verwenden Sie einfach find /c in der Zeichenfolge, die Ihnen wichtig ist, da zu sein. Schließlich haben Sie eine Adresse pro Zeile erwähnt, in diesem Fall funktioniert das obige, aber mehrere Adressen pro Zeile und das bricht.

    
Adam S 16.02.2012 07:41
quelle
3

Vielleicht ist es ein bisschen spät, aber das folgende Skript funktionierte für mich (die Quelldatei enthielt Anführungszeichen, deshalb verwendete ich den Parameter 'usebackq'). Das Caret-Zeichen (^) fungiert als Escape-Zeichen in der Windows-Batch-Skriptsprache.

%Vor%     
paranoid 12.08.2014 12:39
quelle
2

Warum nicht einfach das verwenden (dies bestimmt die Anzahl der Zeilen, die (mindestens) ein @ char enthalten):

%Vor%

Beispielausgabe:

%Vor%

Um den Dateinamen in der Ausgabe zu vermeiden, ändern Sie ihn wie folgt:

%Vor%

Beispielausgabe:

%Vor%

Um die resultierende Zahl zu erfassen und in einer Variablen zu speichern, verwenden Sie diese (ändern Sie %N in %%N in einer Batch-Datei):

%Vor%     
aschipfl 16.11.2016 12:12
quelle
1

Ich habe das im Internet gefunden. Sehen Sie, ob es funktioniert:

%Vor%     
gentrobot 16.02.2012 07:42
quelle
1

Ich würde die Unix-Tools auf Ihrem System installieren (praktisch in jedem Fall :-), dann ist es wirklich einfach - schauen Sie sich z. hier:

Zählen Sie die Anzahl der Vorkommen einer Zeichenfolge mit sed?

(mit awk:

%Vor%

).

Sie können die Windows Unix-Tools hier herunterladen:

Ссылка

    
TheEye 16.02.2012 08:07
quelle
1

Sehr einfache Lösung:

%Vor%

Merken Sie sich einen Punkt am Zeilenende!

Hier ist ein etwas verständlicherer Weg:

%Vor%

Das erste grep wählt nur "@" Strings aus und setzt jedes auf eine neue Zeile.

Zweites grep zählt Zeilen (oder Zeilen mit @).

Das grep -Dienstprogramm kann vom GnuWin-Projekt oder von WinGrep Websites. Es ist ein sehr kleiner und sicherer Textfilter. Der Grep ist einer der nützlichsten Unix / Linux Befehle und ich benutze ihn sowohl in Linux als auch in Windows täglich. Das Windows findstr ist gut, hat aber keine Features wie grep.

Die Installation von grep in Windows ist eine der besten Entscheidungen, wenn Sie CLI- oder Batch-Skripte mögen.

    
DigiBat 01.10.2015 11:55
quelle
1

OK - viel zu spät zum Tisch, aber ... es scheint, dass viele Befragte die ursprüngliche Spezifikation verpasst haben, dass alle E-Mail-Adressen in einer Zeile vorkommen . Dies bedeutet, dass Sie Ihre Vorschläge zur Verwendung von Varianten von FINDSTR / c nicht weiterhelfen, es sei denn, Sie führen bei jedem Auftreten des @ -Symbols eine CRLF ein.

Unter den Unix-Tools für DOS ist die sehr mächtige SED.exe. Google es. Es rockt RegEx. Hier ist ein Vorschlag:

%Vor%

Erklärung: (Angenommen, die Datei mit den Daten heißt "Datafile.txt") 1) Das 1. FIND enthält 3 Zeilen mit Header-Informationen, die einen Zeilenzählungsansatz auslösen, so dass die Ergebnisse zu einem 2. (identischen) gefunden werden, um unerwünschte Header-Informationen zu entfernen.

2) Verteile die obigen Ergebnisse an SED, die nach jedem "@" - Zeichen suchen und es durch + "\ n" ersetzen (was eine "neue Zeile", also eine CRLF ist), die jedes "@" erhält eigene Zeile im Ausgabestream ...

3) Wenn Sie die obige Ausgabe von SED in den Befehl FIND / n leiten, fügen Sie dem Anfang jeder Zeile Zeilennummern hinzu. Jetzt müssen Sie nur den numerischen Teil jeder Zeile isolieren und mit "SET / a" voranstellen, um jede Zeile in eine Batch-Anweisung umzuwandeln, die (in zunehmendem Maße mit jeder Zeile) die Variable auf die Nummer dieser Zeile setzt.

4) isoliere den numerischen Teil jeder Zeile und füge die isolierte Zahl per oben hinzu:
| SED "s/\[\(.*\)\].*/Set \/a NumFound=/"

Im obigen Snippet leiten Sie die Ausgabe der vorherigen Befehle an SED weiter, die diese Syntax "s / WhatToLookFor / WhatToReplaceItWith /" verwendet, um die folgenden Schritte auszuführen:

a) Suchen Sie nach einem "[" (das "entkernt" werden muss, indem Sie es mit "\" voranstellen)

b) beginnt mit dem Speichern (oder "Tokenisieren") was folgt, bis zum abschließenden "]"

%Vor%

c) das Zeug zwischen dem \( und dem \) wird "tokenisiert", was bedeutet, dass es später im Abschnitt "WhatToReplaceItWith" referenziert werden kann. Das erste Zeug, das in Token umgewandelt wird, wird mit "\ 1" und dann mit "\ 2" usw. bezeichnet.

Also ... wir ignorieren das [und das] und wir speichern die Zahl, die zwischen den Klammern liegt, und IGNORIERE den ganzen Rest der Zeile, die den Wildcode trägt ... also ersetzen wir die Zeile mit die literale Zeichenfolge:         Set /a NumFound= + die gespeicherte oder "Tokenized" -Nummer, d.h.           ... in der ersten Zeile steht: Set /a NumFound=1           ...&Ampere; Die nächste Zeile lautet: Set /a NumFound=2 usw. etc.

Wenn Sie also 1.283 E-Mail-Adressen haben, haben Ihre Ergebnisse 1.283 Zeilen.

Der zuletzt ausgeführte = der, der zählt.

Wenn Sie das "& gt;" Zeichen, um alle obigen Ausgaben in eine Batch-Datei umzuleiten, d. h .:      > CountChars.bat

... dann rufen Sie einfach diese Batch-Datei & amp; Sie haben eine DOS-Umgebungsvariable namens "NumFound" mit Ihrer Antwort.

    
Corb 19.01.2018 06:08
quelle
0

So mache ich es, indem ich eine AND-Bedingung mit FINDSTR verwende (um die Anzahl der Fehler in einer Protokolldatei zu zählen):

%Vor%

HINWEIS: Dies zählt "Anzahl der Zeilen mit Übereinstimmung der Zeichenfolge" statt "Anzahl der gesamten Vorkommen in der Datei".

    
djangofan 06.06.2013 22:09
quelle
-1

Verwenden Sie dies:

%Vor%     
Quinlan Vos 28.03.2017 12:55
quelle