bash在第二行的开头使用键组合行

bash在第二行的开头使用键组合行,bash,perl,awk,sed,Bash,Perl,Awk,Sed,源文件是一个文本文件。有些行以KEY开头,在这种情况下,目标是将该行与它前面的行合并。也有不存在密钥的情况。在这种情况下,行传输时输出没有变化,不匹配的字符串或“行对”没有模式,它们可能单独出现,也可能以2行或多行为一组 输入文本文件的示例: 1234 abc abcdef abcdef1 KEY xyx any arbitrary string not starting with KEY def 987 目标是将“线对”组合成一条线,同时保持不符合标准的线不变 期望输出 1234 ab

源文件是一个文本文件。有些行以KEY开头,在这种情况下,目标是将该行与它前面的行合并。也有不存在密钥的情况。在这种情况下,行传输时输出没有变化,不匹配的字符串或“行对”没有模式,它们可能单独出现,也可能以2行或多行为一组

输入文本文件的示例:

1234 abc 
abcdef
abcdef1
KEY xyx
any arbitrary string not starting with KEY 
def 987 
目标是将“线对”组合成一条线,同时保持不符合标准的线不变

期望输出

1234 abc 
abcdef
abcdef1KEY xyx
any arbitrary string not starting with KEY 
def 987 
有些解决方案的密钥位于“线对”的第一行。首选的解决方案依次是sed、perl和awk。然而,更高的偏好是一个解决方案

类似这样的东西(awk脚本)


我在这里假设(a)带键的行前面总是至少有一行没有键,(b)带键的行是一行,其中有空格字符。

sed仅用于对单个行进行简单替换,因此这对于sed来说是完全不合适的任务

这将适用于所有UNIX安装,无需安装非标准工具,如perl:

$ awk '{printf "%s%s", (/^KEY/ ? OFS : ors), $0; ors=ORS} END{print ""}' file
...
string
string KEY string
string
...

描述听起来很复杂…最好提供更多信息。用实际数据替换字符串,并建议可能的输出。解决方案可以很简单,如
grep-A 2“KEY”文件
-查找KEY并获得以下两行。但你想要什么这么简单吗?我想不是。请给出更好的描述。我想你的意思是,当第二行以KEY开头时,你想连接两行。@WalterA如果是这样,他的意思是
grep-b1“KEY”文件
…?grep-b1“KEY”选项不起作用。请原谅我的无知,条件KEY编码在哪里?是的,一行中从来没有两个关键行。所有行都至少有一个空格字符。我不知道您的键输入是什么样子的,不管它是实际的字符串“KEY”,还是与后续字符串用空格隔开的任何东西。所以我假设第二个更一般。第三条规则(在整个awk脚本的编辑版本中)捕获带有空格的行,在它们之前的任何内容都是键。
$ awk '{printf "%s%s", (/^KEY/ ? OFS : ors), $0; ors=ORS} END{print ""}' file
...
string
string KEY string
string
...