【问题标题】:add characters each two places within sed在 sed 中每两个位置添加字符
【发布时间】:2020-07-19 03:39:46
【问题描述】:

我正在处理 csv 文件,它们是来自数据库的地震目录,我需要像 USGS 格式一样排列它们,以便开始另一个步骤。

我的输入数据格式是:

DatesT,Latitude,Longitude,Magnitude,Depth,Catalog
1909,7,23,170000,-17.430,-66.349,5.1,0,PRE-GEM-ISC
1913,12,14,024500,-17.780,-63.170,5.6,0,PRE-GEM-ISC

USGS 输入格式是

DatesT,Latitude,Longitude,Magnitude,Depth,Catalog
1909-7-23T17:00:00,-17.430,-66.349,5.1,0,PRE-GEM-ISC
1913-12-14T02:45:00,-17.780,-63.170,5.6,0,PRE-GEM-ISC

为了将我的输入“转换”为 USGS 格式,我执行了以下步骤:

archi='catalog.txt'
sed 's/,/-/1' $archi > temp1.dat   # to change "," to "-" 
sed 's/,/-/1' temp1.dat > temp2.dat  # same as above
sed 's/,/T/1' temp2.dat > temp3.dat   # To add T between date and time
sed -i.bak "1 s/^.*$/DatesT,Latitude,Longitude,Magnitude,Depth,Catalog/" temp3.dat  #to preserve the header.

我有以下输出:

DatesT,Latitude,Longitude,Magnitude,Depth,Catalog
1909-7-23T170000,-17.430,-66.349,5.1,0,PRE-GEM-ISC
1913-12-14T024500,-17.780,-63.170,5.6,0,PRE-GEM-ISC

我尝试实现以下命令:

sed 's/.\{13\}/&: /g' temp3.dat > temp4.dat

不幸的是,它并没有像我想象的那样工作,因为所有行的位置都不相同。

你有什么想法可以改进我的代码吗?

【问题讨论】:

  • 您的实际文件是否有这些标题行?
  • @Shawn,是的,他们有这些标题

标签: regex csv sed


【解决方案1】:

使用 GNU sed 的一种方式:

sed -r 's/([0-9]{4}),([0-9]{1,2}),([0-9]{1,2}),([0-9]{2})([0-9]{2})([0-9]{2})(,.*)/\1-\2-\3T\4:\5:\6\7/'  file

您将文件拆分为单独的标记,即第 1 列作为标记 2,第 2 列作为标记 2,到第 4 列时,将 2 个数字作为标记,然后根据需要替换它。

【讨论】:

  • 在这种情况下,令牌的澄清是正确的,谢谢
【解决方案2】:

你可以这样做:

cat initialfile.csv|perl -p -e "s/^(\d{4}),(\d+),(\d+),(\d{2})(\d{2})(\d{2}),([0-9.-]+),([0-9.-]+),(.*)$/\1-\2-\3T\4:\5:\6,\7,\8,\9/g"

或用于内联编辑:

perl -p -i -e "s/^(\d{4}),(\d+),(\d+),(\d{2})(\d{2})(\d{2}),([0-9.-]+),([0-9.-]+),(.*)$/\1-\2-\3T\4:\5:\6,\7,\8,\9/g" initialfile.csv

应该输出USGS格式

【讨论】:

    【解决方案3】:

    这可能对你有用(GNU sed):

    sed -E  '1!s/^([^,]*),([^,]*),([^,]*),(..)(..)/\1-\2-\3T\4:\5:/' file
    

    忘记标题。

    用破折号- 替换第一个和第二个字段分隔符(所有字段都由逗号, 分隔)。

    将第三个字段分隔符替换为T

    将第四个字段分成三个相等的部分,并用冒号分隔每个部分:

    注意第四个字段的最后一部分将保持原样,因此不需要定义。

    有时作为程序员,我们过于关注数据,如果以艺术家的身份看待问题并编码我们所看到的,会更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      • 2021-08-02
      • 2020-04-03
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      相关资源
      最近更新 更多