PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 18x2 Variablen in richtige Verbindung bringen mit bash



AndreasDD
08-12-2008, 09:38
* Ich habe 18 Files, die sind entweder leer oder haben eine unbestimmte Anzahl Zeilen mit je zwei Einträgen (durch Leerzeichen getrennt:

Beispiel File01:

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

jan61
08-12-2008, 21:11
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:


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,,12 28763807,,1228763811
ID2,1228763780,,1228763784,1228763784,1228763788,, 1228763792,,1228763796,,1228763800,,1228763804,,12 28763808,,1228763812
ID3,1228763781,,1228763785,1228763785,1228763789,, 1228763793,,1228763797,,1228763801,,1228763805,,12 28763809,,1228763813
ID4,1228763782,,1228763786,1228763786,1228763790,, 1228763794,,1228763798,,1228763802,,1228763806,,12 28763810,,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