PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Unix Datum Check


Snake23
2005-09-26, 14:20:17
Hallo
Ich muss aus einer Datei auf jeder linie das Datum herauslesen und es mit dem heutigen Datum vergleichen. Wenn es vergangenheit ist dann muss ich nichts machen und wenn es erst noch kommt muss ich diese zeile kopieren auf der das datum ist. Wie kann ich so ein datums check machen??? Kann man mit dem datum rechnen wie im excel??? :-(
MfG

Snake23
2005-09-26, 15:26:17
Oder kann man das besser in einem select machen? So check man im select ob das datum älter ist als jetzt? (dal ich die daten zuerst aus einer datenbank ziehe)

ThePsycho
2005-09-26, 15:48:52
also im sql-statement ist die überprüfung auf jeden fall besser aufgehoben.
die entsprechende bedingung sieht aber je nach verwendeter datenbank und datentyp anders aus (es werden manchmal auch strings als datum verwendet, es gibt aber auch explizite datumdatentypen)

bsp für datumdatentyp (aus dem kopf, evtl kleiner fehler drin):
<feld_mit_datum> - sysdate < 0

falls das feld vom typ string ist, wirds etwas komplizierter, da muss man dann mit konvertieren anfangen.

wie gesagt, es macht da aber auch unterschiede, welche datenbank verwendet wird.


falls die überprüfung trotzdem im textfile geschehen soll, ist "awk" das tool deiner wahl.
das wird dann aber schon komplizierter, awk wird nicht umsonst schon als eigene programmiersprache bezeichnet.
kriegst du die ausgabe der datei ins posix-format? (= vergangene sekunden seit 1.1.1970 0:00 Uhr)
dann wäre es relativ einfach, so in dieser art:

awk -v Jetzt="$(date +%s)" ' { if( $1 - Jetzt < 0 ){ print $0 } } ' <ursprüngliche_datei> > <neue_datei>

ich hoffe, geholfen zu haben :)

Harleckin
2005-09-26, 16:04:23
wie bereits genannt wurde, bietet sich awk/gawk/nawk zum zweilenweisen Verarbeiten von Dateien an.

Wie schaut nun der dump aus der DB aus?

Snake23
2005-09-26, 16:21:18
CODEABCDEFGAB aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa NN 1/1/2001 00:00:00 31/12/2099 00:00:0013/5/2003 15:14:38 1/7/2005 08:49:07

Das letzte datum ist das mit dem ich arbeiten muss. feldname lastmodifieddate...

Snake23
2005-09-26, 16:39:38
es ist eine informix datenbank
sysdate geht nicht....

ThePsycho
2005-09-26, 16:52:14
hmm da muss ich passen.
bei ingres und oracle hätt ich weitergewußt, aber mit informix hab ich noch nicht gearbeitet.
ich kann die lediglich garantieren, dass es so ähnlich gehen muss...


für awk ist die ausgabe eher ungeeignet. man müsste sich da schon recht verbiegen

edit: nein, ich ziehe meine aussage bzgl awk zurück.

edit2:

so müsste es gehen, ABER: wie gesagt, im sql-statement ist so eine überprüfung besser aufgehoben


awk -v DateString=$(date "+%Y %m %d %H %M %S") '
BEGIN{
Jetzt=mktime(DateString)
}
{
split($NF-1,Datum,"/")
split($NF,Zeit,":")
neuerString=sprintf("%s %s %s %s %s %s", Datum[3], Datum[1], Datum[2], Zeit[1], Zeit[2], Zeit[3])
Zeit=mktime(neuerString)
if( Zeit-Jetzt < 0 )
{
print $0
}
}
' alte_Datei > neue_Datei


so, ich bin mal von der amerikanischen Datumsdarstellung ausgegangen (wegen den "/")
ansonsten sollte das anpassen auch ein Laie machen können :)

habs nicht getestet (!), bin aber zuversichtlich, dass es geht

aber schau lieber mal nach einer kleinen sql-schulung...

Harleckin
2005-09-26, 17:44:57
quick & dirty..


#!/usr/bin/awk -f
BEGIN{ "date +%H:%M:%S" | getline current_time }
{ if ( current_time != substr($0,length($0)-7,length($0))) { print ";( sry!" } }


./foo.awk trash.dump

Man nehme den dump aus der DB und füttere das AWK script

Zu Beginn weißt man nun die akt. Zeit zu und beginnt das Abarbeiten der Eingabedatei.
Aus der gesamten Zeile ($0) wird nun der Substring (also die letzten 7 Zeichen) heraus geschnitten und verglichen.

Mit einen bisschen Selbstinitiative ist der Rest ein Kinderspiel!

ThePsycho
2005-09-27, 08:38:18
ah ja, is natürlich doof, wenn man die aufgabe falsch versteht *doh*

ich editier mal mein kram bei gelegenheit...