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”
设置为空格或换行符 现在表达式的计算结果总是true,在这种情况下,or
将打印整个输入记录awk
\r
字符。你说得对,我以前没有遇到过这个问题。删除后一切都正常\r因此可能会被视为重复的问题刚才注意到您链接到的问题中给出了此解决方案…您需要澄清此处给出的解决方案的错误,因为它们似乎回答了您的问题。老实说,我没有注意到此解决方案,因此感谢您指出。不管怎样,我只是尝试并意识到所有这些a解决方案都有一个共同的问题,我将在第一篇文章中写到。谢谢,特别是对于总是有用的解释。但由于某些原因,它几乎可以正常工作(请参阅主帖子中的编辑)