awk:基于开始或结束模式连接线

awk:基于开始或结束模式连接线,awk,Awk,我有一个多行文件,其中记录由新行分隔(\n) 每个记录拆分都由一些文本break标识 如何使用awk,以便在记录以break开头或结尾时将其连接到上一行或下一行,同时保留记录分隔符 输入($表示下线)。多次中断可以忽略或视为一个: A| break;$ B| break;$ C| break;$ D$ E|$ break; FGH|$ break; IJ| break;$ KLM| break; NOP$ 期望输出: A|B|C|D$ E|FGH|IJ|KLM|NOP$ 当前代码(适用于结束

我有一个多行文件,其中记录由新行分隔
(\n)

每个记录拆分都由一些文本
break
标识

如何使用awk,以便在记录以
break
开头或结尾时将其连接到上一行或下一行,同时保留记录分隔符

输入(
$
表示下线)。多次
中断可以忽略或视为一个:

A| break;$
B| break;$
C| break;$
D$
E|$
break; FGH|$
break; IJ| break;$
KLM| break;
NOP$
期望输出:

A|B|C|D$
E|FGH|IJ|KLM|NOP$
当前代码(适用于结束
break;
,但不将使用
break
的行连接到上一行:

awk '{if (sub(/break;$/,"")) printf "%s", $0; else if (sub(/^break;/,"")) printf $0,"%s"; else print $0}' myfile
我怀疑问题出在else if部分,但如果前一行以
break;
开头,我无法找出正确的语法连接到前一行

<>任何帮助都会被理解,但是请考虑<代码> AWK < /代码>解决方案。< /P> 更新:

感谢大家的贡献!下面的建议很有效,但其中一些连续出现
中断;
的记录似乎仍在引发问题:

A| break;
B| break;
C| break; break;
break; D$

您可以尝试此
awk

awk'!/break;| \$/{print s$0;s=”“;next}{gsub(/*break;*/,“”);s=s$0}文件
A | B | C | D
荷兰皇家航空公司

使用Perl:
Perl-0777-pe的/break;\n//g;s/\nbbreak;//g'文件
如果您感觉到ruby:
cat文件| ruby-ne'print$uu.gsub(/*break;*/,“”).sub(“|\n”,“|”)“
在示例输入/输出中包含
$
以表示行的结尾是没有用的,因为我们已经可以看到您的行的结尾。它只是让我们可以编辑您的示例以删除
$
,然后我们才能使用它进行测试。
$ awk '{gsub(/ ?break; ?/,""); printf "%s%s", $0, (/\|/ ? "" : ORS)}' file
A|B|C|D
E|FGH|IJ|KLM|NOP
awk '/break;|\|$/ {line =line $0;gsub(/ *break; */,"",line);next}{$0 = line $0;print $0;line=""}' file
A|B|C|D
E|FGH|IJ|KLM|NOP