从巨大的文件中删除空行并使用sed创建分隔文件

时间:2016-12-26 16:59:30

标签: bash sed

我有一个looks like this的文本文件。我正在尝试将其转换为标准格式,其中,用于列分隔符(已存在,\r\n用于行终止符。

问题是,当前文件有点像固定宽度+逗号分隔。每行应有167列,以逗号分隔。当前文件中的行形成多行,每行包含行终止符。大多数加载/外部表工具不支持此格式。每行之后还有空行,我想删除。

到目前为止我尝试过sed -

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

以上确实转换了文件,一切似乎都很好。但我注意到有些行没有正确转换。例如,在某些行上我只有117列。

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

Sample input

Desired Output(前两行样本输入)

2 个答案:

答案 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)

答案 1 :(得分:0)

我最终这样做了,它解决了这个问题:

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