• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[solved] awk: Datumformat in Zeile ändern

dukenuker

Newbie
Hallo,

ich habe eine Datei mit folgenden Beispielzeilen:

Code:
lo;NTX;20070404;09:53:19;fhg;1;172.21.111.44;34718;
li;NTX;20070601;15:54:30;fhg;1;172.21.111.44;38114;

Ich muss das Datum im dritten Feld von yyyymmdd in dd.mm.yyyy umwandeln. Folgenden Code habe ich:

Code:
...
		awk -F ';' '{
			DATUM_NEU=substr( $3, 7, 2 )"."substr( $3, 5, 2)"."substr( $3, 1, 4)
			sub( /$3/, DATUM_NEU, $0 )
			print $3
			print DATUM_NEU
			print $0 }' $WORKVERZ/$DATEI_TMP
...

Folgende Ausgabe kommt raus. Das Datum wird zwar umgewandelt, aber der sub-Befehl schein nicht zu funktionieren, Hat da jemand eine Idee?

Code:
20070404
04.04.2007
lo;NTX;20070404;09:53:19;fhg;1;172.21.111.44;34718;
20070601
01.06.2007
li;NTX;20070601;15:54:30;fhg;1;172.21.111.44;38114;

Grüße + Danke für Hilfe,
Simon
 
OP
dukenuker

dukenuker

Newbie
Danke, das war die Lösung. Keine Ahnung, wie ich auf die Slashes gekommen bin.

Grüße,
Simon
 
OP
dukenuker

dukenuker

Newbie
Nein ich habe ein anderes awk-Skript als Vorlage genommen, u.a.:

AUFTRAGGEBER_2=substr( $21, 28, 27 ); sub( / +$/, "", AUFTRAGGEBER_2 )

Und da funktioniert es ganz normal! Undauf diversen Seiten wird das auch so verwendet, d.h. dass das zu ersetzende Muster in /../ eingeschlossen wird. Komisch... :shock:

Viele Grüße,
Simon
 

regexer

Advanced Hacker
dukenuker schrieb:
Und da funktioniert es ganz normal! Undauf diversen Seiten wird das auch so verwendet, d.h. dass das zu ersetzende Muster in /../ eingeschlossen wird. Komisch... :shock:
Ja, aber in deinem Fall ist doch $3 kein Muster sondern eine Variable...

In vi usw. ist hier die Logik etwas anders. Darum mein Hinweis.
 
OP
dukenuker

dukenuker

Newbie
notoxp schrieb:
dukenuker schrieb:
Und da funktioniert es ganz normal! Undauf diversen Seiten wird das auch so verwendet, d.h. dass das zu ersetzende Muster in /../ eingeschlossen wird. Komisch... :shock:
Ja, aber in deinem Fall ist doch $3 kein Muster sondern eine Variable...
M.E. ist $3 schon ein Muster (in einer Varaiblen), welches jede Zeile wechselt.
Wenn ich schreibe:
Code:
sub( /20070404/, "04.04.2007" )
Dann klappt es auch, aber nicht wenn ich schreibe:
Code:
DATUM_NEU=substr( $3, 7, 2 )"."substr( $3, 5, 2)"."substr( $3, 1, 4)
sub( /$3/, 04.04.2007 )
 

regexer

Advanced Hacker
dukenuker schrieb:
M.E. ist $3 schon ein Muster (in einer Varaiblen), welches jede Zeile wechselt.
Wenn ich schreibe:
Code:
sub( /20070404/, "04.04.2007" )
Dann klappt es auch,
Da ich auch nur noch selten awk verwende, weiß ich das jetzt auch nicht mehr genau. Ich weiß nicht, ob awk überhaupt ersetzungen innerhalb der Slashes zulässt. Eventuell wird dann das $ als Zeilenende interpretiert...
 
OP
dukenuker

dukenuker

Newbie
notoxp schrieb:
dukenuker schrieb:
M.E. ist $3 schon ein Muster (in einer Varaiblen), welches jede Zeile wechselt.
Wenn ich schreibe:
Code:
sub( /20070404/, "04.04.2007" )
Dann klappt es auch,
Da ich auch nur noch selten awk verwende, weiß ich das jetzt auch nicht mehr genau. Ich weiß nicht, ob awk überhaupt ersetzungen innerhalb der Slashes zulässt. Eventuell wird dann das $ als Zeilenende interpretiert...

Stimmt!! Das war es was ich nicht beachtet habe!
 
Schade das awk kein translate kann, sonst könnte man elegant
dieses machen:

DATE=20070404 ; echo "12.34.5678" | tr "56783412" "$DATE"

Oder mit Uhrzeit, gleiches System und mit sed:
DATE=20070406235959 ; echo "12.34.78 Hh:Mm:Ss" | sed "y/56783412HhMmSs/$DATE/"

:)

Edit:$Date wieder eingefügt. Thanks to notoxp. Das Date war beim Edit und einfügen von sed verloren gegangen..
 
Oben