我的 CSV 文件中的日期为19/10/2014
.我想要它的格式19-Oct-2014
。
答案1
该date
命令可以为您格式化:
date -d "2014-10-19" +%d-%b-%Y
这产生
19-Oct-2014
如果您提供文件的示例行,我们可以为您编写脚本。
一种方法是使用awk
:
echo zzz,19/10/2014,aaa,bbb | awk -F, '{split($2,dateelem,"/"); cmd = "date -d " dateelem[3] "-" dateelem[2] "-" dateelem[1] " +%d-%b-%Y"; cmd | getline date; OFS=","; $2=date; print; close(cmd)}'
这使
zzz,19-Oct-2014,aaa,bbb
假设您希望修改第二个字段。"split($2,dateelem,"/");"
在脚本中进行调整awk
以更改您的日期显示的字段(列)号
答案2
完全使用 GNU awk 的解决方案如下:
awk '{ split($0,slt,"/");datspec=mktime(slt[3]" "slt[2]" "slt[1]" 00 00 00");print strftime("%d-%b-%Y",datspec) }' <<< "19/10/2014"
以日期作为输入,我们首先将数据拆分为数组(slt)以获得日期、月份和年份。然后,我们使用 awk 的 mktime 函数获取日期规范,然后 awk 的 sttftime 函数使用该规范来获取正确格式的日期。
对于 csv,$0 将是与包含日期的逗号分隔字段相对应的数字。
答案3
perl 可以做到,但它并不适合初学者。但是,解析日期最好由适当的日期处理库来处理。 perl 盒子里有一个,Time::Piece
$ cat file
a,b,19/10/2014,d
$ perl -MTime::Piece -F, -lane '
$F[2] = Time::Piece->strptime($F[2], "%d/%m/%Y")->strftime("%d-%b-%Y");
print join ",", @F
' file
a,b,19-Oct-2014,d
答案4
另一种awk
方法。使用基本awk
功能,因此可能与非 GNU 实现一起使用。
$ cat infile
foo,19/10/2014,bar
foo2,19/01/2015,bar2
$ awk -F, '{print $1","substr($2,0,2)"-"substr("JanFebMarAprMayJunJulAugSepOctNovDec",substr($2,4,2)*3-2,3)"-"substr($2,7,4)","$3}' infile
foo,19-Oct-2014,bar
foo2,19-Jan-2015,bar2
$