对于这样的文件名:
fileLoad.xml2017-12-21_10_55_53-153.txt
otherFile.xml2017-12-20-11_23_01-87899.txt
someFile.xml2017-11-30-21_00_59-1.txt
我想要完成的awk
是隔离文件名.xml
,然后隔离并格式化时间戳以在 csv/数据库中使用。
我有以下内容:
NR==1 {
fn=substr(FILENAME, 0, FILENAME-5);
ts=fn;
sub(/[0-9]{4}.*$/,"",fn);
sub(/^\w+\.xml/,"",ts);
} {
printf "fn\tts"
}
我可以从末尾去掉“-”,但之后我无法弄清楚如何在 awk 中将剩余的时间戳转换为2017-11-30 21:00:59
.
答案1
这是可行的,尽管我个人不会为此使用 awk,但我会使用 gawk,它具有一些重要的功能,可以使这种精确类型操作变得容易,gensub()..
echo 'fileLoad.xml2017-12-21_10_55_53-153.txt
otherFile.xml2017-12-20-11_23_01-87899.txt
someFile.xml2017-11-30-21_00_59-1.txt' | awk '{
gsub(/^.*\.xml|-[0-9]+\.txt/,"",$0);
date=$0;
time=$0;
sub(/[-_][0-9]{2}_[0-9]{2}_[0-9]{2}$/,"",date);
sub(/^[0-9]{4}-[0-9]{2}-[0-9]{2}[-_]/,"",time);
gsub(/_/,":",time);
print date " " time
}'
2017-12-21 10:55:53
2017-12-20 11:23:01
2017-11-30 21:00:59
由于您指定了 awk,这是一种方法,尽管有点基本。
请注意,由于缺少 gensub,我将 0 美元的值转移给了两个持有者,因此我可以去掉一个持有者的开头和另一个持有者的结尾。
如您所见,删除最初的开始者/结束者很容易,只留下日期/时间数据来进一步处理。
使用 gawk 和 gensub 更容易。
echo 'fileLoad.xml2017-12-21_10_55_53-153.txt
otherFile.xml2017-12-20-11_23_01-87899.txt
someFile.xml2017-11-30-21_00_59-1.txt' | gawk '{
gsub(/^.*\.xml|-[0-9]+\.txt/,"",$0);
datetime = gensub(/^([0-9-]{10})[-_]([0-9_]{8})$/,"\\1 \\2",1,$0);
gsub(/_/,":",datetime);
print datetime
}'
2017-12-21 10:55:53
2017-12-20 11:23:01
2017-11-30 21:00:59
请注意,开始/结束模式执行相同的操作,一个采用实际模式并复制它,第二个只是说,给我前 10 个与 [0-9-] 匹配的内容,最后 8 个与 [0-9_] 匹配的内容,这只是取决于哪个更容易阅读。
真正的问题是,使用 Perl 来完成这项工作是否会更好。