我有一个以以下格式输出数据的程序
date, time,field1,field2,field3,fieldn
12/20/14,08:01:53,318.622,0.93712,21.6867,1.1089
该文件有很多列,所有这些列都需要保持不变
日期格式是美国,但我需要非美国即
date, time,field1,field2,field3,fieldn,....
20/12/14,08:01:53,318.622,0.93712,21.6867,1.1089,....
实现这一目标的最简单方法是什么?我查了一下,有一些例子,但不完全是我的情况。还研究了 date 命令、awk 和 sed,但我不知道足以创建命令。例如这个答案使用 awk 看起来不错,但对我的文件没有任何作用。
我使用的是 Mac,因此需要适用于 OSX 提供的版本的命令。
答案1
sed -E 's,^([0-9]+)/([0-9]+),\2/\1,'
解释
sed -E
:将 sed 与扩展正则表达式一起使用,这样我们就不必转义()
等。s/foo/bar/
sed
:这是搜索foo
并将其替换为 的通用语法bar
。在这里,我使用,
代替,因为表达式中/
有s,这将简化它(再次避免令人困惑的转义。因此, ./
s,foo,bar,
^([0-9]+)/([0-9]+)
:搜索行的开头^
,后跟一个或多个数字[0-9]+
,并将其放入捕获组中()
。这是这个月。接下来是/
另一个捕获组中的一个或多个数字(即日期)。\2/\1
:将其替换为第二个捕获组(天),后跟/
,然后是第一个捕获组(月)。
用法
您可以将文件通过管道传输到此命令中,即 ie <your_command_here>| sed…
,也可以直接在您的文件上运行它,即sed… file.txt
。这将直接输出到命令行。要写入新文件,请附加> output.txt
到命令中。
答案2
我建议您在重新格式化日期时使用标准 (ISO) 格式:YYYY-mm-dd
perl -MTime::Piece -F, -lane '
if ($.>1) {$F[0] = Time::Piece->strptime($F[0], "%m/%d/%y")->strftime("%F")}
print join ",", @F
'
另外,当您考虑非本地日期时间时,该时间戳属于哪个时区?是世界标准时间吗?