【问题标题】:Removing blank lines from a huge file and creating a delimited file using sed从大文件中删除空白行并使用 sed 创建分隔文件
【发布时间】:2023-03-15 07:35:01
【问题描述】:

我有一个 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(前两行样本输入)

【问题讨论】:

  • 该文件的预期输出是什么?
  • 请将示例输入和该示例输入的所需输出添加到您的问题
  • 我已经用示例输入和所需输出更新了问题。
  • @RKKuppala:每行有多少列?
  • 每行 167 列,接下来原始文件将有一个空行 - 它应该被删除。

标签: bash sed


【解决方案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)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-12-26
      • 2023-03-08
      • 1970-01-01
      • 2016-07-08
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 2018-03-24
      • 2015-05-20
      相关资源
      最近更新 更多