romy: ksh - Liste gruppieren

Hallo zusammen,

ich habe mal wieder ein schönes kleines Problemchen zu lösen.
Täglich bekomme ich eine Liste mit Datensätzen in der folgenden Art:

YYYY/MM/DD-HH:mm:ss;Gruppierkriterium1;Gruppierkriterium2;Begriff1;Begriff2;Begriff3;Begriff4

Um diese Liste über einen längeren Zeitraum auswerten zu können wird diese Liste heute täglich aufaddiert und die doppelten Einträge werden per sort -u rausgeschmissen. Damit durch den Zeitstempel nicht alle Einträge eindeutig sind, wird dieser vorher per cut auch rausgeworfen, genauso wie die laufende Nummer.

Leider ist dieses Verfahren ziemlich blöd, denn der Zeitstempel wird benötigt. Die eigentliche Anforderung wäre: Täglich diese Liste an die Bestehende anhängen und dabei immer nur den neusten Eintrag behalten, wobei der Schlüssel aus Gruppierkriterium 1 und 2 besteht.

Beispielsweise:
2011/11/11-13:59:13;A;1;Begriff1;Begriff2;Begriff3;Begriff4
2011/11/11-13:59:26;A;2;Begriff1;Begriff2;Begriff3;Begriff4
2011/11/11-14:54:12;A;1;Begriff1;Begriff2;Begriff3;Begriff4

nach der Gruppierung soll es nur noch die letzten beiden Einträge geben, der Erste fällt raus, da der Dritte neuer ist.

Ich stehe leider völlig auf dem Schlauch, wo ich überhaupt anfangen könnte zu suchen wie sich das realisieren ließe. Eine Programmiersprache steht nicht zur Verfügung, nur die Shell. Die Liste lässt sich auch nicht anpassen. Könnt ihr mir helfen, welche Programme überhaupt dafür in Frage kämen und wie ihr da rangehen würdet.

Viele Dank!

Viele Grüße
romy

  1. Tach! Post!

    Ich stehe leider völlig auf dem Schlauch, wo ich überhaupt anfangen könnte zu suchen wie sich das realisieren ließe. Eine Programmiersprache steht nicht zur Verfügung, nur die Shell.

    Ideensammlung:

    man sort
    man tail
    man head
    man awk

    Fred

    1. Tach! Post!
      Ideensammlung:

      Der Typ, der so was hier stets mit Freuden beantwortet hat, ist erst neulich rausgeätzt worden.

      Frag ihn direkt wenn Dir die Handbücher zur Unix- oder Linux-Grundausstattung nicht weiterhelfen.

      Otto der Normalversäufer

      1. Hallo,

        Der Typ, der so was hier stets mit Freuden beantwortet hat, ist erst neulich rausgeätzt worden.

        der hat sich in erster Linie selbst rausgeätzt.

        Ciao,
         Martin

        --
        Zivilisation bedeutet, dass die Eskimos warme Wohnungen bekommen und dann arbeiten müssen, damit sie sich einen Kühlschrank leisten können.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. der hat sich in erster Linie selbst rausgeätzt.

          Jetzt willst Du für Dein Flaming auch noch ein "hilfreich" oder wie darf ich Dich verstehen?

          Otto

          1. servus Otto,

            der hat sich in erster Linie selbst rausgeätzt.

            Jetzt willst Du für Dein Flaming auch noch ein "hilfreich" oder wie darf ich Dich verstehen?

            Willkommen in der Zivilisation. Hier gibt es auch Ironie.

            der wurzelbert

            --
            Ist es ein Vogel?
            Ist es ein Flugzeug?
            Nein, es ist Reis, Baby!
    2. Hallo Fred,

      Ideensammlung:
      man sort
      man tail
      man head
      man awk

      Die Tools kenne ich, aber mir ist nicht klar, wie ich daran gehen könnte. Wie würde ich Pseudocodemäßig eine solche Aufgabe lösen? Wie fange ich an?

      Sorry hier fehlt es mir schon der Anfang. Vielleicht hat ja jemand einen Ansatz für mich.

      ciao
      romy

      1. Nur ein Vorschlag (Programmablauf)

        Schaue nach ob /var/run/[DeinSkript].pid existiert.
        (bash: if test -e "/var/run/[DeinSkript].pid")

        Wenn ja
           - Abbruch mit Meldung, dass das Programm vermutlich schon läuft weil /var/run/[DeinSkript].pid existiert, dem Benutzer soundso gehört und die PID drin steht. (ps ax | grep [DeinSkript]) tut es ggfs. auch.

        schreibe die aktuelle PID nach /var/run/[DeinSkript].pid (bash: echo $$ > /var/run/[DeinSkript].pid)

        sortiere Datei.alt und Datei.neu nach Datei.tmp (dabei werden diese auch zusammengeführt, mehr mit man sort)

        Nimm den awk und gehe die Zeilen von Datei.tmp durch, lenke die Ausgaben nach Datei.alt:
           Für jede Zeile
               -Wenn Variable letzterWert gleichen Wert hat wie der Wert aus Kriteriumspalte, dann:
                    - nichts.
               -Wenn aber der Wert aus Kriteriumspalte anderen Wert hat als Variable letzterWert, dann
                    - gib Daten aus
                    - setze Variable letzterWert auf Wert der Kriteriumspalte
              Nächste Zeile
        [Ende awk]
        Verfahre mit Datei.neu nach Deinen Wünschen
        Lösche /var/run/[DeinSkript].pid
        exit;

        Wenn es kein Linux ist (dann hättest Du vermutlich mindestens Perl), dann passe den Pfad für das PID-File an.

        Bei geschickter Programmierung kann Datei.tmp auch eine Variable in der Shell sein.

        Tipp: Während der Entwicklungsphase wirst Du natürlich nicht Deine Daten zerstören sondern in eine andere Datei schreiben.

        Fred

      2. Moin Moin!

        Die Tools kenne ich, aber mir ist nicht klar, wie ich daran gehen könnte. Wie würde ich Pseudocodemäßig eine solche Aufgabe lösen? Wie fange ich an?

        Nimm an, Du hast einen willigen, aber strunzdoofen Hilfsarbeiter. Schreib ihm eine detailierte Anleitung, wie er den Job MANUELL erledigt.

        Aus der Anleitung kannst Du Dir so viel Pseudo- und realen Code übersetzen, wie Du willst.

        Bei CSV-Daten kommt bei mir fast reflexartig der Gedanke, den Kram in ein RDBMS zu verfrachten und dort zu verarbeiten. Meine Werkzeuge: perl, DBI, DBD::CSV, DBD::SQLite. Alternativ zu letzterem DBD::Pg und eine schon vorhandene PostgreSQL-Installation.

        Alexander

        --
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
        1. Nimm an, Du hast einen willigen, aber strunzdoofen Hilfsarbeiter. Schreib ihm eine detailierte Anleitung, wie er den Job MANUELL erledigt.

          Du hast Recht, aber:

          Der "Mitarbeiter" ist als noch dümmer als nur "strunzdoof". Ein IQ unter 70 bedingt schon die Diagnose der geistigen Behinderung. Ein Computer hat einen IQ von exakt 0.

          Die von Dir genannte detaillierte Anleitung genau ist übrigens genau dann ein Programm, wenn sie den formalen Kriterien einer Programmiersprache genügt. Wer diese Anleitung geben kann, der kann im Grundsatz auch programmieren. Wer nicht sollte sich anderweitig orientieren. Es handelt sich hierbei um ein wesentliches Talent für diese Kunst.

          Das bedeutet ausdrücklich nicht, dass der, der es nicht hat "doof" ist.

          Fred