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
Mit dem, was Sie haben, könnten Sie die Ergebnisse über eine find
pipen. Ich habe so etwas von Zeit zu Zeit gesehen.
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.
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% Warum nicht einfach das verwenden (dies bestimmt die Anzahl der Zeilen, die (mindestens) ein @
char enthalten):
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):
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:
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.
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.
Tags und Links string command-line windows file find