Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Mit Batchdatei aus einer .txt alle doppelten Zeilen (Duplikate) komplett löschen

Frage Entwicklung Batch & Shell

Mitglied: alfabravo

alfabravo (Level 1) - Jetzt verbinden

27.05.2009, aktualisiert 20:44 Uhr, 17031 Aufrufe, 6 Kommentare

Hallo Admins,

ich müsste mittels Batchdatei (!) folgendes Problem lösen:

Eine Textdatei Daten.txt hat folgenden Inhalt:

11111111
22222222
33333333
44444444
55555555
55555555
22222222

Nun sollen alle Zeilen, die doppelt vorkommen, KOMPLETT gelöscht werden - oder alternativ: alle Zeilen, die einmal vorkommen, in eine neue Datei geschrieben werden. Das Ergebnis soll jedenfalls so aussehen:


11111111
33333333
44444444


Mit folgendem Code werden zumindest alle Duplikate gelöscht:

@echo off & setlocal 
set "Datei=Daten.txt" 
set "Bak=.bak" 
set /a LineNo=0 
 
move "%Datei%" "%Datei%%Bak%" 
copy nul "%Datei%">nul 
for /f "usebackq delims=" %%i in ("%Datei%%Bak%") do set "Zeile=%%i" & call :ProcessLine 
del "%Datei%%Bak%" 
goto :eof 
 
:ProcessLine 
set /a LineNo+=1 
echo Validiere Zeile %LineNo% ... 
findstr /b /c:"%Zeile:~,8%" "%Datei%">nul || >>"%Datei%" echo %Zeile% 
goto :eof
Doch das Ergebnis sieht so aus:

11111111
22222222
33333333
44444444
55555555

Das war allerdings nicht das was ich erreichen wollte, siehe oben.

Hat jemand eine Idee für dieses knifflige Problem? Ich komme da nicht so recht weiter ... Und wie gesagt, es müsste mittels Batchdatei laufen.

Vielen Dank & Gruß
Mitglied: bastla
27.05.2009 um 21:29 Uhr
Hallo alfabravo und willkommen im Forum!

Du könntest es mit einem zweiten Durchlauf versuchen - im Prinzip etwa so:
01.
@echo off & setlocal  
02.
set "Datei=Daten.txt" 
03.
set "Bak=.bak" 
04.
set "TempDatei=%temp%\TempDatei.txt" 
05.
set "Duplikate=%temp%\Duplikate.txt" 
06.
set /a LineNo=0  
07.
 
08.
move "%Datei%" "%Datei%%Bak%" 
09.
copy nul "%Duplikate%">nul 
10.
copy nul "%TempDatei%">nul 
11.
 
12.
for /f "usebackq delims=" %%i in ("%Datei%%Bak%") do set "Zeile=%%i" & call :ProcessLine 
13.
for /f "usebackq delims=" %%i in ("%TempDatei%") do set "Zeile=%%i" & call :ProcessLine2 
14.
 
15.
del "%Datei%%Bak%"  
16.
del "%Duplikate%" 
17.
del "%TempDatei%" 
18.
goto :eof  
19.
 
20.
:ProcessLine  
21.
set /a LineNo+=1  
22.
echo Validiere Zeile %LineNo% ...  
23.
findstr /b /c:"%Zeile:~,8%" "%TempDatei%">nul && >>"%Duplikate%" echo %Zeile% || >>"%TempDatei%" echo %Zeile% 
24.
goto :eof 
25.
 
26.
:ProcessLine2  
27.
findstr /b /c:"%Zeile:~,8%" "%Duplikate%">nul || >>"%Datei%" echo %Zeile% 
28.
goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: alfabravo
27.05.2009 um 22:29 Uhr
Hallo bastla,

Deine Lösung ist perfekt, genau das habe ich gesucht. Vielen Dank !!!

Gruß, alfabravo
Bitte warten ..
Mitglied: LotPings
27.05.2009 um 22:50 Uhr
Hallo bastla,

der findstr /V /G:datei wird doch immer wieder unterschätzt

01.
:: RemoveDupes.cmd ::::::::::::::::::::::::::::::::::::::::::::::::: 
02.
@echo off & setlocal EnableDelayedExpansion 
03.
set "Datei=test.txt" 
04.
set "Bak=.bak" 
05.
set "Duplikate=%temp%\Duplikate.txt" 
06.
move "%Datei%" "%Datei%%Bak%" 
07.
copy nul "%Duplikate%">nul 
08.
If defined LastLine Set "LastLine=" 
09.
 
10.
for /f "delims=" %%A in ('Sort ^<"%Datei%%Bak%" ') do ( 
11.
  If /i "!LastLine!"=="%%A" (Echo/%%A)>>"%Duplikate%" 
12.
  set "LastLine=%%A" 
13.
14.
findstr /V /G:"%Duplikate%" <"%Datei%%Bak%" >"%Datei%" 
15.
del "%Duplikate%" 
Gruß
LotPings
Bitte warten ..
Mitglied: bastla
27.05.2009 um 23:02 Uhr
@LotPings
der findstr /V /G:datei wird doch immer wieder unterschätzt
Mitnichten - hatte es (allerdings ohne Umleitung für die Eingabe, sondern mit direkter Angabe) versucht und weiß noch immer nicht, warum es nicht so wie ich wollte - deshalb die weniger elegante, aber immerhin funktionierende Version ...

Grüße
bastla
Bitte warten ..
Mitglied: Biber
28.05.2009 um 08:29 Uhr
Moin LotPings,

da hätte ich aber noch einen Verbesserungsvorschlag....

In (mindestens) zwei Fällen wird sich der Starter Deines Schnipsels eventuell ein kleines bisschen ärgern:
  • wenn eine Zeile in der Textdatei enthalten ist, die der FindStr.exe irgendwie zu lang zum Suchen erscheint (führt zu Fehler: "FINDSTR: Suchzeichenfolge zu lang.")
  • oder, viel wahrscheinlicher: es gibt nun gar keine Duplikate in der Originaldatei. (Führt zu Fehler: "FINDSTR: Keine Suchzeichenfolge")

In diesen beiden und allen anderen Fällen, in denen FindStr abgrätscht hinterlässt der obige Batch eine Fehlermeldung auf dem Bildschirm und eine Originaldatei (bzw. Datei mit dem Namen der Originaldatei) in der Größe von 0 Byte.

Deshalb würde ich noch eine minimale Fehlerbehandlung einbauen:
01.
:: RemoveDups.cmd ::::::::::::::::::::::::::::::::::::::::::::::::: 
02.
@echo off & setlocal EnableDelayedExpansion 
03.
set "Datei=duptest.txt" 
04.
set "Bak=.bak" 
05.
set "Duplikate=%temp%\Duplikate.txt" 
06.
move "%Datei%" "%Datei%%Bak%" 
07.
copy nul "%Duplikate%">nul 
08.
If defined LastLine Set "LastLine=" 
09.
 
10.
for /f "delims=" %%A in ('Sort ^<"%Datei%%Bak%" ') do ( 
11.
  If /i "!LastLine!"=="%%A" (Echo/%%A)>>"%Duplikate%" 
12.
  set "LastLine=%%A" 
13.
14.
findstr /V /G:"%Duplikate%" <"%Datei%%Bak%" >"%Datei%" 
15.
if errorlevel 1 ( 
16.
    Echo Fehler aufgetreten - Originaldatei wird wiederhergestellt. 
17.
    dir "%datei%"|find /i "%datei%" & type "%datei%" & pause 
18.
    move "%Datei%%Bak%" "%Datei%" 
19.
)     
20.
del "%Duplikate%" 
Der Kurztest am CMD-Prompt.
01.
>type duptest.txt 
02.
11111111 
03.
33333333 
04.
44444444 
05.
 
06.
>e:\schnipsel\RemoveDups.cmd 
07.
FINDSTR: Keine Suchzeichenfolge 
08.
Fehler aufgetreten - Originaldatei wird wiederhergestellt. 
09.
28.05.09  08:27                 0 duptest.txt 
10.
Drücken Sie eine beliebige Taste . . . 
11.
 
12.
>dir duptest.txt|find "duptest" 
13.
28.05.09  08:15                30 duptest.txt
Grüße
Biber
Bitte warten ..
Mitglied: LotPings
28.05.2009 um 11:01 Uhr
Zitat von Biber:
da hätte ich aber noch einen Verbesserungsvorschlag....
Immer gerne gesehen

Eine Umkehrung der Logik sscheint mir aber sinnvoller,
die neue Datei ersetzt nur dann die alte wenn kein Fehler aufgetreten ist.
Extra ein bisschen kryptischer und kürzer aber auch komfortabler.
01.
:: RemoveDupes.cmd ::::::::::::::::::::::::::::::::::::::::::::::::: 
02.
@cls&echo off&setlocal EnableDelayedExpansion 
03.
if Not Exist \"%~1\" (Echo Usage: %~nx0 Dubletten.txt&Pause&Exit /b 0) 
04.
(copy nul \"%~f1.Dup%\">nul)&set cnt=0&If defined LL Set \"LL=\" 
05.
for /f \"delims=\" %%A in (\'Sort ^<\"%~f1\" \') do ( 
06.
If /i \"!LL!\"==\"%%A\" (Echo/%%A)>>\"%~f1.Dup\" 
07.
set \"LL=%%A\"&Set /A cnt+=1) 
08.
IF %cnt% GTR 0 findstr /V /G:\"%~f1.Dup\" <\"%~f1\" >\"%~f1.new\"&&(Move /Y \"%~f1.new\" \"%~f1\">NUL)||Echo Fehler! %~f0 unverändert 
09.
For %%A in (new Dup) do del \"%~f1.%%A\" >NUL 2>&1
Gruß
LotPings
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Doppelte Zeilen in Text-Datei löschen
gelöst Frage von reckheimBatch & Shell15 Kommentare

Hallo ich schreibe lange Übersetzungsprogramme in FoxPro in unten folgender Text-Datei-Form. Die Datei ist allerdings durch Zusammenführung verschiedener Versionen ...

Windows 7
Ordnerstrukturen vergleichen und Duplikate löschen
gelöst Frage von SarekHLWindows 71 Kommentar

Hallo zusammen, kennt jemand ein Programm, um zwei Ordnerstrukturen zu vergleichen und aus einer der beiden alle nach Name, ...

Batch & Shell
Batch datei zum duplikate löschen
gelöst Frage von M4xx-oneBatch & Shell5 Kommentare

Hallo Gemeinde ich hab ein problem ich möchte mittels batchdatei eine TXT datei aufräumen die datei hat folgende eintäge ...

Batch & Shell
Duplikate löschen - funktioniert nicht...
Frage von UHU-sticBatch & Shell3 Kommentare

Hallo Ihr Admins, habe gemäß der Lösung von Biber vom 28.05.2009 um 08:29 Uhr : versucht Duplikate aus einer ...

Neue Wissensbeiträge
Apple

IOS 11.2.1 stopft HomeKit-Remote-Lücke

Tipp von BassFishFox vor 1 TagApple

Das Update für iPhone, iPad und Apple TV soll die Fernsteuerung von Smart-Home-Geräten wieder in vollem Umfang ermöglichen. Apple ...

Windows 10

Windows 10 v1709 EN murkst bei den Regionseinstellungen

Tipp von DerWoWusste vor 1 TagWindows 10

Dieser kurze Tipp richtet sich an den kleinen Personenkreis, der Win10 v1709 EN-US frisch installiert und dabei die englische ...

Webbrowser

Kein Ton bei Firefox Quantum über RDP

Tipp von Moddry vor 1 TagWebbrowser

Hallo Kollegen! Hatte das Problem, dass der neue Firefox bei mir auf der Kiste keinen Ton hat, wenn ich ...

Internet

EU-DSGVO: WHOIS soll weniger Informationen liefern

Information von sabines vor 1 TagInternet4 Kommentare

Wegen der europäische Datenschutzgrundverordnung stehen die Prozesse um die Registrierung von Domains auf dem Prüfstand. Sollte die Forderungen umgesetzt ...

Heiß diskutierte Inhalte
Windows Server
RODC kann nicht aus Domäne entfernt werden
Frage von NilsvLehnWindows Server18 Kommentare

HAllo, ich arbeite in einem Universitätsnetzwerk mit 3 Standorten. Die Standorte haben alle ein ESXi Cluster und auf diesen ...

Hardware
Kein Bild mit nur einer bestimmten Grafikkarten - Mainboard Konfiguration
gelöst Frage von bestelittHardware18 Kommentare

Hallo zusammen, ich hatte schon einmal eine ähnliche Frage gestellt. Damals hatte ich genau das gleiche Problem. Allerdings lies ...

Netzwerkmanagement
Mehrere Netzwerkadapter in einem PC zu einem Switch zusammenfügen
Frage von prodriveNetzwerkmanagement16 Kommentare

Hallo zusammen Vorweg, ich konnte schon einige IT-Probleme mit Hilfe dieses Forums lösen. Wirklich klasse hier! Doch für das ...

Hardware
Links klick bei Maus funktioniert nicht
gelöst Frage von Pablu23Hardware16 Kommentare

Hallo erstmal. Ich habe ein Problem mit meiner relativ alten maus jedoch denke ich nicht das es an der ...