[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: kleines awk-Problem



Hallo,

Am Mit, 02 Jun 2010, D. Schreiber schrieb:
>ich habe eine Datei mit folgendem Aufbau:
>
>Feld1: Wert1
>Feld2: Wert2
>Feld3: Wert3
>  --> Text1
>  --> Text2
>  --> Text3
>
>Feld1: Wert1
>Feld2: Wert2
>Feld3: Wert3
>  --> Text1
>  --> Text2
>
>Feldx: Wertx
>...
>
>Die Anzahl der Zeilen mit --> Text kann variieren.
>Ich möchte die Werte in eine Tabelle übertragen, jedes Feld in eine
>Spalte, alle Zeilen mit --> zusammen in eine Spalte. Das Ergebnis
>würde dann so aussehen:
>
>"Wert1";"Wert2";"Wert3";"Text1 Text2 Text3"
>"Wert1";"Wert2";"Wert3";"Text1 Text2"
>
>Die Werte aus den Zeilen Feldx zu übertragen war kein Problem. Aber an
>den anderen bin ich bisher gescheitert. Mir fehlt der zündende
>Gedanke, um mittels (g)awk alle Zeilen mit "-->" bis zur nächsten
>Leerzeile in einen String zu packen.
>Hat vllt. jemand einen Tipp? Der Zeilenumbruch kann auch beibehalten werden.

==== foo.awk ====
#!/usr/bin/gawk -f
BEGIN { FS=":"; }

function printbuf() {
  for(v in buf) {
    printf("\"%s\";", buf[v]);
  };
  printf "\n";
}

$1 ~ /^Feld/ {
  sub(/^[[:space:]]*/, "", $2);
  buf[n] = $2;
  n++;
}

$1 ~ /-->/ {
  sub(/[[:space:]]*-->[[:space:]]*/, "", $1);
  buf[n] = buf[n]" "$1;
}

/^\s*$/ {
  sub(/^[[:space:]]*/, "", buf[n]);
  printbuf();
  n=0;
  delete buf;
}
END { printbuf(); }
====

Aufruf: 'gawk -f foo.awk foo.dat' oder ausführbar machen und 'foo.awk
foo.dat' aufrufen, wobei die Eingabe in foo.dat liegt. Oder weglassen
und per stdin füttern.

HTH,
-dnh

-- 
Bei den meisten Männern reicht es nicht zum Begreifen, nur zum
Begrabbeln.                                 -- Gabriele Conrad


Reply to: