微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何转换文件中的所有unixdate?

我一直在search,并没有成功与此任务..

我有一些GPS数据文件的多个date以秒为单位显示为Unix纪元时间,我需要转换这些,以便我可以将文件数据插入到电子表格中。

date可以转换它们,例如

$ date -d @1441202338 +'%d-%m-%y %H:%M:%s' 02-09-15 21:58:58

unixdate是用引号括起来的十位数字,还有其他更长的数字,如经度和纬度,所以只需要replace我需要find正好十位数的引号。

复制一个字段XML内的数据

如何用cmd.exe中的百分号字符replace?

sed正在打印一个被replace的行两次

防止sed扩展variables

sedreplace字符后的所有事件

我已经开始build立一个sed命令,但我找不到如何search引号中的string,然后只发送string到date

sed "s/([0-9]{10})/$(date -d @1 +'%d-%m-%y %H:%M:%s')/g" file

会把<"放在那里表示一个报价在开始?

我也不确定date能理解1

有人可以指导我解决问题吗?

编辑:

下面是我试图转换的文件中的示例行:

type="waypoint" latitude="22.2091608952380115" longitude="44.65250015586757" name="name" altitude="309.18737800000002" unixtime="1441202338"

其中unixtime="1441202338"必须更改为unixtime="02-09-15 21:58:58" 。

(很明显,这个date不会再是“unixtime”,但是这个标签可以在之后改变)

EDIT2:

最小的文件示例:

'#VIKING GPS Data file http://viking.sf.net/ FILE_VERSION=1 xmpp=4.000000 ympp=4.000000 lat=40.714490 lon=-74.007130 mode=mercator color=#cccccc highlightcolor=#eea500 drawscale=t drawcentermark=t drawhighlight=t ~Layer TrackWaypoint name=name tracks_visible=t waypoints_visible=t routes_visible=t trackdrawlabels=t trackfontsize=3 drawmode=0 trackcolor=#000000 drawlines=t line_thickness=1 drawdirections=f trkdirectionsize=5 drawpoints=t trkpointsize=2 drawelevation=f elevation_factor=30 drawstops=f stop_length=60 bg_line_thickness=0 trackbgcolor=#ffffff speed_factor=30.000000 tracksortorder=0 drawlabels=t wpfontsize=3 wpcolor=#000000 wptextcolor=#ffffff wpbgcolor=#8383c4 wpbgand=f wpsymbol=0 wpsize=4 wpsyms=t wpsortorder=1 drawimages=t image_size=64 image_alpha=255 image_cache_size=300 Metadatadesc= Metadataauthor= Metadatatime=2015-10-03T08:11:32.776627Z Metadatakeywords= ~LayerData type="waypointlist" type="waypoint" latitude="5.2091608952380115" longitude="101.65250015586757" name="different-names" altitude="309.18737800000002" unixtime="1441202338" symbol="navaid,Amber" type="waypointlistend" ~EndLayerData ~EndLayer'

记事本++replace文本获取一些文本

Windows上的命令行search和replace工具的build议

在csv中replace错误的行

Linux删除一行中的字符后的空格

如何使用sedreplace带有反斜杠的string模式

使用gawk 时间函数 。

echo 'altitude="309.18737800000002" unixtime="1441202338"'| gawk '$(NF-1)=strftime("%d-%m-%y %H:%M:%s",$(NF-1))' FS=" OFS="

结果

altitude="309.18737800000002" unixtime="02-09-15 15:58:58"

完整的文件过滤输入文件使用:

gawk '/unixtime=/{$12=strftime("%d-%m-%y %H:%M:%s",$12)}1' FS=" OFS=" inputfile > targetfile

结果

... ... ... ~LayerData type="waypointlist" type="waypoint" latitude="5.2091608952380115" longitude="101.65250015586757" name="different-names" altitude="309.18737800000002" unixtime="02-09-15 15:58:58" comment="29-08-11 8:27:49" symbol="navaid,Amber" type="waypointlistend" ~EndLayerData ~EndLayer

如果您的gawk支持就地更换,请检查: https : //www.gnu.org/software/gawk/manual/html_node/Extension-Sample-Inplace.html

如果GNU sed可用,请查看其替代命令的e标志:

这个命令允许将命令从shell命令输入到模式空间。 如果进行替换,则会执行在模式空间中找到的命令,并将模式空间替换为其输出

这里是我的例子(最难的部分是正确的引用引号):

$ sed -r -e 's/unixtime="([0-9]+)".*/date -d @1 "+unixtime=\"%d-%m-%y %H:%M:%s\""/ge' <<<'type="waypoint" latitude="22.2091608952380115" longitude="44.65250015586757" name="name" altitude="309.18737800000002" unixtime="1441202338" symbol="navaid,Amber"' unixtime="02-09-15 14:58:58"

请注意, /e会导致命令替换替换整个模式空间,所以您可能需要使用保留空间来保留替换之前和之后的文本。 这是读者的一个练习。

Perl解决方案,基于我的GNU sed答案:

perl -pe 's/unixtime="([0-9]+)"/`date -d @$1 "+unixtime=\"%d-%m-%y %H:%M:%s\""`/ge&&s/n//'

对Perl语法的小修改; Perl也不会从date的输出中去掉换行符,所以这里有一个额外的命令。 我在你的示例文件上测试了它,相关的部分变成了

~LayerData type="waypointlist" type="waypoint" latitude="5.2091608952380115" longitude="101.65250015586757" name="different-names" altitude="309.18737800000002" unixtime="02-09-15 14:58:58" symbol="navaid,Amber" type="waypointlistend" ~EndLayerData

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐