Anzeige:
Ergebnis 1 bis 12 von 12

Thema: erstes auftreten einer zeile löschen

  1. #1
    Registrierter Benutzer
    Registriert seit
    11.09.2003
    Beiträge
    100

    erstes auftreten einer zeile löschen

    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

  2. #2
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    bin jetzt gerade nicht auf Linux, versuchs trotzdem mal ungetestet (Schande über mich )

    Sedscript:
    Code:
    /ZEILE/ {
    d
    q
    }
    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  3. #3
    Registrierter Benutzer
    Registriert seit
    11.09.2003
    Beiträge
    100
    Hmm, nee, da verschwinden jetzt bei mir alle Zeilen mit ZEILE.
    Aber ich hab's hiermit gelöst:
    Code:
    sed "0,/ZEILE/{//d;}/" /tmp/datei_mit_viel_ZEILE >> /tmp/datei_mit_1_ZEILE_weniger
    P.S.: Trotzdem DANKE!

  4. #4
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Soviel zum thema keine temporäre Datei

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

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  5. #5
    Registrierter Benutzer Avatar von Hans-Georg Normann
    Registriert seit
    05.03.2000
    Ort
    Uetersen
    Beiträge
    571
    Wie wär es denn mit einem schlichten
    Code:
    sort -u alteDatei > neueDatei
    Oder darfst du Datei nicht sortieren?

    Hans
    333 Mhz, 466 MHz, neee, ich hab was neues zuhause.....

  6. #6
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Nö, er hat geschrieben nein. Aber er hat auch geschrieben keine Temporären Dateien, von dem her

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  7. #7
    Registrierter Benutzer
    Registriert seit
    11.09.2003
    Beiträge
    100
    Ä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
    Geändert von ThorstenHirsch (04-02-2005 um 11:00 Uhr)

  8. #8
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    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ä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  9. #9
    Registrierter Benutzer
    Registriert seit
    26.12.2001
    Beiträge
    228
    Code:
    tac  datei| uniq > dateineu
    Wie ist es mit sowas? Kanns leider nich testen.

    steve
    pornstars-online.de

  10. #10
    Registrierter Benutzer Avatar von Hans-Georg Normann
    Registriert seit
    05.03.2000
    Ort
    Uetersen
    Beiträge
    571
    man uniq
    Code:
    uniq - Doppelte Zeilen aus sortierter Datei entfernen
    Jetzt 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
    333 Mhz, 466 MHz, neee, ich hab was neues zuhause.....

  11. #11
    Registrierter Benutzer
    Registriert seit
    26.12.2001
    Beiträge
    228
    Zitat Zitat von Hans-Georg Normann
    man uniq
    Code:
    uniq - Doppelte Zeilen aus sortierter Datei entfernen
    Jetzt 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
    pornstars-online.de

  12. #12
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    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

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •