我找到了类似问题的解决方案,但并不完全是我想要的。 基本上,如果第一行以给定模式开始,我想将两行连接成一行。 从这个
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来自哪里?
答案 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
应该这样做。