我有很多文件。文件格式为年(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
。
- 这
s
(替代)命令使用以下语法:s/regexp/replacement/flags
.
匹配任意字符,并且^.
匹配一行的第一个字符&
反向引用模式空间的整个匹配部分s/^./$files&/
说用第一个字符之前的文件名替换第一个字符s/./&-/4
使用数字标志4
将第 4 个字符( 的第 4 个匹配项.
)替换为-
第 4 个字符之后的s/./&-/7
用-
第 7 个字符之后替换第 7 个字符(注意,在-
第 4 个字符之后插入后,第 6 个字符变为第 7 个字符)。
而且当然,
s/.txt/T/
替换.txt
为T
和s/ -> / /
->
用一个空格替代。
这是输出:
2015-01-01T00:00:13 001528
2015-01-02T00:00:13 001528