将固定长度文件转换为unix中的分隔文件

时间:2014-04-07 11:39:14

标签: unix sed sh vim

我想将固定长度文件转换为分隔文件。

但是当我使用时:

sed -e 's/./&,/38'  -e 's/./&,/103'  -e 's/./&,/142'  -e 's/./&,/588' test6.txt

我收到错误:

  

后缀太大 - 最多512:

并且gawk无法在我的计算机上运行。

输入文件是

我的输入是

100211                 XFMASKSWNDAKNOT SET        DASAAMS                                 00KP02/03/2013   

输出应该是

100211,XFMASKSWNDAK,NOT SET,DASAAMS,00KP,02/03/2013

请帮帮我

4 个答案:

答案 0 :(得分:1)

似乎没有空格或制表符分隔字段,例如XFMASKSWNDAKNOT NOT位于单独的字段中。

然后你应该使用vim中的字符数,例如

:s/^\(.\{23}\)\(.\{10}\)/\1,\2,/

将在第23个角色后面放置一个昏迷,,在另外10个角色后再放置一个昏迷100211 XFMASKSWNDAKNOT SET DASAAMS 00KP02/03/2013 。输入

100211                 ,XFMASKSWNDAK,NOT SET        DASAAMS                                 00KP02/03/2013 

产量

sed

我没有在您的完整示例中执行此操作,因为您提供的:s/[ ]*,/,/g 命令中的数字似乎与文件和所需的输出不匹配。

然后你可以在昏迷前删除任何空格:

cut

根据@Roland Jansen的建议,使用sed然后{{1}}删除空格之前,昏迷是一种很好的shell方法。

答案 1 :(得分:0)

像这样使用tr

echo 100211                 XFMASKSWNDAKNOT SET        DASAAMS   | tr -s " " | tr " " ","

首先tr将多个空格压缩到一个空格,第二个空格将空格转换为逗号。

或使用文件:

tr -s " " < yourfile | tr " " "," > newfile

答案 2 :(得分:0)

您可以使用:

sed -e 's/\s\+/,/g' test6.txt

唯一不满足的似乎是输入00KP02/03/2013的最后一部分,虽然我觉得它可能是一个拼写错误,00KP和{{之间必须有空格1}}在这种情况下,上面给出的解决方案可以正常工作。

答案 3 :(得分:0)

vim中的这个cmd适用于您的示例输入:

%s/  \+/,/g

如果您想要连续的spacestab被替换,则只处理space

%s/\s\{2,}/,/g