Text 将文本连接到上一行

Text 将文本连接到上一行,text,awk,concat,Text,Awk,Concat,目前正在Solaris上工作 我需要在一个文本文件中搜索一个特定的字符串,如果找到了,将它连接到前一行。例如: if logical condition then i = i + 1 将成为 if logical condition then i = i + 1. 我相信我可以用awk来做这件事,但我的awk技能有点生疏了 附录:抱歉,我应该说得更具体些。匹配由字符串“then”的出现触发。我不知道前一行的内容——可能是任何内容。无论它是什么,我都需要将“then”连接到它。尝试以下方法:

目前正在Solaris上工作

我需要在一个文本文件中搜索一个特定的字符串,如果找到了,将它连接到前一行。例如:

if logical condition
then
i = i + 1
将成为

if logical condition then
i = i + 1.
我相信我可以用awk来做这件事,但我的awk技能有点生疏了


附录:抱歉,我应该说得更具体些。匹配由字符串“then”的出现触发。我不知道前一行的内容——可能是任何内容。无论它是什么,我都需要将“then”连接到它。

尝试以下方法:

awk '
  function dump(trailing_line) {
    for (i = 0; i < length(previous) - 1; i++)
      print previous[i]
    if (trailing_line) { 
      print previous[i] trailing_line 
    } else { 
      print previous[i] 
    }
    i = 0
    delete previous
  }
  /then/ {
    dump(" then")
    next
  }
  {
    previous[i++] = $0
  }
  END {
    dump("")
  }
' your_input_file
awk'
函数转储(尾随_行){
对于(i=0;i

如果您确实不知道
then
之前的内容,则必须将每一行存储到一个数组中,然后在发出
then
之前将其转储。由于您还希望在
END
子句中执行此操作,因此将此“转储”操作转换为函数是最简单的。

这让我走了一半。你能解释一下我如何添加一个“else打印行”,这样我就可以得到文本文件的全部内容以及转换后的行吗?这可能是最好的。当我听到Solaris时,我只是害怕得发抖<代码>:)
它在Solaris上可以很好地使用任何不旧的、损坏的awk,即nawk或/usr/xpg4/bin/awk。希望OP已经知道了这一点,否则我们可以期待“第1行的语法错误”,这是老破烂的awk喜欢为几乎每个awk脚本吐出来的@杰帕尔/你/恐惧中的地震?替我想想。锁定。不能使用任何FOSS,不能使用sunfreeware.com。获得任何信息都是由委员会决定的@Ed Morton-谢谢Ed-非常感谢。使用/usr/xpg4/bin/awk非常有效。
$ awk '{printf "%s%s", (NR>1?(/then/?FS:RS):""), $0} END{print ""}' file
if logical condition then
i = i + 1