[gelöst] Textdatei anpassen (awk, sed?)

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
zahlhans
Beiträge: 56
Registriert: 06.02.2009 13:09:08

[gelöst] Textdatei anpassen (awk, sed?)

Beitrag von zahlhans » 01.11.2010 11:48:47

Hallo,

ich habe eine Textdatei nach folgendem Schema:

Code: Alles auswählen

01.02.1928              # Text bla                  # Text blä                # 2.44              # Text bli

03.04.2042              # Text2 bla                 # Text2 bli              #  5.22              # Text2 blu
D.h.: Feldtrenner sind '#', das erste Feld ist ein Datum und die Abstände zwischen den Feldern bestehen aus unterschiedlich vielen Tabulatoren. Zusätzlich kommen auch Leerzeilen vor.
Ich möchte die Datei nun in folgendes Format transformieren:

Code: Alles auswählen

1928-02-01       Text bla       Text blä          2.44      Text bli
3929-04-13       Text bla       Text blä          2.44      Text bli
D.h. das Datumsformat muß geändert werden und als Feldtrenner soll ein Tabulator dienen.

Meine erste Idee war nun banalerweise:

Code: Alles auswählen

cat daten.txt | awk -F'#' '{print $1 "\t" $2 ...usw. }'
Kann man das Datumsformat und das entfernen der Leerzeilen (und der Leerzeichen am Anfang/Ende eines Feldes) mit awk "in einem Wisch" anpassen?

---
Nachtrag: Ich habe das nun in Perl gelöst.

jmittendorf
Beiträge: 64
Registriert: 07.11.2007 08:56:30

Re: [gelöst] Textdatei anpassen (awk, sed?)

Beitrag von jmittendorf » 01.11.2010 12:30:22

Und wie?

Das würde mich dann doch einmal interessieren.

Gruß Jörg

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: [gelöst] Textdatei anpassen (awk, sed?)

Beitrag von GoKi » 01.11.2010 12:40:40

Trotz deiner Lösung in Perl, hier noch eine AWK Variante.

Code: Alles auswählen

$ cat script.awk 
function trim(s)  { sub(/^[ \t]+/, "", s); sub(/[ \t]+$/, "", s); return s; }

NF > 0 {
  split(trim($1), arr, ".")
  printf("%s-%s-%s", arr[3], arr[2], arr[1]) 
  for (i = 2; i <= NF; ++i)
    printf("\t%s", trim($i))
  printf("\n")
}
$ awk -F'#' -f script.awk < daten.dat 
1928-02-01	Text bla	Text blä	2.44	Text bli
2042-04-03	Text2 bla	Text2 bli	5.22	Text2 blu
MfG GoKi
:wq

zahlhans
Beiträge: 56
Registriert: 06.02.2009 13:09:08

Re: [gelöst] Textdatei anpassen (awk, sed?)

Beitrag von zahlhans » 01.11.2010 20:35:23

Für den Profi ist das vermutlich ein ziemlich häßliches Stück Perl - für meine zunächst einmalige Anwendung funktionierte es aber ;)

Code: Alles auswählen

open(DATEI, "daten.txt") or die $!;
        my @daten = <DATEI>;
close(DATEI);

@daten=grep{ $_ != ""; } @daten;    # Überflüssige Leerzeilen weg...

open(AUSGABE, ">test.txt");
foreach $i(@daten){
        @aufgeteilt = split(/#/, $i);

        foreach $b(@aufgeteilt){          # Überflüssige Leerzeichen weg...
                $b=~ s/^\s+|\s+$//g;            
        };

        @datum = split(/\./, $aufgeteilt[0]);
        print AUSGABE "$datum[2]-$datum[1]-$datum[0]\t$aufgeteilt[1]\t$aufgeteilt[2]\t$aufgeteilt[3]\t$aufgeteilt[4]\n";
}
close(AUSGABE);
Auch danke für die AWK-Lösung. Falls ich das doch regelmäßig machen sollte (überlege ich mir gerade) werde ich dieser den Vorzug geben.

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: [gelöst] Textdatei anpassen (awk, sed?)

Beitrag von ThorstenS » 19.11.2010 13:00:19

Reicht nicht einfach sowas?

Code: Alles auswählen

 awk -F '#' '{print substr($1,7,4) "-" substr($1,4,2) "-" substr($1,1,2) "\t" $2 "\t" $3 "\t" $4 "\t" $5}' InputDatei | tr -d "  " > OutputDatei

Antworten