2014-09-19 133 views
2

我已经创建了一个脚本,它将所有的PL/SQL文件格式化为一个简单的具有值对的文件,这很难解释,我认为它会是如果你只看文件就更容易;如何删除包含TRUNCATE - INSERT的行除外的所有行

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和同桌的刀片的对,因此,例如出最后的文件I只想保留包含该对的过程的名称以及该对。 f.e

PROCEDURE VALIDA_CAMBIO_GPR 
TRUNCATE TMP_MOD_PVA 
INSERT TMP_MOD_PVA 

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

PD:使用ksh的Im。

回答

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 
+0

好它的工作原理,但是这是否也包括程序的有一对以上截短插入的? – Juanpe 2014-09-19 11:36:58

+1

这不是你的问题,所以不会打印它们。你能提供一个修改过的样本数据吗? – anubhava 2014-09-19 11:38:24

+0

我现在更新了答案,在同一程序下照顾多对。 – anubhava 2014-09-19 11:42:10

相关问题