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