malleetje
Goto Top

txt-Datei mit mehrere gleiche Zeilen durchsuchen und jeweils einmal ausgeben

Hallo,

habe folgendes Problem: ich möchte aus einen Text die mehrmals gleiche Einträge hat jeweils eins dieser Einträge rausfiltern und in eine andere .txt abspeichern mittel eine Batch-Datei.

Die Daten sehen wie folgt aus:
(Beispiel)
Opel Astra Caravan (1,6)
Opel Astra Caravan (2,0)
Opel Astra Wimbledon (1,6)
Opel Astra Caravan (1,6)
Opel Astra Caravan (2,0)
Opel Astra Caravan (1,6)

In die erstellte Datei sollte dann stehen:
Opel Astra Caravan (1,6)
Opel Astra Caravan (2,0)
Opel Astra Wimbledon (1,6)

Wie wird dass gemacht?

Gruß,

malleetje

Content-Key: 82964

Url: https://administrator.de/contentid/82964

Printed on: April 19, 2024 at 11:04 o'clock

Member: bastla
bastla Mar 12, 2008 at 14:05:43 (UTC)
Goto Top
Hallo malleetje und willkommen im Forum!

Versuch es so:
@echo off & setlocal
set "Quelle=D:\Liste.txt"  
set "Ziel=D:\ListeOhneDuplikate.txt"  

echo.>nul 2>"%Ziel%"  
for /f "usebackq delims=" %%i in ("%Quelle%") do findstr /b /e /c:"%%i">nul "%Ziel%" || echo %%i>>"%Ziel%"  

Grüße
bastla
Member: miniversum
miniversum Mar 12, 2008 at 14:22:55 (UTC)
Goto Top
Versuchs mal damit:

Ups zu lange getippt.... hmm....
Member: bastla
bastla Mar 12, 2008 at 14:30:29 (UTC)
Goto Top
@miniversum

Falls die Liste zB so
Opel Astra Caravan (1,6)
Opel Astra Caravan (2,0) S
Opel Astra Wimbledon (1,6)
Opel Astra Caravan (2,0)
Opel Astra Caravan (1,6)
Opel Astra Caravan (2,0)
Opel Astra Caravan (1,6)
aussähe, bliebe "Opel Astra Caravan (2,0)" auf der Strecke ...

Grüße
bastla
Member: Biber
Biber Mar 13, 2008 at 19:46:04 (UTC)
Goto Top
Moin malleetje, bastla und miniversum,

wenn ich die Aufgabenstellung richtig lese (...in der erstellten Datei soll stehen...),
dann würde ich noch einen SORT reinbringen und es am CMD-Prompt so abfeuern:
>Set q=QuellListe.txt
>Set z=ZielListe.txt
>echo\>nul 2>%z%
>for /f "delims=" %i in ('sort %Q%') do @find "%i" "%Z%">nul || @echo %i>>%z%  

(=20:35:10  D:\temp=)
>type %z%
Opel Astra Caravan (1,6)
Opel Astra Caravan (2,0)
Opel Astra Caravan (2,0) S  [##bastla's Sonderfall##] 
Opel Astra Wimbledon (1,6)

[OT, aber doch ganz passend hier]
Ein neuer M$-CMD-Bug tritt neuerdings (seit irgendeinem KB-Update??) auf, zumindest auf XP-Rechnern:
Ein "echo." funktioniert nicht mehr zum Leerzeilen-Ausgeben.
>echo.>%z%
Der Befehl "echo." ist entweder falsch geschrieben oder  
konnte nicht gefunden werden.
Statt des Punktes "." direkt nach dem "echo" kann aber nach wie vor eines der anderen bisher funktionierenden undokumentierten Zeichen ("\", "?", .....) verwendet werden, um eine "leere Zeile" auszugeben.
Die Variante, die ich oben verwendet habe...
echo\>nul 2>%z%
...schreibt auch tatsächlich eine 0-Byte-Datei statt eine 2-Byte-Datei mit CRLF.
[/OT]

Grüße
Biber
Member: bastla
bastla Mar 13, 2008 at 20:35:18 (UTC)
Goto Top
@Biber

Auch wenn ich aus dem dargestellten Beispiel die Anforderung "Sortierung" nicht unmittelbar entnehmen kann, ist die Verwendung von "sort" eine elegante Möglichkeit, den "Sonderfall" zu berücksichtigen - die kürzeren (und damit in einer anderen Zeile möglicherweise enthaltenen) Zeilen werden zuerst verarbeitet.

Alternativ wäre man/frau mit "findstr /x" (besser, als in meinem Ansatz oben mit "/b /e") nicht auf die richtige Reihenfolge angewiesen ...
Ein neuer M$-CMD-Bug ...
Den kannte ich noch nicht - damit werden sicher viele ihre Freude haben ...

Grüße
bastla
Member: Biber
Biber Mar 14, 2008 at 08:34:50 (UTC)
Goto Top
Moin bastla,

Den kannte ich noch nicht - damit werden sicher viele ihre Freude haben ...
Oh ja, ich kann diesen Bug jeden Morgen beim Ausführen der Logon-Skripte bewundern...
...seitenweise 'Der Befehl "echo." ist entweder falsch geschrieben...'

Okay, für den Fall oben (leere Zieldatei erzeugen) könnten wir vielleicht ein schlichtes "Type nul>%z%" verwenden,
statt uns mit so so überkandidelten ECHO-Varianten rumzubalgen.

Aber einen ECHO-Bug habe ich noch... zu dem bei Chattern und auch hier im Forum so beliebten Doppel-Caret ("")

Try this...
<code(= 9:29:21 D:\temp=)
echoworks as planned
works as planned

(= 9:30:06 D:\temp=)
echo ^ works as designed
works as designed

(= 9:30:27 D:\temp=)
echo "works as planned"
"works as planned"

(= 9:30:41 D:\temp=)
call echo "works as designed"
"^^ works as designed"


Na ja, M$ und seine PraktikantInnen....

Grüße
Biber

@malleetje
BTW, von diesen Anekdoten abgesehen: war ein Lösungsansatz für Dich dabei?
Member: malleetje
malleetje Mar 14, 2008 at 10:07:13 (UTC)
Goto Top
Hallo,

Versuch es so:
@echo off & setlocal
> set "Quelle=D:\Liste.txt"  
> set
> "Ziel=D:\ListeOhneDuplikate.txt"  
> 
> echo.>nul 2>"%Ziel%"  
> for /f "usebackq delims=" %%i in  
> ("%Quelle%") do findstr /b /e  
> /c:"%%i">nul "%Ziel%"  
> || echo %%i>>"%Ziel%"  
> 

Grüße
bastla

hat das gewünschte Ergebnis gebracht, vielen Dank für die Hilfe! Jetzt habe ich noch eine andere Frage:
die Befehle

start /b xxxxx.exe
SET "test5=C:\Programme\xxxxx\xxxxx.txt"
findstr /c:"Model" %test5% >> %Ziel%
TASKKILL /IM xxxxx.exe

geben mir die benötigte Informationen, allerdings kommt im DOS-Fenster

ERFOLGREICH: Der Prozess "xxxxx.exe" mit PID 1960 wurde beendet.

Kann man den Befehl so gestalten dass diese Meldung nicht gezeigt wird?

Gruß,

M.
Member: malleetje
malleetje Mar 14, 2008 at 10:09:20 (UTC)
Goto Top
Hallo,

bin noch nichtso vertraut mit dem Forum, habe leider mein Antwort etwas weiter oben gepostet...

in Kürzen: es hat geklappt!

Gruß,

M.
Member: miniversum
miniversum Mar 14, 2008 at 11:36:56 (UTC)
Goto Top
Ändere
TASKKILL /IM xxxxx.exe
in
TASKKILL /IM xxxxx.exe>NUL

Durch das >NUL werden Ausgaben unterdrückt (ins nichts umgeleitet). FehlerMeldungen werden trotzdem ausgegeben.
Member: Biber
Biber Mar 14, 2008 at 11:39:34 (UTC)
Goto Top
Moin malleetje,

danke für die Rückmeldung.
bin noch nichtso vertraut mit dem Forum
Um etwas vertrauter mit diesem Forum zu werden, setze doch bitte diesen Beitrag auf "Gelöst" (anmelden, Beitrag editieren, Häkchen setzen). *gg

Zu Deiner Ach-da-fällt-mir-noch-was-ein-Frage:

Du kann die Bildschirm- und Fehlerausgaben aller CMD-Befehle umleiten.
taskkill /IM whatever.exe >nul 2>&1
würde sowohl Bildschirmmeldungen wie auch Fehlernachrichten unterdrücken.
Wenn nur Erfolgsmeldungen unterdrückt werden, aber Fehlerinfos erscheinen sollen:
taskkill /IM whatever.exe >nul

Grüße
Biber
Member: malleetje
malleetje Mar 14, 2008 at 13:45:55 (UTC)
Goto Top
[....]
Hallo Biber,

hat geklappt!

Danke

Wenn ich jetzt noch das Häckchen für "Gelöst" finden würde...

[Edit Biber] An der Stelle [...] Komplett-Zitat des vorangegangenen Kommentars gelöscht.[/Edit]
Member: bastla
bastla Mar 14, 2008 at 20:55:35 (UTC)
Goto Top
Hallo malleetje!

Wenn ich jetzt noch das Häckchen für "Gelöst" finden würde...
Wie schon bei Biber zu lesen:
... anmelden, Beitrag editieren, Häkchen setzen
bzw auch How can I mark a post as solved?

Grüße
bastla

P.S.: Da die Darstellung der Kommentare hier recht übersichtlich ist, genügt es zumeist, nur kurze (und vor allem relevante) Teile vorhergehender Posts zu zitieren ...