如何将逗号插入文件以使其成为CSV?

时间:2017-03-07 21:58:48

标签: csv awk sed command-line-interface

我刚刚将一些数据捕获到CSV文件中但是缺少逗号。根据数据的性质,使用正确的工具将它们添加回来看起来非常简单。

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

以下是数据摘录:

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个字符后面(在第3个小数位后的秒数之后)添加逗号
  • 在每行结尾前添加逗号5个字符(只有中间列的长度可变

但是如何最好地自动化1000多条线?

4 个答案:

答案 0 :(得分:1)

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

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

选项:

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

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

正则表达式模式成分:

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

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

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

答案 1 :(得分:1)

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添加点,

可以扩展到更多断点。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

使用以下jq过滤器:

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

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