2016-09-25 2 views
0

Ich habe Hunderte von CSV-Dateien mit Datumsformat als% d /% m/% y% H:% M:% S, aber ich möchte, dass sie in das Format ändern% Y-% m-% d% H:% M:% SÄndern des Formats von% d /% m /% y zu% Y-% m-% d in einer CSV-Datei mit AWK unter Linux (UBUNTU)

INPUT_FILE.csv (date format == %d/%m/%y %H:%M:%S) 
13/05/87 4:00:00,1.27470,1.27530,1.27460,1.27480,101926,356 
14/05/87 4:01:00,1.27490,1.27520,1.27310,1.27490,102419,493 
15/05/87 4:02:00,1.27490,1.27540,1.27440,1.27530,102846,427 
16/05/87 4:03:00,1.27520,1.27570,1.27490,1.27550,103202,356 
17/05/87 4:04:00,1.27550,1.27640,1.27510,1.27590,103528,326 
...... 
...... 
...... 
24/02/09 4:00:00,1.27470,1.27530,1.27460,1.27480,101926,356 
25/02/09 4:01:00,1.27490,1.27520,1.27310,1.27490,102419,493 
26/02/09 4:02:00,1.27490,1.27540,1.27440,1.27530,102846,427 
27/02/09 4:03:00,1.27520,1.27570,1.27490,1.27550,103202,356 
28/02/09 4:04:00,1.27550,1.27640,1.27510,1.27590,103528,326 


REQUIRED_OUTPUT.csv (date format == %Y-%m-%d %H:%M:%S) 

1987-05-13 4:00:00,1.27470,1.27530,1.27460,1.27480,101926,356 
1987-05-14 4:01:00,1.27490,1.27520,1.27310,1.27490,102419,493 
1987-05-15 4:02:00,1.27490,1.27540,1.27440,1.27530,102846,427 
1987-05-16 4:03:00,1.27520,1.27570,1.27490,1.27550,103202,356 
1987-05-17 4:04:00,1.27550,1.27640,1.27510,1.27590,103528,326 
...... 
...... 
...... 
2009-02-24 4:00:00,1.27470,1.27530,1.27460,1.27480,101926,356 
2009-02-25 4:01:00,1.27490,1.27520,1.27310,1.27490,102419,493 
2009-02-26 4:02:00,1.27490,1.27540,1.27440,1.27530,102846,427 
2009-02-27 4:03:00,1.27520,1.27570,1.27490,1.27550,103202,356 
2009-02-28 4:04:00,1.27550,1.27640,1.27510,1.27590,103528,326 

ich ein paar AWK Variationen versucht haben, aber ich konnte es nicht zur Arbeit bringen. jede Hilfe

Update: mein Fehler, ich erwähnt haben sollte, dass die Daten oder Jahre von 1981-2016 beginnen

hier ist das, was ich bisher versucht haben:

awk -F, '{ gsub("/","-"); split($1, f, " "); print > ("my_data_" f[1]"v" ".csv")}' INPUT_FILE.csv 

i-Dateien erhalten aufgeteilt in zB

my_data_13-05-87v.csv 
my_data_14-05-87v.csv 
my_data_15-05-87v.csv 

mit Dateiinhalt wie unten

# for my_data_13-05-87v.csv 
13-05-87 4:00:00,1.27470,1.27530,1.27460,1.27480,101926,356 

# for my_data_14-05-87v.csv 
14-05-87 4:01:00,1.27490,1.27520,1.27310,1.27490,102419,493 

# for my_data_15-05-87v.csv 
15-05-87 4:02:00,1.27490,1.27540,1.27440,1.27530,102846,427 

HINWEIS: Die Jahre gehen von 1981 bis 2016

ich die Dateien in zB

my_data_1987-05-13v.csv 
my_data_1987-05-13v.csv 
my_data_1987-05-13v.csv 

mit Dateiinhalt wie unten

# for my_data_1987-05-13v.csv 
1987-05-13 4:00:00,1.27470,1.27530,1.27460,1.27480,101926,356 

# for my_data_1987-05-14v.csv 
1987-05-14 4:01:00,1.27490,1.27520,1.27310,1.27490,102419,493 

# for my_data_1987-05-15v.csv 
1987-05-15 4:02:00,1.27490,1.27540,1.27440,1.27530,102846,427 

zweite Format FRAGE teilen möchten: Ich habe auch ein anderes Format

INPUT_FILE.csv (date format == %d.%m.%y %H:%M:%S) 
13.05.1987 4:00:00.000,1.27470,1.27530,1.27460,1.27480,101926,356 
14.05.1987 4:01:00.000,1.27490,1.27520,1.27310,1.27490,102419,493 
15.05.1987 4:02:00.000,1.27490,1.27540,1.27440,1.27530,102846,427 
16.05.1987 4:03:00.000,1.27520,1.27570,1.27490,1.27550,103202,356 
17.05.1987 4:04:00.000,1.27550,1.27640,1.27510,1.27590,103528,326 


REQUIRED_OUTPUT.csv (date format == %Y-%m-%d %H:%M:%S) 

1987-05-13 4:00:00.000,1.27470,1.27530,1.27460,1.27480,101926,356 
1987-05-14 4:01:00.000,1.27490,1.27520,1.27310,1.27490,102419,493 
1987-05-15 4:02:00.000,1.27490,1.27540,1.27440,1.27530,102846,427 
1987-05-16 4:03:00.000,1.27520,1.27570,1.27490,1.27550,103202,356 
1987-05-17 4:04:00.000,1.27550,1.27640,1.27510,1.27590,103528,326 
+0

Was nächstes Jahr passiert? Abgesehen davon, dass du vermutlich diesen Kurs bestanden hast, musst du dir keine Sorgen machen. Allgemeiner gesagt, wenn Sie auf ein Datum stoßen, an dem das Jahr geschrieben wird 17, oder 27, 37, 47, 57, 67, 77 - wie sollen diese Daten in 2016, 2017, 2020, 2035 usw. abgebildet werden? Es gibt mehrere Möglichkeiten. –

Antwort

1

Sie müssen nur das Eingabefeld Separator / und und neu ordnen die ersten drei Felder neu zu definieren. Wenn das Jahr-Feld einen Wert >16 hat, nehmen Sie das 20. Jahrhundert an, andernfalls das 21. Jahrhundert. Und während es an, schreibt es die Linien Dateien pro Daten genannt:

$ cat script.awk 
{ 
    print ($3>16?"19":"20") $3 "-" $2 "-" $1, $4 > my_data_$1"-"$2"-"$3".csv" 
} 

Run it:

$ awk -F'[/ ]' -f script.awk INPUT_FILE.csv 
+0

Dies funktioniert für die Jahre in 20 ** z. B. 2009, 2010 usw., aber wenn das Jahr 19 ** z. B. 1985, 1990 usw. ist, schlägt es fehl – JourneyMan

+0

@JourneyMan aktualisiert. –

+1

Ich muss in der Lage sein, die Änderungen gemäß den geteilten Dateien zu speichern, um sie nicht auf dem Terminal zu drucken. Werfen Sie einen Blick auf mein awk-Skript Ich versuchte – JourneyMan

0

wäre ein naiver Ansatz substr zu verwenden:

$ awk '{ $1 = sprintf("20%s-%s-%s", 
         substr($1, 7, 2), 
         substr($1, 4, 2), 
         substr($1, 1, 2)) 
     } 1' input.csv 
2009-02-24 4:00:00,1.27470,1.27530,1.27460,1.27480,101926,356 
2009-02-25 4:01:00,1.27490,1.27520,1.27310,1.27490,102419,493 
2009-02-26 4:02:00,1.27490,1.27540,1.27440,1.27530,102846,427 
2009-02-27 4:03:00,1.27520,1.27570,1.27490,1.27550,103202,356 
2009-02-28 4:04:00,1.27550,1.27640,1.27510,1.27590,103528,326 
Verwandte Themen