
Ich habe viele Dateien. Das Dateiformat ist Jahr (4-stellig) Monat (2-stellig) Tag (2-stellig)
Beispieldateinamen:
- 20150101.txt
- 20150102.txt
Inhalt der Beispieldateinamen
00:00:13 -> 001528
Ich möchte Daten als Datum aus dem Dateinamen extrahieren und dann in die Datei einfügen
Gewünschte Ausgabe
2015-01-01T00:00:13 001528
oder
2015-01-01 00:00:13 001528
Ich habe einen der folgenden Codes ausprobiert
for files in *txt; do
awk -F "->" 'BEGIN{OFS=""} {print FILENAME" ",$1, $2}' <$files > $files.edited
mv $files.edited $files
done
Bitte führen Sie.
Antwort1
Wenn Sie GNU awk ( gawk
) haben, können Sie dessen eingebauteZeitfunktionenum Teile des Dateinamens und -inhalts in eine Epochenzeit umzuwandeln und diese dann entsprechend einem ausgewählten Format zu konvertieren.
Beispiel gegeben
$ cat 20150101.txt
00:00:13 -> 001528
Dann
$ awk -F ' -> ' '
split($1,a,/:/) {
ds = sprintf("%04d %02d %02d %02d %02d %02d", substr(FILENAME,1,4), substr(FILENAME,5,2), substr(FILENAME,7,2), a[1], a[2], a[3]);
$1 = strftime("%FT%T", mktime(ds))
}
1
' 20150101.txt
2015-01-01T00:00:13 001528
Antwort2
Dadurch erhalten Sie die gewünschte Ausgabe mit sed
:
for files in *.txt; do
sed -e "s/^./$files&/;s/./&-/4;s/./&-/7;s/.txt/T/;s/ -> / /" "$files"
done
Um tatsächlich jede Ausgabe in jede Datei einzufügen, müssen Sie nicht umleiten, wie Sie es in Ihrer Schleife getan haben. Sie können einfach die -i
Option anstelle von verwenden -e
.
- Die
s
(Ersatz-)Befehlverwendet die folgende Syntax:s/regexp/replacement/flags
.
passt zu jedem Zeichen und^.
passt zum ersten Zeichen einer Zeile&
Rückverweiseder gesamte übereinstimmende Teil des Musterraumss/^./$files&/
sagt, das erste Zeichen durch den Dateinamen vor dem ersten Zeichen zu ersetzens/./&-/4
verwendet dieNummernflagge4
um das 4. Zeichen (die 4. Übereinstimmung von.
) durch-
nach dem 4. Zeichen zu ersetzens/./&-/7
Ersetzen Sie das 7. Zeichen durch-
nach dem 7. Zeichen (beachten Sie, dass das 6. Zeichen nach dem Einfügen nach dem 4. Zeichen zum 7. Zeichen wird-
).
Und natürlich,
s/.txt/T/
Ersatz.txt
durchT
unds/ -> / /
ersetzt->
durch ein einzelnes Leerzeichen.
Dies ist die Ausgabe:
2015-01-01T00:00:13 001528
2015-01-02T00:00:13 001528