【问题标题】:Unwrap paragraphs while deleting spaces删除空格时展开段落
【发布时间】:2015-05-11 12:19:30
【问题描述】:

我在试图弄清楚如何使用 sed、tr 等更改文件的格式时遇到了令人沮丧的结果。我确信有一些正确的答案可以做我想做的事,我只是不知道它是什么。

这是我的问题。我有一个如下所示的数据文件:

   8587  812.700  152.791  12.7410   0.0372  99.9999   9.9999  12.2520   0.0436  99.9999   9.9999  99.9999   9.9999  99.9999   9.9999
                           99.9999   9.9999  99.9999   9.9999  99.9999   9.9999  99.9999   9.9999  99.9999   9.9999  99.9999   9.9999
                           99.9999   9.9999  99.9999   9.9999  99.9999   9.9999  13.1942   0.0589  99.9999   9.9999  99.9999   9.9999
                           99.9999   9.9999  12.9601   0.1323  99.9999   9.9999   1.0337   0.3166

我想把它变成一行。每个文件中大约有 10,000 个这样的块。我想我想删掉任何后跟 26 个空格的换行符,这样就可以完成工作并将换行符留在下一个块中。

那么,有什么方便的 linux 工具可以做到这一点吗?

谢谢

【问题讨论】:

  • 到目前为止你有没有尝试过?

标签: linux sed tr


【解决方案1】:

如果后面跟有26 空格,这会切断换行符:

awk '{printf "%s",(/^                          /?$0:RS $0)}' file

您还想删除26 空格吗?

awk '{printf "%s",(/^                          /?$0:RS $0)}' file | awk '{gsub(/                          /,"")}1'
   8587  812.700  152.791  12.7410   0.0372  99.9999   9.9999  12.2520   0.0436  99.9999   9.9999  99.9999   9.9999  99.9999   9.9999 99.9999   9.9999  99.9999   9.9999  99.9999   9.9999  99.9999   9.9999  99.9999   9.9999  99.9999   9.9999 99.9999   9.9999  99.9999   9.9999  99.9999   9.9999  13.1942   0.0589  99.9999   9.9999  99.9999   9.9999 99.9999   9.9999  12.9601   0.1323  99.9999   9.9999   1.0337   0.3166

另一个例子:
如果下一行以 6 个空格开头,则删除换行符和 6 个空格。

cat file
data here
      more data
      not here
but this is new line
so i this

这里是一个awk,顶部没有空行,并且结尾正确。

awk '{split($0,a,"     ")} NR==1 {a[2]=$0} {printf "%s",(/^      /||NR==1?a[2]:RS $0)}END{print ""}' file
data here more data not here
but this is new line
so i this

重写代码:

awk '{printf "%s",(gsub(/ {5}/,"")||NR==1?$0:RS $0)} END {print ""}' file
data here more data not here
but this is new line
so i this

如果{5}(空格数)不起作用,请尝试将--re-interval 添加到您的awk 命令中,或者只使用您需要的空格数。

【讨论】:

  • 可以使用/^ {26}/匹配行首的26个空格。
  • @JonathanLeffler 是的,但不适用于gnu awk 3.x,您需要在其中添加选项--re-interval--posix
  • 壮丽的。第二个选项,删除空格,正是我所需要的。比我拼凑在一起的 fortran 代码更快、更容易。
  • --re-interval 在 gawk 3.0 中首次引入,RE 间隔支持成为 4.0 中的默认设置。见gnu.org/software/gawk/manual/gawk.html#Feature-History。我捐了 5 美元让 Arnold 将该部分放入手册中,所以请阅读:-)!顺便说一句,不要使用 --posix 除非你有一个非常具体的目的,因为它会禁用所有其他 gawk 好东西(例如 gensub())。
  • @EdMorton 感谢 cmets 的启发 :)
【解决方案2】:

使用 GNU awk 进行多字符 RS:

$ gawk -vRS='^$' -vORS= '{gsub(/\n {26}/,"")}1' file
   8587  812.700  152.791  12.7410   0.0372  99.9999   9.9999  12.2520   0.0436  99.9999   9.9999  99.9999   9.9999  99.9999   9.9999 99.9999   9.9999  99.9999   9.9999  99.9999   9.9999  99.9999   9.9999  99.9999   9.9999  99.9999   9.9999 99.9999   9.9999  99.9999   9.9999  99.9999   9.9999  13.1942   0.0589  99.9999   9.9999  99.9999   9.9999 99.9999   9.9999  12.9601   0.1323  99.9999   9.9999   1.0337   0.3166

【讨论】: