Textdatei manipulieren mittels sed

Captain Crunch

Captain Crunch

Gott
Hallo,

ich möchte aus einer Datei, die dieses Format als Inhalt hat:
Code:
1;23.03.2009;15:40;02:30
1;25.03.2009;05:18;23:35
3;26.03.3009;09:44;14:05
3;27.03.2009;06:20;13:10
das Datumsformat ändern. Dazu habe ich mit "cut" die 2. Spalte extrahiert und in dem array "date" gespeichert. dann habe ich erneut mit "cut" das Jahr, den Monat und den Tag in einer Variablen gespeichert, um sie dann anschließend mittels "sed" neu formatiert wieder in die 2. Spalte einzufügen, in einer anderen Datei.

Hier der gesamte Code:
Code:
#!/bin/bash

c=0
for row in $(cat /home/goofy/xxx.txt) ; do
    date[c]="$(echo ${row} | cut -d ';' -f 2 )"

#   echo ${date[c]}

    year="$(echo ${date[c]} | cut -d '.' -f 3 )"
    month="$(echo ${date[c]} | cut -d '.' -f 2 )"
    day="$(echo ${date[c]} | cut -d '.' -f 1 )"

    echo ${year}-${month}-${day}

    $(sed "s/[0-9][0-9].[0-9][0-9].[0-9][0-9][0-9][0-9]/${year}-${month}-${day}/g" xxx.txt > xxx2.txt)

    ((c++))
done
Bis zum 1. echo scheint alles richtig zu sein. Der sed-Befehl funktioniert grundsätzlich auch, aber er gibt nicht pro zeile ein datum aus, sondern liefert folgenden output:
Code:
1;2009-05-15;05:40;09:20
1;2009-05-15;15:40;13:30
3;2009-05-15;02:40;15:00
4;2009-05-15;15:30;11:30
1;2009-05-15;15:40;18:50
1;2009-05-15;05:23;09:35
3;2009-05-15;06:57;03:20
3;2009-05-15;06:45;10:05
2;2009-05-15;10:37;11:30
7;2009-05-15;00:40;19:25
1;2009-05-15;03:45;09:20
3;2009-05-15;19:43;10:4
3;2009-05-15;06:42;10:10
5;2009-05-15;10:30;11:30
3;2009-05-16;06:40;10:10
1;2009-05-16;23:46;10:15
3;2009-05-16;06:45;10:35
3;2009-05-16;16:43;10:25
2;2009-05-16;17:30;01:30
1;2009-05-16;09:40;14:05
1;2009-05-16;05:30;10:21
3;2009-05-16;06:40;17:05
7;2009-05-16;06:53;17:55
1;2009-05-16;13:41;19:05
4;2009-05-16;18:50;13:15
Gibt also jeden Tag etliche male aus, obwohl es pro Tag nur einen, maximal 3 Einträge gibt

Wo ist mein Denkfehler? Ist bestimmt nur eine Kleinigkeit, komme aber gerade nicht drauf :-/
 
Hi,

sieht mir auf den ersten Blick so aus, als ob du die Eingabedatei zeilenweise einliest, für jede einzelne Zeile das "date[c]" umformatierst, dann die ganze Datei durch den sed jagst, und dabei die Ergebnisse aus den vorherigen Durchgängen (mit "... >xxx2.txt") überschreibst ...

Eventuell kannst du ja das Ganze durch einen sed-Einzeiler ersetzen, etwa so:
Code:
sed -e 's/\([0-9]*\);\([0-9]*\).\([0-9]*\).\([0-9]*\);\(.*\)/\1;\4-\3-\2;\5/' <xxx.txt >xxx2.txt

(Schnellschuss, ungetestet etc. ...)

Grüsse,
A.
 
Abend,

muss es unbedingt sed sein?

Sonst würde ich sagen nimm doch einfach awk
awk -F\; '{ split($2, datum, ".") ; print ($1";"datum[3]"-"datum[2]"-"datum[1]";"$3";"$4) }' input.txt
 
[gelöst] Textdatei manipulieren mittels sed

Danke euch beiden,

ich habe gleich beide Lösungen ausprobiert und sie funktionieren beide. Da habe ich wohl etwas zu kompliziert gedacht. Habe aber auch wieder viel dazugelernt.

Der Test mit "time" hat ergeben, dass in diesem Fall "awk" etwas schneller arbeitet als "sed":
Code:
time sed -e 's/\([0-9]*\);\([0-9]*\).\([0-9]*\).\([0-9]*\);\(.*\)/\1;\4-\3-\2;\5/' <xxx.txt >xxx2.txt

real    0m0.007s
user    0m0.003s
sys     0m0.003s

Code:
time awk -F\; '{ split($2, datum, ".") ; print ($1";"datum[3]"-"datum[2]"-"datum[1]";"$3";"$4) }' xxx.txt > xxx2.txt

real    0m0.005s
user    0m0.003s
sys     0m0.000s
 
Zuletzt bearbeitet:

Ähnliche Themen

Verschlüsseltes Backup-Script mit rsync

CentOS 5.8 –SQL Abfrage– HTML wird generiert und daraus müssen mehrere Mails versendet werden

Debian Routing Problem

Creative Labs SoundBlaster Audigy 2 ZS unter Debian / Kernel 3.16

Shellskript - Fehler in Cron

Zurück
Oben