Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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, 15636 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 ..
Neuester Wissensbeitrag
Festplatten, SSD, Raid

12TB written pro SSD in 2 Jahren mit RAID5 auf Hyper-VServer

Erfahrungsbericht von Lochkartenstanzer zum Thema Festplatten, SSD, Raid ...

Ähnliche Inhalte
Batch & Shell
Powershell - Zeilen in einer csv löschen bis (7)

Frage von Franz-Josef-II zum Thema Batch & Shell ...

Perl
gelöst Mit Perl aus einer Datei teilidentische Zeilen löschen (5)

Frage von Jeduja zum Thema Perl ...

Microsoft Office
gelöst Excel 2013 Duplikate löschen und Startzeile ermitteln VBA (5)

Frage von AlexIOT zum Thema Microsoft Office ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...