【问题标题】:How to insert commas into a file to make it a CSV?如何在文件中插入逗号以使其成为 CSV?
【发布时间】:2018-05-17 05:12:09
【问题描述】:

我刚刚将一些数据捕获到 CSV 文件中,但逗号丢失了。就数据的性质而言,使用正确的工具将它们添加回来似乎是一项非常简单的工作。

我觉得awksedcut 或类似的可能有用,但我不完全确定如何最好地应用它们。

这是数据的 sn-p:

17-03-07 20:45:56.400-1.0040.00
17-03-07 20:45:56.5003.1040.00
17-03-07 20:45:56.6002612.0039.50
17-03-07 20:45:56.7002611.0839.00

它应该是这样的:

17-03-07 20:45:56.400,-1.00,40.00
17-03-07 20:45:56.500,3.10,40.00
17-03-07 20:45:56.600,2612.00,39.50
17-03-07 20:45:56.700,2611.08,39.00

参与规则很简单:

  • 共有三列
  • 在字符 21 后添加逗号(秒的小数点后第三位)
  • 每行末尾加逗号5个字符(只有中间一列是可变长度的

但是如何最好地自动化 1,000 行?

【问题讨论】:

    标签: csv awk sed command-line-interface


    【解决方案1】:

    使用带有特定正则表达式模式的sed流编辑器的解决方案:

    sed -Ei 's/^(.{21})(.+)(.{6})$/\1,\2,\3/' testfile
    

    选项:

    -E 选项,允许扩展正则表达式

    -i 选项,允许修改(执行替换)文件就地


    正则表达式模式组成:

    (.{21}) - 前 21 个字符的第一个捕获组

    (.+) - 可变长度的中间列的第二个捕获组

    (.{6}) - 最后一列 5 个字符的第三个捕获组

    【讨论】:

      【解决方案2】:

      awk 来救援!

      awk '  {a[1]=0; a[2]=21; a[3]=length($0)-5;
              for(i=1;i<length(a);i++) printf "%s,",substr($0,a[i]+1,a[i+1]-a[i]);
              printf "%s\n",substr($0,a[i]+1)}' file
      

      可以通过向数组a 添加点来扩展到更多断点。

      【讨论】:

        【解决方案3】:
        awk '{sub(/00/,"00,")sub(/.{5}$/,",&")}1' file
        
        17-03-07 20:45:56.400,-1.00,40.00
        17-03-07 20:45:56.500,3.10,40.00
        17-03-07 20:45:56.600,2612.00,39.50
        17-03-07 20:45:56.700,2611.08,39.00
        

        【讨论】:

          【解决方案4】:

          使用以下jq 过滤器:

          length as $l
          | [ .[0:21], .[21:$l-5], .[$l-5:] ]
          | join(",")
          

          并使用 -Rr 选项(原始输入、原始输出)调用 jq 会产生所需的结果。

          【讨论】:

            猜你喜欢
            • 2011-08-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-02-28
            • 2016-04-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多