我在尝试弄清楚如何使用 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 工具可以做到这一点吗?
谢谢
如果后面跟着
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
命令中,或者仅使用您需要的空格数。
使用 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