2014-09-19 128 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

相關問題