从模式开始的行后删除换行符

时间:2016-06-10 06:05:50

标签: bash awk

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

One
PATTERN bla bla bla
Three
Four    

到这个

One
PATTERN bla bla bla Three
Four

这种“awk”解决方案不起作用。 Removing new line after a particular text via bash/awk/sed/perl:它将两行打印为一行,但第二行在开头处打印,部分覆盖第一行。

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

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来自哪里?

3 个答案:

答案 0 :(得分:2)

您可以使用ORS输出记录预测器轻松完成

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"'

示例

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

它的作用是什么?

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

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

答案 1 :(得分:1)

sed -e '/^PATTERN/{N; s/\n/ /;}'

答案 2 :(得分:0)

假设你在解决方案下面有gnu-awk:

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

应该这样做。