2016-12-26 69 views
0

我有一个文本文件looks like this。我试图将其转换为标准格式,其中列分隔符为,(已存在,\r\n为行终止符)从大文件中删除空行并使用sed创建分隔文件

问题是,当前文件有点类似于固定宽度+逗号分隔。有167列用逗号分隔,当前文件中的行形成多行,每行有一行行终止符,大多数加载/外部表工具都不支持这种格式,每行之后还有空行,我希望除去

我曾尝试SED到目前为止 -

zcat myfile.txt.gz | sed 's/^\ *$/%%%/g' | xargs | sed -e 's/%%%/\n/g' -e 's/\ //g' > myfile.txt 

上面确实转换了文件,一切看起来都很好。但我注意到有些行没有正确转换。例如,在一些行中,我只有117列。

我在sed中缺少什么?有没有更好/更快的方法来做到这一点?请注意,我处理的文件大约是每个未压缩的25 GB,并且我有超过100个文件。

Sample input

Desired Output(前两个样品输入线)

+0

什么是您预期的输出从那个文件? – Inian

+1

请将样本输入和您希望的输出样本输入**添加到您的问题**中。 – Cyrus

+0

我已经更新了样本输入和期望输出的问题。 –

回答

1

我真的做这种方式:

zcat myfile.txt.gz | while read line ; do if test "$line" = "" ; then printf "\r\n" ; else printf "$line" ; fi ;done > myfile.txt 

在样品输入我获得总168列(167个逗号)。您可以运行此代码来验证每行逗号的数量。获得

zcat myfile.txt.gz | while read line ; do if test "$line" = "" ; then printf "\r\n" ; else printf "$line" ; fi ;done | sed s/[^,]//g | while read a ; do echo "$a" | wc -c ; done 

输出从您共享所需的输出略有不同(我有一个额外的0)

0

我终于实现了这一点,它解决了这个问题:

zcat myfile.txt.gz | sed -r 's/[ ]+/vin/g'|tr -d '\n'|tr 'vinvin' '\n'|grep -v '^$' > myfile.txt