2016-12-29 17 views
0

Ich habe riesige Menge von Dateien, wobei jede Zeichenfolge ein JSON mit falschem Datumsformat ist. Das Format, das ich für jetzt habe, ist 2011-06-02 21:43:59 und was ich tun muss, ist hinzuzufügen T dazwischen, um es in ISO-Format 2011-06-02T21:43:59 umzuwandeln.awk Ändern Datetime-Format

Kann mir bitte jemand auf eine Einliner-Lösung hinweisen? Kämpfte damit für 2 Stunden, aber kein Glück.

+3

zeigen eine Probe, 5 oder 10 Stück in einer Datei sollte ausreichen . – Lizardx

+1

zeigen Sie uns eine Beispieldatei! – NinjaGaiden

+1

Es ist unklar, was mit _ "Anzahl der Dateien, wo jeder String ein JSON ist" _ gemeint ist. Meinst du, dass jede Datei mehrere JSON-Objekte enthält? –

Antwort

0

Die folgende scheint die Arbeitslösung zu sein:

sed -i -r 's/([0-9]{4}-[0-9]{2}-[0-9]{2}) ([0-9]{2}:[0-9]{2}:[0-9]{2})/\1T\2/g' myfiles

  • -i Dateien zu verarbeiten
  • -r auf erweiterten regulären Ausdruck
  • ([0-9]{4}-[0-9]{2}-[0-9]{2}) zu wechseln ist - ist für Datum
  • - der Abstand zwischen Datum und Uhrzeit in Quelldaten
  • ([0-9]{2}:[0-9]{2}:[0-9]{2}) - für Zeit ist
1

sed wird zu Ihrer Rettung kommen, mit einem einfachen regex:

sed 's/\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\) /\1T/g' file > file.new 

oder die Datei an seinem Platz zu ändern:

sed -i 's/\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\) /\1T/g' file 

Beispiel

echo '2011-06-02 21:43:59' | sed 's/\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\) /\1T/g' 
2011-06-02T21:43:59 

lesen mehr über Regexe hier: Regex Tag Info

+0

Das scheint nicht zu funktionieren, bitte, siehe meine Lösung. –

+0

@ mr.nothing: Es hat für mich funktioniert (versuchte es auf Ubuntu 12.04). Was ist der Fehler, den Sie bekommen? Ich habe eine Beispielausgabe in meiner Antwort gepostet. – codeforester

0

Auch mit awk, können Sie Gruppe übereinstimmen mit gensub:

awk '{ 
    print gensub(/([0-9]{4}-[0-9]{2}-[0-9]{2})\s+([0-9]{2}:[0-9]{2}:[0-9]{2})/, 
     "\\1T\\2", 
     "g"); 
}' data.txt 
0
echo '2011-06-02 21:43:59' | awk 'sub(/ /,"T")' 
2011-06-02T21:43:59