doppelte Zeilen in Dateien entfernen
doppelte Zeilen in Dateien entfernen
Hi Gemeinde,
habe leider bei ein Paar Dateien durch einen in Place Replace mit sed doppelte Zeilen produziert (Zeilen mit gleichem Inhalt.
Wie würde man das entfernen können? Ginge das mit sed selbst, dass man das erste Auftreten entfernt, oder geht das nicht, weil es um 2 Zeilen geht?
(Vielleicht ginge auch uniq, aber dann müsste ich die Dateien in eine neue Schreiben.)
Danke, xcomm
habe leider bei ein Paar Dateien durch einen in Place Replace mit sed doppelte Zeilen produziert (Zeilen mit gleichem Inhalt.
Wie würde man das entfernen können? Ginge das mit sed selbst, dass man das erste Auftreten entfernt, oder geht das nicht, weil es um 2 Zeilen geht?
(Vielleicht ginge auch uniq, aber dann müsste ich die Dateien in eine neue Schreiben.)
Danke, xcomm
Re: doppelte Zeilen ind Dateien entfernen
Sofern die Zeilen aufeinander folgen kann uniq (aus den coreutils) das völlig problemlos.
Edit: Hoppla, uniq steht ja schon da, vergesst diesen post einfach.
Edit: Hoppla, uniq steht ja schon da, vergesst diesen post einfach.
Zuletzt geändert von detix am 19.10.2014 08:00:14, insgesamt 1-mal geändert.
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!
Macht ohne Haftung funktioniert nicht!
Re: doppelte Zeilen ind Dateien entfernen
Mal eine awk-Lösung. Funktioniert auch nur bei zwei aufeinanderfolgenden gleichen Zeilen.
Code: Alles auswählen
awk '{if ($0 != a) {print};a=$0}' test.txt
Re: doppelte Zeilen ind Dateien entfernen
Du meinst, du willst das Ergebnis in die gleiche Datei schreiben?
Oder:
Code: Alles auswählen
uniq test.txt | tee test.txt
Code: Alles auswählen
sort -u test.txt | tee test.txt
Re: doppelte Zeilen ind Dateien entfernen
Es ist immer unguenstig, das erste Auftreten zu entfernen, da man da noch nicht weiss, ob ein zweites kommt. Viel einfacher ist es, jedes zweite bzw. weitere Auftreten zu ignorieren.xcomm hat geschrieben: Wie würde man das entfernen können? Ginge das mit sed selbst, dass man das erste Auftreten entfernt, oder geht das nicht, weil es um 2 Zeilen geht?
Wichtige Vorueberlegung: Ist die Reihenfolge der Zeile in der Datei relevant? Und falls ja, in welcher Weise?
Wenn die Reihenfolge naemlich egal ist, dann kannst du's einfach so machen:
Code: Alles auswählen
<file sort -u -o file
Aber sind Hilfsdateien denn so schlimm? Falls nichts, dann macht das den Code fast immer einfacher.
Hier noch einmal ein awk-Script, das `uniq' implementiert, ohne dass die Datei davor sortiert sein muss (bei grossen Dateien braucht das viel Arbeitsspeicher):
Code: Alles auswählen
awk '!a[$0]++'
Use ed once in a while!
Re: doppelte Zeilen ind Dateien entfernen
ACHTUNG: Beide Befehle sorgen dafuer, dass die Datei test.txt nacher *leer* ist!tomi89 hat geschrieben:Du meinst, du willst das Ergebnis in die gleiche Datei schreiben?
Oder:Code: Alles auswählen
uniq test.txt | tee test.txt
Code: Alles auswählen
sort -u test.txt | tee test.txt
So einfach geht das naemlich nicht. Man darf derartige Konstrukte (lesen aus der Datei in der am Ende der Pipeline geschrieben wird) nur dann einsetzen, wenn das schreibende Programm allen Input puffert bevor es die Datei zum Schreiben oeffnet. (`sort -o' macht das.)
Sowas funktioniert uebrigens nie: `<file programm >file'. (Die Shell trunkiert dabei file bevor das programm daraus lesen kann.)
Use ed once in a while!
Re: doppelte Zeilen in Dateien entfernen
Ich würde mit extra datei machen
Code: Alles auswählen
uniq test.txt > /tmp/buff
mv /tmp/buff uniq test.txt
rot: Moderator wanne spricht, default: User wanne spricht.
Re: doppelte Zeilen ind Dateien entfernen
Das man das normalerweise nicht machen sollte hätte ich erwähnen müssen.Meillo hat geschrieben:ACHTUNG: Beide Befehle sorgen dafuer, dass die Datei test.txt nacher *leer* ist!
So einfach geht das naemlich nicht. Man darf derartige Konstrukte (lesen aus der Datei in der am Ende der Pipeline geschrieben wird) nur dann einsetzen, wenn das schreibende Programm allen Input puffert bevor es die Datei zum Schreiben oeffnet. (`sort -o' macht das.)
Sowas funktioniert uebrigens nie: `<file programm >file'. (Die Shell trunkiert dabei file bevor das programm daraus lesen kann.)
Aber bei mir funktioniert das in diesem Fall perfekt, mit uniq.
Bei sort könnte man wieder sowas wie uniq -d nicht umsetzen.
Zuletzt geändert von tomi89 am 22.10.2014 00:31:18, insgesamt 2-mal geändert.
Re: doppelte Zeilen in Dateien entfernen
Wirklich genial. Muss man nur erst mal drauf kommen. Ist dir aber nicht selbst eingefallen, oder?awk '!a[$0]++'
Für die Performance habe ich mal 1.000.000 Zufallszahlen (Zeilen) erzeugt und zählen lassen wie viel verschiedene Zahlen es waren (32768). awk ist weit schneller mit nur 3 statt 20 Sekunden. "sort -u" vs. "sort|uniq" spielte kaum eine Rolle. Wie werte ich den RAM-Verbrauch aus? Wobei die Testdatei war auch nur 5 MB groß. Ist wohl erst bei größeren Dateien wirklich relevant.
Re: doppelte Zeilen in Dateien entfernen
Ich hab's auf der suckless-Mailingliste gesehen. Allerdings finde ich den Ansatz fuer die awk-Denkweise nicht ungewoehnlich, insofern wuerde ich nicht sagen, dass ich und andere nicht auch zur gleichen Loesung gekommen waeren, wenn wir danach gesucht haette bevor wir sie gesehen haben.uname hat geschrieben:Wirklich genial. Muss man nur erst mal drauf kommen. Ist dir aber nicht selbst eingefallen, oder?awk '!a[$0]++'
Use ed once in a while!
Re: doppelte Zeilen in Dateien entfernen
So eine Aussage empfinde ich aber schon recht frech,uname hat geschrieben:...Ist dir aber nicht selbst eingefallen, oder?
...zumal Meillo hier ein sehr interessantes Video zu ed, awk und sed eingestellt hat:
http://ulm.ccc.de/ChaosSeminar/2009/10_Softwareschaetze
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!
Macht ohne Haftung funktioniert nicht!
Re: doppelte Zeilen in Dateien entfernen
War nicht frech gemeint. Wirklich. Der Link kommt auf meine Todo-Liste. Danke dafür.
Re: doppelte Zeilen in Dateien entfernen
*lol* Ach, da braucht ihr euch keine Sorgen machen. Ich fand die Frage ganz in Ordnung. Ich hatte nicht den Eindruck, dass man mein Wissen anzweifeln wuerde ... und selbst wenn, dann duerfte man trotzdem fragen.detix hat geschrieben:So eine Aussage empfinde ich aber schon recht frech,uname hat geschrieben:...Ist dir aber nicht selbst eingefallen, oder?
Danke....zumal Meillo hier ein sehr interessantes Video zu ed, awk und sed eingestellt hat:
http://ulm.ccc.de/ChaosSeminar/2009/10_Softwareschaetze
Use ed once in a while!