doppelte einträge aus textdatei entfernen mittels batch
hallo,
ich habe ein txt-file welches ich mittels einer for-schleife aus einem logfile nach suchkriterien extrahiere (ich poste das batchfile mal weiter unten).
leider stehen im logfile einträge doppelt drin. ich möchte aber jede zeile nur einmal haben.
sieht ungefähr so aus:
9:48:57 user1
9:48:57 user1
9:50:30 user4
9:50:30 user4
gibt es eine möglichkeit doppelte zeilen zu entfernen? evtl. schon im ersten batchfile ?
gruss
meckatzermichel
hier meine batch:
FOR /f "tokens=1,3,4,5" %%f IN (lmgrd.log) DO call :ausgabe %%f %%g %%h %%i
goto :eof
:ausgabe
if "%~2"=="DENIED:" echo %~2 %~3 %~1 %~4 >> logfileneu.txt
ich habe ein txt-file welches ich mittels einer for-schleife aus einem logfile nach suchkriterien extrahiere (ich poste das batchfile mal weiter unten).
leider stehen im logfile einträge doppelt drin. ich möchte aber jede zeile nur einmal haben.
sieht ungefähr so aus:
9:48:57 user1
9:48:57 user1
9:50:30 user4
9:50:30 user4
gibt es eine möglichkeit doppelte zeilen zu entfernen? evtl. schon im ersten batchfile ?
gruss
meckatzermichel
hier meine batch:
FOR /f "tokens=1,3,4,5" %%f IN (lmgrd.log) DO call :ausgabe %%f %%g %%h %%i
goto :eof
:ausgabe
if "%~2"=="DENIED:" echo %~2 %~3 %~1 %~4 >> logfileneu.txt
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 24446
Url: https://administrator.de/contentid/24446
Ausgedruckt am: 13.11.2024 um 09:11 Uhr
7 Kommentare
Neuester Kommentar
Moin meckatzermichel,
wenn ich Dich richtig verstehe, redest Du von Tages-Logfiles (im Logfile scheint ja nur die Zeitangabe zu stehen?) Ich kann Deine 4 Parameter schwer interpretiern, weil ich nur zwei sehe in dem Beispiel.
Egal, sinngemäß so:
::~~~~~~~
@echo off & setlocal
FOR /f "tokens=1,3,4,5" %%f IN (lmgrd.log) DO call :ausgabe %%f %%g %%h %%i
goto :eof
:ausgabe
goto :eof
:.~~~~~~~~
...wobei das "find "%~3 %~1 %~4" ... die suche nach den "doppelten" Werten sein soll.
Ich habe mal im Beispiel den Parameter %~2 weggelassen; der soll mal die Uhrzeit sein.
Hoffe, ich habe Dein Problem richtig verstanden, sonst mach btte noch mal den Zustand der Ausgangs-Logdatei deutlicher.
HTH Biber
wenn ich Dich richtig verstehe, redest Du von Tages-Logfiles (im Logfile scheint ja nur die Zeitangabe zu stehen?) Ich kann Deine 4 Parameter schwer interpretiern, weil ich nur zwei sehe in dem Beispiel.
Egal, sinngemäß so:
::~~~~~~~
@echo off & setlocal
FOR /f "tokens=1,3,4,5" %%f IN (lmgrd.log) DO call :ausgabe %%f %%g %%h %%i
goto :eof
:ausgabe
:.~~~~~~~~
...wobei das "find "%~3 %~1 %~4" ... die suche nach den "doppelten" Werten sein soll.
Ich habe mal im Beispiel den Parameter %~2 weggelassen; der soll mal die Uhrzeit sein.
Hoffe, ich habe Dein Problem richtig verstanden, sonst mach btte noch mal den Zustand der Ausgangs-Logdatei deutlicher.
HTH Biber
So, meckatzermichel,
langsam wird das Bild klarer - und der Batch greifbarer.
Wenn Du nur die Zeilen mit dem Text "DENIED" brauchst und nicht gerade Hunderttausende solche Zeilen in der Logdatei lmgrd.log sind, dann würde ich schon in der FOR/F-Anweisung oben eine "gefilterte" Daten(zeilen)menge erzeugen:
FOR /f "skip=2 tokens=1,3,4,5" %%f IN ('find "DENIED" lmgrd.log') DO ....
Einfach vorher testen: Von einer realistischen lmgrd.log mal vom CMD-Prompt aus ein
find "DENIED" lmgrd.log >DENIEDlines.txt
machen und danach die Größe der Datei prüfen.
Wenn deutlich kleiner als 1 MByte ->brauchst du keine Zwischendatei, sondern die oben abgebildete Find-in-Häkchen-Variante.
Wenn deutlich größer als 2 MByte--> dann als Zeile VOR die FOR /F-Schleife:
find "DENIED" lmgrd.log >%temp%\DENIEDlines.txt
FOR /f "tokens=1,3,4,5" %%f IN (%temp%\DENIEDlines.txt) DO call :ausgabe %%f %%g %%h %%i
goto :eof
so, unten in der "Sub-Routine" :ausgabe kommen 4 Parameter an
1= 9:50:30 Zeit
2= DENIED: -------->den haben alle Sätze
3= "programm"
4= UserN
und das soll in eine neue Logdatei namens logfileneu,txt in der Form/Reihenfolge 2.3,1,4, also
DENIED: "programm" 9.50:30 UserN
Also suchen wir doch vor dem Schreiben in die Logdatei nach diesem String.
So, all in all können wir Deinen Bätch also ein bisschen vereinfachen:
::~~~~~~~
@echo off & setlocal
find "DENIED" lmgrd.log >%temp%\DENIEDlines.txt
FOR /f "tokens=1,3,4,5" %%f IN (%temp%\DENIEDlines.txt) DO call :ausgabe %%g %%h %%f %%i
goto :eof
:ausgabe
:: frei übersetzt: FINDE die Zeile "...." ODER schreibe sie neu.
goto :eof
:.~~~~~~~~
HTH Biber
langsam wird das Bild klarer - und der Batch greifbarer.
Wenn Du nur die Zeilen mit dem Text "DENIED" brauchst und nicht gerade Hunderttausende solche Zeilen in der Logdatei lmgrd.log sind, dann würde ich schon in der FOR/F-Anweisung oben eine "gefilterte" Daten(zeilen)menge erzeugen:
FOR /f "skip=2 tokens=1,3,4,5" %%f IN ('find "DENIED" lmgrd.log') DO ....
Einfach vorher testen: Von einer realistischen lmgrd.log mal vom CMD-Prompt aus ein
find "DENIED" lmgrd.log >DENIEDlines.txt
machen und danach die Größe der Datei prüfen.
Wenn deutlich kleiner als 1 MByte ->brauchst du keine Zwischendatei, sondern die oben abgebildete Find-in-Häkchen-Variante.
Wenn deutlich größer als 2 MByte--> dann als Zeile VOR die FOR /F-Schleife:
find "DENIED" lmgrd.log >%temp%\DENIEDlines.txt
FOR /f "tokens=1,3,4,5" %%f IN (%temp%\DENIEDlines.txt) DO call :ausgabe %%f %%g %%h %%i
goto :eof
so, unten in der "Sub-Routine" :ausgabe kommen 4 Parameter an
1= 9:50:30 Zeit
2= DENIED: -------->den haben alle Sätze
3= "programm"
4= UserN
und das soll in eine neue Logdatei namens logfileneu,txt in der Form/Reihenfolge 2.3,1,4, also
DENIED: "programm" 9.50:30 UserN
Also suchen wir doch vor dem Schreiben in die Logdatei nach diesem String.
So, all in all können wir Deinen Bätch also ein bisschen vereinfachen:
::~~~~~~~
@echo off & setlocal
find "DENIED" lmgrd.log >%temp%\DENIEDlines.txt
FOR /f "tokens=1,3,4,5" %%f IN (%temp%\DENIEDlines.txt) DO call :ausgabe %%g %%h %%f %%i
goto :eof
:ausgabe
goto :eof
:.~~~~~~~~
HTH Biber
Uuups, ja, meckatzermichel,
die Striche kommen vom find.
Abhilfe (hab ich im letzten Kommentar unten vergessen):
Vor das Wort "Tokens=.." noch ein "skip=2".
Oben im Posting stehts noch:
FOR /f "skip=2 tokens=1,3,4,5" %%f IN ('find "DENIED" lmgrd.log') DO ....
Denn der Output von Find.... na, probiers selbst am CMD-Prompt...
Über das Thema "Gemeinsam Bierchen trinken" können wir gerne reden....
Biber, der Becks-Trinker aus Bremen
[Edit]
Hey, da hab ich ja eine gute Quelle aufgetan..
Na ja, ich brauch ohnehin nur zwei Becks für einen Vollrausch..
...also bekommen wir das mit Meckatzer Löwenbräu auch noch finanziell hin..
Vorher zu klären wäre nur noch:
Du bist doch aber kein FC-Bayern-Fan, oder?? *misstrauisch guck
[/Edit]
die Striche kommen vom find.
Abhilfe (hab ich im letzten Kommentar unten vergessen):
Vor das Wort "Tokens=.." noch ein "skip=2".
Oben im Posting stehts noch:
FOR /f "skip=2 tokens=1,3,4,5" %%f IN ('find "DENIED" lmgrd.log') DO ....
Denn der Output von Find.... na, probiers selbst am CMD-Prompt...
Über das Thema "Gemeinsam Bierchen trinken" können wir gerne reden....
Biber, der Becks-Trinker aus Bremen
[Edit]
guck mal hier: www.meckatzer.de
leider wird das immer teurer, so dass ich jetzt auf mönchshof lager umsteig
...also bekommen wir das mit Meckatzer Löwenbräu auch noch finanziell hin..
Vorher zu klären wäre nur noch:
Du bist doch aber kein FC-Bayern-Fan, oder?? *misstrauisch guck
[/Edit]
Hallo Administratoren,
ist zwar schon etwas veraltet der thread, aber mein neuer würde ein ähnliches thema behandeln, deshalb kommts mal hier rein.
Ich habe eine datei die 200 000 000 000 email adressen enthält (nur ein beispiel!). eine pro zeile. für den unwahrscheinlichen fall, dass eine doppelt drin ist, möchte ich eine davon löschen, sodass jede nur noch einmal vorhanden ist. was hier schon steht klappt bei meiner anwendung irgendwie nicht. auch nicht, wenn ich nur einen token pro zeile habe.
bitte helft mir, ich steig bei dem da oben nicht so recht durch.
danke schön
edit:
hat sich erledigt. bin auf uniq.exe gestoßen (http://david.tribble.com/dos/uniq.exe).
ist zwar schon etwas veraltet der thread, aber mein neuer würde ein ähnliches thema behandeln, deshalb kommts mal hier rein.
Ich habe eine datei die 200 000 000 000 email adressen enthält (nur ein beispiel!). eine pro zeile. für den unwahrscheinlichen fall, dass eine doppelt drin ist, möchte ich eine davon löschen, sodass jede nur noch einmal vorhanden ist. was hier schon steht klappt bei meiner anwendung irgendwie nicht. auch nicht, wenn ich nur einen token pro zeile habe.
bitte helft mir, ich steig bei dem da oben nicht so recht durch.
danke schön
edit:
hat sich erledigt. bin auf uniq.exe gestoßen (http://david.tribble.com/dos/uniq.exe).