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

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

У меня много файлов. Формат файла: год(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

Пожалуйста, помогите.

решение1

Если у вас есть 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

решение2

Это даст вам желаемый результат с помощью sed:

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

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

  • the 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

Связанный контент