我有一个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,我有超过一百个。
Desired Output(前两行样本输入)
答案 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