如何在有条件的两行内保存匹配,没有重复



与input.txt中的内容:

START
DD strub1
EXEC RETYE EXAMPLE
END
EXEC RETYE HELLO
START
EXEC RETYE FRIEND
END
DD strub2
START
DD strub3
DD strub4
EXEC RETYE STACKOVERFLOW
END
START
DD strub5
END
START
DD strub6
DD strub7
EXEC RETYE STACKOVERFLOW
END

我试图在STARTEND中提取单词:

  • DDs.* 匹配的行的第二个字(我将只保存匹配的第一行)
  • EXECs+REYTEs+
  • 匹配行的第三个单词

我不会在STARTEND的实际处理块之间保存nothing如果:

  • EXEC RETYE先前已保存,
  • 没有DD
  • 没有EXEC RETYE

所以这是期望的输出:

DD strub1
RETYE EXAMPLE
DD strub3
RETYE STACKOVERFLOW

这是我认为的伪代码(注意语法不是100%正确,只是为了表明想法):

BEGIN {
  c=0;
  f=0;
  split("", retye)
}
{
  /START/{c=1;f=0}; 
  /END/{c=0;f=0};
  if(c==1 && f==0) {
      /DDs.*/{
         dd=$1,$2;
         f=1;
      };
  }; 
  if(c==1 && f==1) {
     /EXECs+RETYE/ {
         if($3 in retye == 0 ) {
            print dd
            print $2,$3
            retye[]=$3
         }
     };
  };
}

你认为我正在尝试的方法是最好的吗?你有别的选择吗?

任何建议、提示或帮助都将不胜感激,如果你需要一个更清晰的例子,请告诉我,我会编辑这篇文章。

使用FSM方法:

$ awk '/^START$/{dd="";exec_retye=""};
     /^DDs.*/{if(dd=="")dd=$2};
     /^EXEC RETYEs.*/{exec_retye=$3;exec_retye_array[exec_retye]++};
     /^END$/{
       if((exec_retye!="")&&(dd!="")&& (exec_retye_array[exec_retye]==1))
           {print dd; print exec_retye;}
        }' input.txt
strub1
EXAMPLE
strub3
STACKOVERFLOW

注意:

输出包含:

  1. 与DDs匹配的行中的第二个字。*
  2. 与EXECs+REYTEs+
  3. 匹配行的第三个

如前所述。
然而,您想要的输出显示整行匹配DDs.* & 2,第3个与EXECs+REYTEs匹配的单词。根据实际需求,您可以编辑代码

我建议将此作为使生活更轻松的部分解决方案....将每个START/END块提取到一个名为out1.txt, out2.txt等的新文件

awk '/^START/{p=1;f++;next} /^END/{p=0;next} p{print >"out"f".txt"}' input.txt

最新更新