У меня есть много файлов. Формат файла является годом (4-разрядный) месяц (2-разрядный) (2-разрядный) день
Демонстрационные имена файлов:
Содержание демонстрационных имен файлов
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
Ведите.
Это даст Вам желаемый вывод, используя 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
Если у Вас есть 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