Как вставить имя файла путем изменения формата на тот же файл?

У меня есть много файлов. Формат файла является годом (4-разрядный) месяц (2-разрядный) (2-разрядный) день

Демонстрационные имена файлов:

  • 20150101.txt
  • 20150102.txt

Содержание демонстрационных имен файлов

00:00:13 -> 001528

Я хочу извлечь данные как дату от имени файла и затем вставить его в файл

Желаемый вывод

2015-01-01T00:00:13 001528

или

2015-01-01 00:00:13 001528

Я попробовал один из ниже кода

for files in *txt; do
awk -F "->" 'BEGIN{OFS=""} {print FILENAME" ",$1, $2}' <$files > $files.edited
mv $files.edited $files
done

Ведите.

3
задан 10 December 2019 в 11:14

2 ответа

Это даст Вам желаемый вывод, используя sed:

for files in *.txt; do
sed -e "s/^./$files&/;s/./&-/4;s/./&-/7;s/.txt/T/;s/ -> / /" "$files"
done

, Чтобы на самом деле вставить каждый вывод в каждый файл, Вы не должны перенаправлять, как Вы сделали в своей петле. Вы можете просто использовать -i опция вместо -e.

  • s (замена) команда использование следующий синтаксис: s/regexp/replacement/flags
  • . матчи любой знак и ^. матчи первый знак серии
  • & обратные ссылки целая соответствующая часть пространства образца
  • s/^./$files&/ говорит, чтобы заменить первым знаком с именем файла перед первым знаком
  • s/./&-/4 использование флаг числа 4, чтобы заменить 4-м знаком (4-й матч .) с - после того, как 4-й знак
  • s/./&-/7 заменяет 7-й знак - после 7-го знака (обратите внимание, что 6-й знак становится 7-м знаком после вставки - после 4-го знака).

И конечно,

  • s/.txt/T/ замены .txt с T и
  • s/ -> / / замены -> с единственным пробелом.

Это - вывод:

2015-01-01T00:00:13 001528
2015-01-02T00:00:13 001528
2
ответ дан 21 December 2019 в 23:36

Если у Вас есть GNU awk (gawk) затем, Вы могли бы использовать его встроенное Функции Времени , чтобы преобразовать части имени файла и содержания во время эпохи, и затем преобразовать его согласно выбранному формату.

Напр. учитывая

$ cat 20150101.txt 
00:00:13 -> 001528

Затем

$ 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
4
ответ дан 21 December 2019 в 23:36

Другие вопросы по тегам:

Похожие вопросы: