Bash 删除以图案开头的行后的换行符

Bash 删除以图案开头的行后的换行符,bash,awk,Bash,Awk,我找到了类似问题的解决方案,但并不完全是我想要的。 基本上,如果第一行以给定的模式开始,我想将两行合并为一行。 由此 One PATTERN bla bla bla Three Four 对此 One PATTERN bla bla bla Three Four 这个“awk”解决方案不起作用。 :它将两行打印为一行,但第二行在开头,并部分覆盖第一行 编辑:所有这些解决方案都有相同的结果。为了更清楚,我将把原文放在这里。 原始行 LOCUS NODE_10_length_

我找到了类似问题的解决方案,但并不完全是我想要的。 基本上,如果第一行以给定的模式开始,我想将两行合并为一行。 由此

One
PATTERN bla bla bla
Three
Four    
对此

One
PATTERN bla bla bla Three
Four
这个“awk”解决方案不起作用。 :它将两行打印为一行,但第二行在开头,并部分覆盖第一行

编辑:所有这些解决方案都有相同的结果。为了更清楚,我将把原文放在这里。 原始行

LOCUS       NODE_10_length_218773_cov_81.1626_ID_>218773 bp   DNA linear
BCT09-MAY-2016
sed和awk处理返回

 BCT09-MAY-2016E_10_length_218773_cov_81.1626_ID_>218773 bp   DNA linear
但是如果我把stdout重定向到一个文件,我们就快到了

LOCUS       NODE_10_length_218773_cov_81.1626_ID_>218773 bp   DNA linear^M BCT09

但是^M从何而来?

假设您有下面的gnu awk解决方案:

awk 'BEGIN{RS="^$"}{$0=gensub(/bla\nThree/,"bla Three","g",$0);print}' your_file

应该这样做。

您可以使用
ORS
输出记录sparator轻松地完成此操作

sed -e '/^PATTERN/{N; s/\n/ /;}'
awk '$1 !~ /PATTERN/{ORS="\n"} $1 ~ /PATTERN/{ORS=" "} 1'
示例

$ awk '$1 !~ /PATTERN/{ORS="\n"} $1 ~ /PATTERN/{ORS=" "} 1' input
One
PATTERN bla bla bla Three
Four
$ awk 'ORS = $1 ~ /PATTERN/ ? " " : "\n"' input
One
PATTERN bla bla bla Three
Four

或者更简单地说

awk 'ORS = $1 ~ /PATTERN/ ? " " : "\n"'
示例

$ awk '$1 !~ /PATTERN/{ORS="\n"} $1 ~ /PATTERN/{ORS=" "} 1' input
One
PATTERN bla bla bla Three
Four
$ awk 'ORS = $1 ~ /PATTERN/ ? " " : "\n"' input
One
PATTERN bla bla bla Three
Four
它的作用是什么?

  • ORS=$1~/PATTERN/?“”:“\n”
    根据模式匹配将
    or
    设置为空格或换行符

    现在表达式的计算结果总是true,在这种情况下,
    awk
    将打印整个输入记录


这些解决方案不起作用,在这里没有多大用处。但向我们展示您如何修改这些解决方案以适应您的问题是很有用的。我怀疑您的源文件是在Windows上生成的,其中行尾包含CR+LF,而在Linux上这只是LF。解决方案是无条件删除
\r
字符。你说得对,我以前没有遇到过这个问题。删除后一切都正常\r因此可能会被视为重复的问题刚才注意到您链接到的问题中给出了此解决方案…您需要澄清此处给出的解决方案的错误,因为它们似乎回答了您的问题。老实说,我没有注意到此解决方案,因此感谢您指出。不管怎样,我只是尝试并意识到所有这些a解决方案都有一个共同的问题,我将在第一篇文章中写到。谢谢,特别是对于总是有用的解释。但由于某些原因,它几乎可以正常工作(请参阅主帖子中的编辑)