2016-04-11 2 views
1

Ich automatisiere einige Daten, die im .csv-Format generiert werden und ich stehe fest, wenn es darum geht, die Felder mit Datenwerten zu formatieren. Bitte hilf mir dabei.Wie ändert man das Datumsformat der Daten für jede Zeile in Unix?

Ich habe folgende Daten in einer CSV-Datei:

April 3 2016 FL 03112017 0 
April 4 2016 CA 04022016 0 
April 5 2016 TX 04302016 0 
April 6 2016 OH 05292016 0 
April 7 2016 AZ 06092016 0 
April 8 2016 MA 06252016 0 

Ich möchte die Datei wie folgt erstellen:

2016-04-03 FL 03112017 0 
2016-04-04 CA 04022016 0 
2016-04-05 TX 04302016 0 
2016-04-06 OH 05292016 0 
2016-04-07 AZ 06092016 0 
2016-04-08 MA 06252016 0 

ich versucht habe, es awk verwenden, mit so etwas wie dieses :

awk -F "\t" '{print "date -d "$1" +'%Y-%m-%d'",$2,$3}' file.csv > file1.txt 

Das funktioniert nicht. Ich kann dem $ 1, der gedruckt werden soll, keinen resultierenden/berechneten Wert zuweisen.

+0

Mögliche Duplikat [Converting Daten in AWK] (http://stackoverflow.com/questions/2121896/converting-dates-in-awk) – bufh

+0

Nein, es ist kein dup davon, da dieser Eingang Probe enthält das Jahr. Außerdem ist die Antwort, die in dieser Frage ausgewählt wird, nicht groß, da das erste Skript darin unnötigerweise eine Subshell erzeugt und ein Shell-Werkzeug für jede Zeile in der Datei aufruft, wenn es nur einmal das Jahr herausfinden und dann drucken musste den Text in jeder Zeile mischen und die zweite Antwort verwendet "getline" falsch (kein Test/Schutz für Fehler). –

Antwort

2

Keine Datum erforderlichen Funktionen, nur der Text schlurfenden:

$ awk ' 
    BEGIN{m="JanFebMarAprMayJunJulAugSepOctNovDec"} 
    {printf "%04d-%02d-%02d %s %s %s\n",$3,(match(m,substr($1,1,3))+2)/3,$2,$4,$5,$6} 
    ' file 
2016-04-03 FL 03112017 0 
2016-04-04 CA 04022016 0 
2016-04-05 TX 04302016 0 
2016-04-06 OH 05292016 0 
2016-04-07 AZ 06092016 0 
2016-04-08 MA 06252016 0 
+1

Dank @Ed Morton. Das funktioniert. Können Sie mir bitte mitteilen, ob ich die Datumsformatierung (mit dem date-Befehl wie in dem Code, den ich erwähnt habe) im 'awk'-Befehl verwenden kann? Dies würde mir bei anderen Operationen helfen, die ich tun muss. – Jonathan

+0

Gern geschehen. Ja, du kannst das, aber wenn du GNU awk hast, musst du es nicht tun, da [gawk hat eigene Zeitfunktionen] (http://www.gnu.org/software/gawk/manual/gawk.html#Time-Functions) . Wenn Sie mit der Option "-d" rechnen, verwenden Sie das GNU-Datum, also sollten Sie auch GNU awk verwenden. –

+0

Hey, dieser Code ist nützlich, aber ich habe einige Schwierigkeiten mit dem Trennzeichen während der Verwendung. Die Eingabedatei ist tabulatorgetrennt und die Ausgabedatei muss ebenfalls tabulatorgetrennt sein. Ich habe verschiedene Varianten des Codes ausprobiert, um eine tabulatorgetrennte Datei zu erzeugen, aber das kann ich nicht. Kannst du mir bitte dabei helfen? – Jonathan

1

Hier verwende ich date die Monatsnamen zu generieren: nicht unbedingt erforderlich.

awk -v monthNames="$(for m in $(seq 1 12); do date -d "$m/1" +%B; done | paste -sd,)" ' 
    BEGIN { 
     split(monthNames, mn, ",") 
     for (i=1; i<=12; i++) m[mn[i]] = i 
     delete mn 
     FS = OFS = "\t" 
    } 
    { 
     split($1, d, " ") 
     $1 = sprintf("%d-%02d-%02d", d[3], m[d[1]], d[2]) 
     print 
    } 
' file.csv 
Verwandte Themen