PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datei in Spalten schreiben



Schimi42
20-06-2008, 10:53
Hallo zusammen,

ich habe gerade ein akutes Skript-Problem und bin dabei auf dieses Forum gestoßen. Vielleicht könnt ihr mir helfen.

Ich habe mehrere Dateien, die ich mittels grep, awk und sort soweit vorverarbeitet habe, dass eine Datei erzeugt wird die so aussieht:

<String0>
123
313
2313
4322
<String1>
231
313
2323
4332
5232
<String2>
131
313
2323
4332
5232
...

Es sind immer (sortierte) Zahlenreihen (Zahlen zwischen 0 und 8191) die durch Strings voneinander getrennt sind. Es können unterschiedlich viele Zahlen pro Block auftreten (0 bis 8192).
Ich möchte im ersten Schritt eine Daten erstellen, die so aussieht:

<String0>;<String1>;<String2>
123;231;131
313;313;313
2313;2323;2323
4322;4332;4332
;5232;5232

Also die Blöcke nebeneinander in Spalten geschrieben. Die Krönung wäre allerdings eine Datei die so aussieht:

<String0>;<String1>;String2>
123;;
;;131
;231;
313;313;313
2313;;
;2323;2323
4322;;
;4332;4332
;5232;5232

Also jede auftretende Zahl hat so eine eigene Zeile. Tritt sie in einem der Blöcke nicht auf soll einfach ein leerer Eintrag da sein.

Ich komme hier einfach nicht weiter. Ist sowas mit Hilfe von awk/sed/etc. möglich?

Gruß,
Schimi

jan61
20-06-2008, 19:48
Moin,

natürlich geht das ;-) Im awk ist das nicht mal besonders umfangreich (ich habe einfach Dein Beispiel in die Datei "datei" gepackt):


jan@jack:~/tmp/str_zahlen> cat out.awk
! /^[0-9]/ { ### Zeile beginnt nicht mit einer Ziffer -> String
str = $0; # String merken
s_arr[str] = 1; # s_arr enthaelt alle auftretenden Strings
getline; # naechste Zeile
}
{ ### alle anderen Zeilen -> Zahl
zf = sprintf("%4.4d", $0); # fuer Sortierung auf 4 Stellen formatieren
z_arr[zf] = zf; # z_arr enthaelt alle auftretenden Zahlen
r_arr[zf,str] = $0; # r_arr enthaelt alle Kombinationen
}
END { ### Einlesen beendet, Ausgabe
s_out = ""; # Ausgabestring
for (s in s_arr) { # Headerzeile mit allen Strings
s_out = s_out s ";"; # String und ";" anhaengen
}
gsub(/;$/, "", s_out); # letztes Semikolon weg
print s_out; # Header ausgeben
nr = asort(z_arr); # Zahlenarray sortieren
for (z = 1; z <= nr; z++) { # ueber alle vorhandenen Zahlen laufen
s_out = ""; # Ausgabestring
for (s in s_arr) { # Schleife ueber alle Strings (=Spalten)
# an Ausgabe die Zahl und ";" anhaengen
s_out = s_out r_arr[z_arr[z],s] ";";
}
gsub(/;$/, "", s_out); # letztes Semikolon weg
print s_out; # Zeile ausgeben
}
}
jan@jack:~/tmp/str_zahlen> awk -f out.awk datei
<String0>;<String1>;<String2>
123;;
;;131
;231;
313;313;313
2313;;
;2323;2323
4322;;
;4332;4332
;5232;5232
Jan

Schimi42
23-06-2008, 17:19
Sehr cool, vielen Dank! Hat mir sehr geholfen. :)