我在 csv 文件中写入的日期为 19/10/2014。我希望其格式为 19-Oct-2014

我在 csv 文件中写入的日期为 19/10/2014。我希望其格式为 19-Oct-2014

我的 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
$

相关内容