Anzeige:
Ergebnis 1 bis 2 von 2

Thema: 18x2 Variablen in richtige Verbindung bringen mit bash

  1. #1
    AndreasDD
    Gast

    18x2 Variablen in richtige Verbindung bringen mit bash

    * Ich habe 18 Files, die sind entweder leer oder haben eine unbestimmte Anzahl Zeilen mit je zwei Einträgen (durch Leerzeichen getrennt:

    Beispiel File01:
    Code:
    ZeitstempelFile01 SubstrateIDFile01
    ZeitstempelFile01 SubstrateIDFile01
    ZeitstempelFile01 SubstrateIDFile01
    ZeitstempelFile01 SubstrateIDFile01
    ZeitstempelFile01 SubstrateIDFile01
    * Die Zeitstempel sind aufsteigend sortiert

    * SubstrateID's (und Zeitstempel dazu) können mehrfach vorkommen

    Ich benötige nun eine Ausgabe in ein csv-File:

    SubstrateID,ZeitstempelFile01,ZeitstempelFile02,Ze itstempelFile03..ZeitstempelFile18

    * ZeitstempelFile* soll leer sein, wenn im Quellfile nicht vorhanden (oder bereits zugeordnet, wenn mehrfach in Quellfile vorhanden)


    Gibt es einen "Königsweg" bzw. ein theoretisches Muster, wie ich vorgehen kann, dass ich alle mit allen vergleiche? Oder wie könnte ich das anstellen?


    lg-Andreas

  2. #2
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    so 100% bin ich nicht schlau geworden aus Deiner Beschreibung (ein paar Beispiele wären hilfreich gewesen) - ich nehme aber mal an, dass die einzelnen Zeilen verschiedene IDs und Zeitstempel darstellen sollen? Wenn Du mit "bash" nicht ausschließlich Shell-Builtins meinst und Hilfe von "außerhalb" zulässt, dann geht das relativ einfach mit awk:

    Code:
    jan@jack:~/tmp/18x2> cat 18x2.awk
    BEGIN {
       old_fn = "";
       max_no = 0;
    }
    { if (FILENAME != old_fn) {
        f_no = gensub(/.*[^0-9]([0-9]+)$/, "\\1", "g", FILENAME) * 1;
        if (max_no < f_no) max_no = f_no;
      }
      sid[$2] = $2;
      if (sidts[$2 "_" f_no] == "") sidts[$2 "_" f_no] = $1;
      old_fn = FILENAME;
    }
    END {
      for (id in sid) {
        ln = id;
        for (i = 1; i <= max_no; i++) ln = ln "," sidts[id "_" i];
        print ln;
      }
    }
    jan@jack:~/tmp/18x2> awk -f 18x2.awk file*
    ID1,1228763779,,1228763783,1228763783,1228763787,,1228763791,,1228763795,,1228763799,,1228763803,,1228763807,,1228763811
    ID2,1228763780,,1228763784,1228763784,1228763788,,1228763792,,1228763796,,1228763800,,1228763804,,1228763808,,1228763812
    ID3,1228763781,,1228763785,1228763785,1228763789,,1228763793,,1228763797,,1228763801,,1228763805,,1228763809,,1228763813
    ID4,1228763782,,1228763786,1228763786,1228763790,,1228763794,,1228763798,,1228763802,,1228763806,,1228763810,,1228763814
    Die Dateien "file01" bis "file18" sind dabei mit Werten für ID1 .. 4 und Zeitstempeln gefüllt, die ungeraden haben Werte, die geraden bis auf 04 sind leer. Die Testdaten sind relativ einfach gestrickt, deshalb ist das Ganze auch nicht sonderlich gründlich getestet.

    Man kann das wahrscheinlich auch mit Hilfe von Arrays in der bash allein machen, hat es da aber schwerer, weil diese nicht assoziativ sind.

    Jan

Lesezeichen

Berechtigungen

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