我刚刚将一些数据捕获到CSV文件中但是缺少逗号。根据数据的性质,使用正确的工具将它们添加回来看起来非常简单。
我觉得awk
,sed
,cut
或类似内容可能有用,但我并不完全确定如何最好地应用它们。
以下是数据摘录:
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
参与规则很简单:
但是如何最好地自动化1000多条线?
答案 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,产生所需的结果。