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

Datum aus txtfile auslesen und wochentag hinzufügen

vloryan

Newbie
Hallo zusammen,

ich bin blutiger Anfänger und habe hier ein kleines Problem. Ich habe in meinem "datum.txt" ein Datum im folgenden Format: "DD.MM.YYYY" und möchte nun den Wochentag auf Deutsch voranstellen und in dieser Textdatei speichern. Und zwar als SO., MO., DI. MI. DO., FR. oder SA.

Der Post unter http://forum.linux-club.de/viewtopic.php?f=91&t=104663 hat mir ein klein wenig geholfen, ich komme aber leider nicht ans Ziel. Würde mich sehr freuen, wenn Ihr mir hier weiter helfen könntet. Danke!
 
Da Du nichts weiter schreibst ob das Ganze on-the-fly passieren soll oder nur einmalig läuft, hier ein paar Ansätze für dich:

Code:
#!/bin/bash

for zeile in `cat /PFAD/ZU/Datum.txt`
do
datum=`echo $zeile | /usr/bin/awk -F. '{OFS="-";print $3,$2,$1}'`
WT=`/bin/date --date=$datum +%u`
echo $WT $zeile
done

Wie Du siehst kein komplettes skript sondern nur ein Ansatz. Das awk wandelt das Datum jeder Zeile in amerikanisches Format um und das date gibt den Wochentag nummerisch aus. Das kannst Du nun mit dem Wissen (die case-Geschichte) aus dem verlinkten Thread kombinieren und in eine Datei schreiben. Vermutlich könntest Du das sogar nur mit dem date-Befehl machen aber da bin ich etwas überfragt.
Wenn Du selber etwas zusammen geschrieben hast, können wir ja noch mal drüber gucken wo es dann hakt.
 
A

Anonymous

Gast
eventuell würde es etwas helfen wenn du für de ganzem Cronprozess die LC Variable setzt,
Code:
LC_TIME=de_DE
an den Anfang der crontab. Würde ich aber nur in einer Crontab eines Users machen und nicht in der von root.

ansonsten gehen auch die Datumsformate innerhalb einer Datei noch umzubauen, ist aber etwas aufwendiger.
vloryan schrieb:
Ich habe in meinem "datum.txt" ein Datum im folgenden Format: "DD.MM.YYYY" und möchte nun den Wochentag auf Deutsch voranstellen und in dieser Textdatei speichern. Und zwar als SO., MO., DI. MI. DO., FR. oder SA.
eine kleiner Ausschnitt aus der Datei wäre an dieser Stelle sehr hilfreich, da dieser hier leider nicht gekommen ist baue ich einfach mal eine solche Datei auf gut dünchen mit folgendem Befehl
Code:
for i in $(seq 1 100) ; do echo "hallo $(date -d -${i}day  +%d.%m.%Y) hallo  hallo"; done > testfile.txt

die testfile.txt sieht jetzt wie gleich folgt aus, das 2. Feld ist dein Datum dem du noch die Wochentage voraus stellen willst. (selbstverständlich wirst du dein Datum in deiner Datei nicht als 2. Stehen haben, dann müssen eben alle folgende Beispiele da leicht umgebaut werden. Und eventuell hast du auch noch die Zeit im Format und hast uns das aber in der Aufgabenstellung nicht gesagt, auch dann sind kleine Veränderungen eventuell notwendig.)
Code:
hallo 26.05.2014 hallo  hallo
hallo 25.05.2014 hallo  hallo
hallo 24.05.2014 hallo  hallo
hallo 23.05.2014 hallo  hallo
hallo 22.05.2014 hallo  hallo
hallo 21.05.2014 hallo  hallo
hallo 20.05.2014 hallo  hallo

Das Format "DD.MM.YYYY" ist nun uns Deutschen zwar sehr vertraut, doch für irgendwelche Zeitfunktionen ist dieses Format als Eingangsformat absolut nicht brauchbar, es muss vorher umgestellt werden zB auf YYYY-MM-DD

Dazu könnte man die Datei über sed filtern, und dabei ein gefundenes Format entsprechend umstellen.zB so hier
Code:
cat testfile.txt | sed 's/ \([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)\ / \3-\2-\1 /'
Andere Methode dieses zu tun, wäre hier auch mit awk möglich, auch mit bash selbst geht es, sieht nur mit der nackte bash aber auch nicht schöner aus.
Aber immer noch kein Wochentag. Dazu muss man wieder eine Zeitfunktion nehen, zB das date Kommando. und dieses YY-MM-DD Format als das Eingabedatum nehmen und hinten die richtige gewünschte Formatierung angeben. Dazu muss man diesen Prozess dann eben als User laufen lassen der die richtigen LC-Variablen gesetzt hat, oder diese vorher im Script bei root entsprechend richtig setzen.
Das ganze also in einer Schleife könnte dann zB so hier aussehen.
Code:
cat testfile.txt | sed 's/ \([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)\ / \3-\2-\1 /' | while read A B C D
do
     BB=$(date -d "$B" +"%a %d.%m.%Y") 
     echo "$A $BB $C $D"
 done
Ergebnis ist jetzt
Code:
hallo So 25.05.2014 hallo hallo
hallo Sa 24.05.2014 hallo hallo
hallo Fr 23.05.2014 hallo hallo
hallo Do 22.05.2014 hallo hallo
hallo Mi 21.05.2014 hallo hallo
hallo Di 20.05.2014 hallo hallo
ist zwar immer noch nicht das was du unbedingt haben willst, aber schon etwas näher dran, die Wochentage sind noch Ml,Di,Mi.....
und nicht MO,DI,MI......., das sollte aber nicht das Problem sein, einfach noch ein Befehl mehr oder das der Bash machen lassen.
geht ganz einfach anstatt $BB mit echo auszugeben ${BB^^*} schreiben. die echo Zeile also schreiben.
Code:
echo "$A ${BB^^*} $C $D"

Andere Methode da Geier0815 hier schon awk mit in's Spiel gebracht hat, ( ich wars nicht) ;) das Ganze dann gleich komplett mit awk erledigen.

Code:
awk '{split($2,D,"."); T=sprintf("%04d %02d %02d 00 00 00",D[3],D[2],D[1]); t=mktime(T); $2=strftime("%a %d.%m.%Y",t); print }' testfile.txt
auch hier sind die Wochentage noch Mo,Di,Mi......, aber wer einigermaßen versteht was dort gemacht wird, sollte das auch ohne große Probleme in MO,DI,MI...... umwandeln können, die awk-Funktion wäre toupper() dafür.

robi
 
OP
V

vloryan

Newbie
hui ui ui! danke für die ausführliche antwort! wow!!!

ich melde mich nach dem austesten, kann ein wenig dauern :)
 

Pitti 1

Hacker
Faxxon schrieb:
http://www.linuxforen.de/forums/showthr ... -umwandeln

Genau. Dort kommt dann heraus:
ich bin auf nem mac unterwegs ;(
http://www.linuxforen.de/forums/showthread.php?277245-Datum-aus-Textdatei-umwandeln&p=1817048&viewfull=1#post1817048

Manchmal hat man wirklich den Eindruck, dass einem die Nutzer verar... wollen! :down:
http://forums.macrumors.com/showthread.php?t=1765652
 
Oben