Wie füge ich einen Dateinamen ein, indem ich das Format derselben Datei ändere?

Wie füge ich einen Dateinamen ein, indem ich das Format derselben Datei ändere?

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 -iOption anstelle von verwenden -e.

  • Dies (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 Musterraums
  • s/^./$files&/sagt, das erste Zeichen durch den Dateinamen vor dem ersten Zeichen zu ersetzen
  • s/./&-/4verwendet dieNummernflagge 4um das 4. Zeichen (die 4. Übereinstimmung von .) durch -nach dem 4. Zeichen zu ersetzen
  • s/./&-/7Ersetzen 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 .txtdurch Tund
  • s/ -> / /ersetzt ->durch ein einzelnes Leerzeichen.

Dies ist die Ausgabe:

2015-01-01T00:00:13 001528
2015-01-02T00:00:13 001528

verwandte Informationen