Verwenden sed oder awk zu beheben Datumsformat
Ich versuche zum konvertieren einer HTML-Datei mit einer Tabelle ein .csv-Datei mit einem bash
Skript.
Bisher habe ich acomplished Sie die folgenden Schritte aus:
- Konvertieren ins Unix-format (mit
dos2unix
) - Entfernen Sie alle Leerzeichen und tabs (mit
sed 's/[ \t]//g'
) - Entfernen Sie alle leeren Zeilen (mit
sed ':a;N;$!ba;s/\n//g'
) (dies ist notwendig, da der HTML-Datei eine leere Zeile für jede Zelle der Tabelle... das ist nicht meine Schuld) - Entfernen Sie die unnecesary
<td>
und<tr>
- tags (mitsed 's/<t.>//g'
) - Ersetzen
</td>
mit ',' (mitsed 's/<\/td/,/g'
) - Ersetzen
</tr>
mit end-of-line (\n
) Zeichen (mitsed 's/<\/tr/\n/g'
)
Natürlich, ich bin putting all dies in einer pipeline. So weit, ist es großartig. Es gibt einen letzten Schritt bin ich stecken geblieben: Die Tabelle hat eine Spalte mit Daten, die das format dd/mm/yyyy
, und ich möchte Sie zu konvertieren yyyy-mm-dd
.
Gibt es eine (einfache) Möglichkeit, es zu tun (mit sed
oder awk
)?
Daten Probe (nach dem ganzen sed
Rohr):
500,2,13/09/2007,30000.00,12,B-1
501,2,15/09/2007,14000.00,8,B-2
Erwartete Ergebnis:
500,2,2007-09-13,30000.00,12,B-1
501,2,2007-09-15,14000.00,8,B-2
Der Grund, warum ich brauchen, um dies zu tun ist, weil ich brauchen, um diese Daten importieren zu MySQL. Ich könnte die Datei in Excel öffnen und ändern Sie das format von hand, aber ich würde gerne überspringen.
InformationsquelleAutor Barranka | 2013-08-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Awk
kann diese Aufgabe ziemlich leicht:Ergibt:
InformationsquelleAutor Birei
InformationsquelleAutor ash
InformationsquelleAutor lurker
awk
würde für diese Arbeit:als würde man diese
bash
-nur die Optionen:Wenn Sie geschehen, zu verwenden
ksh
, wo eine subshell nicht für die Letzte Komponente der pipeline, das sollte auch funktionieren:In den letzten
bash
können Sie auchshopt -s lastpipe
in einem Skript zu erlauben, den obigen Aufruf so gut funktionieren, aber es wird nicht auf der Kommandozeile arbeiten (Dank an @mklement0 unten in den Kommentaren).Ich lasse es bis zu Ihnen, zum herauszufinden, wie man Integration mit dem rest...
read
-basierten Befehl funktioniert nicht, weilread
läuft in einem subshell in diesem Fall; verwendenecho '08/26/2013' | { IFS=/ read m d y; echo "${y}-${m}-${d}"; }
oderIFS=/ read m d y <<<'08/26/2013'; echo "${y}-${m}-${d}"
Ah, ja.... vergaß ein kleines detail. Es würde die Arbeit in
ksh
, obwohl. Eine alternative wäreIFS=/ read m d y < <(echo 08/26/2013)
zu vermeiden, die subshell (obwohl dieecho
wäre in einer subshell).Gute Punkte, obwohl
<<<
ist wahrscheinlich die meisten effizient hier. In der Bash v4.2+ können Sie auchshopt -s lastpipe
(aber nur in Skripts). Kann ich schlage vor, tht, aktualisieren Sie Ihre Antwort mit einer der Lösungen arbeiten?InformationsquelleAutor twalberg
Bisher alle Antworten sind sehr fallspezifisch zu OP ' s Frage. Hier ist ein allgemeiner Ansatz, laufen (GNU, für
-d
option)date
durchawk
:Natürlich dieser Ansatz funktioniert nur, wenn die Eingabe der Datums-format erfolgt durch
date
. AFAICS ist dies nicht der Fall fürdd/mm/yyyy
leider. Man kann versuchen andere Befehle alsdate
(nicht getestet).Edit : Implementiert mklement0 Kommentar.
Edit2 : Eigentlich funktioniert das nicht mit
mawk
, die Debian-Standard -awk
Umsetzung. Naheliegende Lösung ist die Installationgawk
wenn möglich.date
ist notwendig, da-d
; ebenso|&
ist ein GNU-Awk-Erweiterung, aber nicht wirklich nötig hier:|
tun wird, die es funktionieren lässt alle Awks. Schließlich, ich schlage vor, Sie verwenden Sie Leerzeichen zwischen den Zeichenfolgen verkettet, sowohl für optische Klarheit und zu zeigen, dass die string-Verkettung in Awk funktioniert anders als in der shell; z.B."date -d'" $3 "' +%Y-%m-%d"
(außerdem habe ich das einfache Anführungszeichen zum Schutz gegen das Feld mit Leerzeichen).Danke für Eure Vorschläge, ich habe bearbeitet, die Antwort. Einzelne Zitate nicht, ich ersetzte Sie mit maskierten doppelten Anführungszeichen.
Vielen Dank für die Aktualisierung der Antwort, und vielen Dank für den Fang von meinem single-quotes Fehler (nur um es explizit: einfache Anführungszeichen können nicht verwendet werden, innerhalb des Awk-script, da das script als ganzes ist in einfachen Anführungszeichen).
InformationsquelleAutor Skippy le Grand Gourou
Korrektur zu awk nehme an, Sie suchen yyyy-mm-dd (nicht yyyy-dd-mm)
InformationsquelleAutor user3489631