doppelte Zeilen in Dateien entfernen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
xcomm
Beiträge: 802
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

doppelte Zeilen in Dateien entfernen

Beitrag von xcomm » 18.10.2014 17:33:01

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

Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: doppelte Zeilen ind Dateien entfernen

Beitrag von detix » 18.10.2014 17:59:48

Sofern die Zeilen aufeinander folgen kann uniq (aus den Debiancoreutils) das völlig problemlos.

Edit: Hoppla, uniq steht ja schon da, vergesst diesen post einfach. :oops:
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!

uname
Beiträge: 12403
Registriert: 03.06.2008 09:33:02

Re: doppelte Zeilen ind Dateien entfernen

Beitrag von uname » 18.10.2014 19:43:36

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

tomi89
Beiträge: 269
Registriert: 21.08.2014 00:21:52

Re: doppelte Zeilen ind Dateien entfernen

Beitrag von tomi89 » 19.10.2014 00:10:26

Du meinst, du willst das Ergebnis in die gleiche Datei schreiben?

Code: Alles auswählen

uniq test.txt | tee test.txt
Oder:

Code: Alles auswählen

sort -u test.txt | tee test.txt

Benutzeravatar
Meillo
Moderator
Beiträge: 9236
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: doppelte Zeilen ind Dateien entfernen

Beitrag von Meillo » 19.10.2014 10:22:35

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?
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.

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
Dieses Beispiel geht ohne Hilfsdateien, da sort erst allen Input liest bevor es schreibt.

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!

Benutzeravatar
Meillo
Moderator
Beiträge: 9236
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: doppelte Zeilen ind Dateien entfernen

Beitrag von Meillo » 19.10.2014 10:34:12

tomi89 hat geschrieben:Du meinst, du willst das Ergebnis in die gleiche Datei schreiben?

Code: Alles auswählen

uniq test.txt | tee test.txt
Oder:

Code: Alles auswählen

sort -u test.txt | tee test.txt
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.)
Use ed once in a while!

wanne
Moderator
Beiträge: 7548
Registriert: 24.05.2010 12:39:42

Re: doppelte Zeilen in Dateien entfernen

Beitrag von wanne » 19.10.2014 21:40:17

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.

tomi89
Beiträge: 269
Registriert: 21.08.2014 00:21:52

Re: doppelte Zeilen ind Dateien entfernen

Beitrag von tomi89 » 19.10.2014 23:46:48

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.)
Das man das normalerweise nicht machen sollte hätte ich erwähnen müssen.

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.

uname
Beiträge: 12403
Registriert: 03.06.2008 09:33:02

Re: doppelte Zeilen in Dateien entfernen

Beitrag von uname » 20.10.2014 08:09:39

awk '!a[$0]++'
Wirklich genial. Muss man nur erst mal drauf kommen. Ist dir aber nicht selbst eingefallen, oder?

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.

Benutzeravatar
Meillo
Moderator
Beiträge: 9236
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: doppelte Zeilen in Dateien entfernen

Beitrag von Meillo » 21.10.2014 20:14:10

uname hat geschrieben:
awk '!a[$0]++'
Wirklich genial. Muss man nur erst mal drauf kommen. Ist dir aber nicht selbst eingefallen, oder?
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.
Use ed once in a while!

Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: doppelte Zeilen in Dateien entfernen

Beitrag von detix » 22.10.2014 10:06:46

uname hat geschrieben:...Ist dir aber nicht selbst eingefallen, oder?
So eine Aussage empfinde ich aber schon recht frech,
...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!

uname
Beiträge: 12403
Registriert: 03.06.2008 09:33:02

Re: doppelte Zeilen in Dateien entfernen

Beitrag von uname » 22.10.2014 10:33:47

War nicht frech gemeint. Wirklich. Der Link kommt auf meine Todo-Liste. Danke dafür.

Benutzeravatar
Meillo
Moderator
Beiträge: 9236
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: doppelte Zeilen in Dateien entfernen

Beitrag von Meillo » 24.10.2014 15:05:17

detix hat geschrieben:
uname hat geschrieben:...Ist dir aber nicht selbst eingefallen, oder?
So eine Aussage empfinde ich aber schon recht frech,
*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.
...zumal Meillo hier ein sehr interessantes Video zu ed, awk und sed eingestellt hat:
http://ulm.ccc.de/ChaosSeminar/2009/10_Softwareschaetze
Danke. :-)
Use ed once in a while!

Antworten