Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date sed命令更改日期格式_Date_Unix_Sed_Format_Command - Fatal编程技术网

Date sed命令更改日期格式

Date sed命令更改日期格式,date,unix,sed,format,command,Date,Unix,Sed,Format,Command,下面是我正在处理的文件的一个片段: 709ENVUN07,SET1,FE10,GB0009252882,GB,GBX,NULL,S,O,LO,1510.00000000,173,N,F,28022007,07:51:15,3717 208ATNHG07,SET1,FE10,GB0009252882,GB,GBX,NULL,S,O,LO,1550.00000000,1800,N,F,18012007,15:48:21,654681 如您所见,日期的格式如下:28022007,18012007 使

下面是我正在处理的文件的一个片段:

709ENVUN07,SET1,FE10,GB0009252882,GB,GBX,NULL,S,O,LO,1510.00000000,173,N,F,28022007,07:51:15,3717
208ATNHG07,SET1,FE10,GB0009252882,GB,GBX,NULL,S,O,LO,1550.00000000,1800,N,F,18012007,15:48:21,654681
如您所见,日期的格式如下:
28022007
18012007

使用sed,我已成功地更改为我希望的格式

    gzip -dc allGlaxoOrderHistory.CSV.gz |sed 's/\([0-9]\{2\}\)\([0-9]\{2\}\)\(2[0-9]\{3\}\)/\1-\2-\3/g' > newOrderHistory.csv
但是,sed也将
GB0009252882
更改为
GB00-09-252882
,如下所示

709ENVUN07,SET1,FE10,GB00-09-252882,GB,GBX,NULL,S,O,LO,1510.00000000,173,N,F,28-02-2007,07:51:15,3717
208ATNHG07,SET1,FE10,GB00-09-252882,GB,GBX,NULL,S,O,LO,1550.00000000,1800,N,F,18-01-2007,15:48:21,654681
问题是如何将
28022007
18012007
更改为
28-02-2007
18-01-2007
,而不同时更改
GB0009252882

[编辑]

日期字段是从开始算起的第15位。您可以这样编写模式:

sed 's/\(\([^,]*,\)\{14\}..\)\(..\)/\1-\3-/'
其中,
,[^,]*,
描述一个字段(带分隔符)

使用awk还可以更轻松地按字段工作。您只需将输入和输出分隔符设置为

使用awk(Gnu),瞄准第15个字段:

awk -F, -vOFS=, '{$15=gensub(/(..)(..)(....)/, "\\1-\\2-\\3", "g", $15)}1' yourfile

参数
-F,
设置输入分隔符,
-vOFS=,
设置输出分隔符。结尾处的
1
用作
打印的快捷方式。

使用线尾定位,您肯定不需要
/g
全局修饰符。日期不是我的最后一个字段,您可以在下面查看:709ENVUN07,SET1,FE10,GB0009252882,GB,GBX,NULL,S,O,LO,1510.00000000 173,N,F,28022007,07:51:153717以前从未使用过awk,请告知我如何使用它example@Hassan ... 如果没有其他8位字段,您可以(象征性地)
s/,DDMMYYYY,/,DD-MM-YYYY,/
。。。也就是说,在匹配中包含周围的逗号,并确保将它们放回替换项中。您还应使用此完整记录编辑您的问题——仅使用部分3字段示例,您的问题具有误导性。@StephenP谢谢,我已根据要求更改了问题以演示完整字段,但是s/,DDMMYYYY,/,DD-MM-YYYY,/没有做任何事情