使用 awk 分解时间戳并格式化它

使用 awk 分解时间戳并格式化它

对于这样的文件名:

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 来完成这项工作是否会更好。

相关内容