PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : erstes auftreten einer zeile löschen



ThorstenHirsch
03-02-2005, 13:42
Sers.

Folgendes Problem hab ich zu bewältigen:
ich hab' eine Datei, in der eine Zeile mehrmals vorkommen kann; es sollen alle Duplikate gelöscht werden außer einem: dem letzten*; die Reihenfolge der Zeilen darf nicht geändert werden; als Skriptsprache wird ksh verwendet; es _soll_ keine temporäre Datei benutzt werden.

Gruß
Thorsten

*=alternativ: nur das erste auftreten löschen

peschmae
03-02-2005, 17:22
bin jetzt gerade nicht auf Linux, versuchs trotzdem mal ungetestet (Schande über mich :D)

Sedscript:


/ZEILE/ {
d
q
}


MfG Peschmä

ThorstenHirsch
03-02-2005, 17:52
Hmm, nee, da verschwinden jetzt bei mir alle Zeilen mit ZEILE.
Aber ich hab's hiermit gelöst:

sed "0,/ZEILE/{//d;}/" /tmp/datei_mit_viel_ZEILE >> /tmp/datei_mit_1_ZEILE_weniger

P.S.: Trotzdem DANKE!

peschmae
03-02-2005, 18:51
Soviel zum thema keine temporäre Datei ;)

Wie wärs mit sed "regexpzeugs" -i datei.txt? (Zumindest für GNU Seds)

MfG Peschmä

Hans-Georg Normann
03-02-2005, 21:59
Wie wär es denn mit einem schlichten
sort -u alteDatei > neueDateiOder darfst du Datei nicht sortieren?

Hans

peschmae
04-02-2005, 08:10
Nö, er hat geschrieben nein. Aber er hat auch geschrieben keine Temporären Dateien, von dem her ;)

MfG Peschmä

ThorstenHirsch
04-02-2005, 09:58
Äh, ja, das Thema mit der temporären Datei war, dass der Prozess möglichst atomar laufen soll, weil es passieren könnte, dass gerade in dem Moment wo ich die Datei verändern will ein anderer Prozess in die Datei schreibt. Dadurch, dass ich meine neue Datei an die ursprüngliche Datei anhänge*, sollte das kein Problem sein.

sort ist aber strikt verboten.

* = damit das ganze verständlich wird:

mv /tmp/original /tmp/temp
sed "0,/ZEILE/{//d;}/" /tmp/temp >> /tmp/original

So, das heißt, das schlimmste was passieren kann ist, dass nach dem mv eine neue Zeile in /tmp/original geschrieben wird, die dann an oberster Stelle steht. Also leider nicht 100%ig die richtige Reihenfolge der Zeilen garantiert werden kann. Da aber die Wahrscheinlichkeit so gering ist UND die möglichen Auswirkungen nur eine Verzögerung des Gesamtprozesses im Sekundenbereich nach sich zieht (kann man in Kauf nehmen), habe ich mich für diese Lösung entschieden.

P.S.: @peschmae: nee, is leider kein GNU sed sondern Solaris sed

peschmae
04-02-2005, 14:29
Ok. Das mit dem d konnte ja nicht hinhauen, d liest nämlich gleich auch noch die nächste Zeile und fängt mit dem Script von vorne an.

Das ist das was ich an Sed hasse, jedes Kommando macht drei Sachen von denen man das erste will, das zweite in Kauf nimmt und das dritte überhaupt nicht brauchen kann.

Naja, es läuft. Also gut :)

MfG Peschmä

Badsteve
04-02-2005, 15:56
tac datei| uniq > dateineu

Wie ist es mit sowas? Kanns leider nich testen.

steve

Hans-Georg Normann
04-02-2005, 19:13
man uniq
uniq - Doppelte Zeilen aus sortierter Datei entfernenJetzt bist du in die gleiche Falle getappt, wie ich auch. Sortierung nicht möglich!

Hier würde ich jetzt die shell verlassen, das ganze mit Zeilennummer in ne Datenbank hieven und dann geht die Post ab. Mag ja sein, dass es Möglichkeiten in der Shell gibt, z. B. mit awk, aber das artet sehr leicht in Gewürge aus.

Wie groß ist diue Datei eigentlich (wc -l )?
Hans

Badsteve
04-02-2005, 20:44
man uniq
uniq - Doppelte Zeilen aus sortierter Datei entfernenJetzt bist du in die gleiche Falle getappt, wie ich auch. Sortierung nicht möglich!



Mist. Hast Recht. Man könnte sich da auch in perl was zurechtschreiben, aber IMHO wird das in der shell kompliziert.

steve

peschmae
05-02-2005, 06:38
Seine Lösung oben mit Sed funktioniert. *hint*

Ihr könnt aufhören. Es sei denn HGN wolle noch eine AWK-Lösung präsentieren. Dafür bin ich immer zu haben :D

MfG Peschmä