Datum mit sed erkennen und editieren

Xerophyt

Xerophyt

Grünschnabel
Hallo,

ich beginne gerade, mich mit der Shellprogrammierung zu beschäftigen. Einiges habe ich hier im Forum schon gelesen, komme aber jetzt nicht so richtig weiter.

In Tabellen, die in einem oder mehreren Feldern ein Datum enthalten können, ist dieses Datum in der Form

6112005, 5042006, also siebenstellig ohne führende Null beim Tagesdatum<10 und
12012006, ... , also achtstellig wenn Tagesdatum > 9.

In dieser Form können die Daten nicht wie gewollt weiterverarbeitet werden (Excel).

Der unten angegebene Code ergibt als Ausgabe:
06112005
05042006
012012006

Code:
sed '/\([0-9][0-9][0-9][0-9][0-9][0-9][0-9]\)/ s//'0'\1/g' datei1 > datei2

Dieser Code setzt in allen Feldern der Tabelle, in denen er eine siebenstellige Zahl findet, eine Null davor (ist mir soweit auch einleuchtend).

Ich möchte aber, dass nur Felder mit genau sieben Zahlen mit einer führenden Null versorgt werden und die 8-stelligen unverändert bleiben.

Kann mir dafür jemand einen Tip geben?

Vielen Dank!
 
Du könntest das Zeichen vor und nach der Zahl ins Muster einbeziehen. Da ich nicht weiss, wie datei1 aussieht, hier ein Vorschlag, falls pro Zeile eine Zahl steht. Wenn die Datei anders aussieht, einfach nochmal posten:

Code:
sed '/^\([0-9]]\{7\}\)$/ s//0\1/g' datei1 > datei2

Gruss, Xanti
 
Zuletzt bearbeitet:
Hallo Xanti,

vielen Dank für die Antwort. Klappt aber leider nicht. Vor und nach der Zahl steht der Feldtrenner (z.B. Pipe). Die Tabellenfelder können String-, Integer- oder Gleitkomma-Werte enthalten. Die Datumsfelder stehen in verschiedenen Tabellen an unterschiedlichen Positionen im Datensatz.

Ich habe mal einige Datensätze zur Veranschaulichung im Anhang mitgeschickt (hoffe das war alles richtig). Das vorletzte Feld ist in diesem Fall ein Datum (je Satz zwei Datumsfelder).

Gruß Xerophyt

Ich vermute, dass "Direkt antworten" der richtige Weg gewesen wäre. (s. oben links: Grün...)
 

Anhänge

  • bsp.txt
    705 Bytes · Aufrufe: 3
Zuletzt bearbeitet:
Hallo

Sinnigerweise gibt es dafür auch sowas wie printf. ;)
In ein while read eingepackt, lassen sich so Strings nach belieben formatieren.

Code:
while read Feld1 Feld2 Datum Rest;
do
printf "%s\t%s\t[b]%[color=red]08[/color]d[/b]\t%s\n" $Feld1 $Feld1 $Datum "$Rest";>output_file
done <input_file
Die Felder musst du natürlich selbst wissen, und den IFS entsprechend anpassen (falls Semikola oder Komma verwendet wird.)
Wenn keine feste Feldlänge vorliegt, wird es etwas komplizierter.

Im Fall von sed funktioniert Xanti sein Vorschlag, wenn der Ziffenrstring am Ende steht.
Sonst würde ich auf eine 7-stellige Ziffernfolge an einer Wortgrenze matchen.
Code:
sed -e 's/[^[:space:]]+\([[:digit:]]\{7\}\)[^[:space:]]+/ 0\1 /g' Input >Output
Mein sed kennt kein lookahead.
Statt [:space:] Kannst du auch ein anderes Trennzeichen verwenden.

In wie weit das portable ist, hängt von dem verwendeten sed ab.
Es gibt da auch noch Perl (kennt auch printf) oder awk (kennt auch printf).
Beide können sehr gut mit Feldern umgehen, wobei Perl performanter ist. ;)

Gruß Wolfgang

Fipptehler behoben ;)
 
Zuletzt bearbeitet:
Hallo Wolfgang, Hallo Xanti,

in dem 'while read'-Beispiel muss ich das aber für jede Tabelle (haben alle unterschiedliche Anzahl von Feldern) machen. Deinen zweiten Vorschlag habe ich entsprechend angepasst. Das ist im Prinzip das, was Xanti vorher vorgeschlagen hatte: Trennzeichen-7 Zahlen-Trennzeichen. Die Trennzeichen werden wieder eingefügt und das liefert das gewünschte Ergebnis.

Vielen Dank für die prompte Unterstützung.

Gruß Xerophyt

Ich konnte schon was damit anfangen ;) Danke!
 
Zuletzt bearbeitet:
Zurück
Oben