如何删除除包含TRUNCATE - INSERT的行之外的所有行

时间:2014-09-19 11:06:24

标签: shell ksh

我创建了一个脚本,将我的所有PL / SQL文件格式化为一个具有值对的简单文件,很难解释,我认为如果你只看文件会更容易;

PROCEDURE VALIDA_CAMBIO_GPR
TRUNCATE TMP_MOD_PVA
INSERT TMP_MOD_PVA
PROCEDURE AJUSTAR_FECHAS
INSERT PRO_TDA_VARLOG_ALM
PROCEDURE DEPURAR_CAMBIOS_GPR
PROCEDURE INC_EX_0001
INSERT CABECERA_ALARMAS
PROCEDURE INC_EX_0002
INSERT CABECERA_ALARMAS
PROCEDURE INC_EX_0003
INSERT CABECERA_ALARMAS
PROCEDURE INC_EX_0005
INSERT CABECERA_ALARMAS
PROCEDURE INC_EX_0007
INSERT CABECERA_ALARMAS
PROCEDURE INC_EX_0008
INSERT CABECERA_ALARMAS
PROCEDURE INC_EX_0009
INSERT CABECERA_ALARMAS
PROCEDURE INC_EX_0010
INSERT CABECERA_ALARMAS
PROCEDURE INC_EX_0011
INSERT CABECERA_ALARMAS

好的,这个文件继续4000行,但我不需要所有的行,我想要的是同一个表的TRUNCATE和INSERTS对,所以例如我最想要的文件中的一个保留包含该对和该对的过程的名称。 f.e

PROCEDURE VALIDA_CAMBIO_GPR
TRUNCATE TMP_MOD_PVA
INSERT TMP_MOD_PVA

如您所见,TRUNCATE和INSERT会影响同一个表,每个过程也可能有多个对。我怎么能这样做? 我不想要所有没有这些对的程序,而且我也不希望任何没有它们对的插入截断。 很抱歉这个错误的解释,如果oyu在理解评论时遇到问题,我会尽力升级。

PD:我正在使用ksh。

1 个答案:

答案 0 :(得分:1)

使用awk

awk '$1=="PROCEDURE"{p=$0;next} p && $1=="TRUNCATE"{t=$2;next} t==$2 && $1=="INSERT"{
     print p; print "TRUNCATE" t; print "INSERT" t; print ""; t=""}' file
PROCEDURE VALIDA_CAMBIO_GPR
TRUNCATETMP_MOD_PVA
INSERTTMP_MOD_PVA