如何删除除包含TRUNCATE - INSERT的行以外的所有行,包括PACK名称

时间:2014-10-13 10:52:38

标签: shell awk ksh

这是此问题的扩展:How to delete all lines except lines that include TRUNCATE - INSERT

我之前曾问过这个问题,因为我需要一些帮助从生成的脚本中删除行,而不是来自anubhava的一些很好的帮助,我能够解决问题,但现在问题是我被要求包括这个包命名到我生成的脚本中,所以:

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

这是我原来的问题,我有一个像这样的行的长文本文件,但我想删除所有没有每个过程有两个INSERT-TRUNCATE的行,所以前一行的结果将是< / p>

PROCEDURE VALIDA_CAMBIO_GPR
TRUNCATE TMP_MOD_PVA
INSERT TMP_MOD_PVA

为此,我们使用了这个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=""}'

好的,所以到这里我没有问题,但是现在,当我被告知要包含PACK名称时,我的文本文件就像这样。

PACK PACKENVI
PROCEDURE VALIDA_CAMBIO_GPR
TRUNCATE TMP_MOD_PVA
INSERT TMP_MOD_PVA
PACKANSI
PROCEDURE CALCULA_GRAMOS
PACK PACKBRUM
PROCEDURE AJUSTAR_FECHAS
INSERT PRO_TDA_VARLOG_ALM
PACK PACKRENSI
PROCEDURE DEPURAR_CAMBIOS_GPR
PACK PACKRENSI
PROCEDURE INC_EX_0001
INSERT CABECERA_ALARMAS
PACK PACKRENSI
PROCEDURE INC_EX_0002
INSERT CABECERA_ALARMAS
PACK PACKRENSI
PROCEDURE INC_EX_0003
INSERT CABECERA_ALARMAS
PACK PACKRENSI
PROCEDURE INC_EX_0005
INSERT CABECERA_ALARMAS
PACK PACKRENSI
PROCEDURE INC_EX_0007
INSERT CABECERA_ALARMAS
PACK PACKRENSI
PROCEDURE INC_EX_0008
INSERT CABECERA_ALARMAS
PACK PACKRENSI
PROCEDURE INC_EX_0009
INSERT CABECERA_ALARMAS
PACK PACKRENSI
PROCEDURE INC_EX_0010
INSERT CABECERA_ALARMAS
PACK PACKRENSI
PROCEDURE INC_EX_0011
INSERT CABECERA_ALARMAS

本文所需的输出是:

PACK PACKENVI
PROCEDURE VALIDA_CAMBIO_GPR
TRUNCATE TMP_MOD_PVA
INSERT TMP_MOD_PVA

这与以前几乎是一样的问题,只是当在PACK下面的过程下面发现一对INSERT-TRUNCATE时,如果一个过程多于一对INSERT_TRUNCATE,则需要打印另一行。 ,必须打印所有对。

非常感谢,如果您理解有困难,请查看原始问题。

2 个答案:

答案 0 :(得分:1)

Awk解决方案

awk '/PACK/{P=$0}/PROCEDURE/{p=$0}/TRUNCATE/{t=$0}t~$2&&/INSERT/{print P RS p RS t RS $0;P=p=t=0}' file

PACK PACKENVI
PROCEDURE VALIDA_CAMBIO_GPR
TRUNCATE TMP_MOD_PVA
INSERT TMP_MOD_PVA

对于需要打印的所有其他行,只需添加另一行/LINE/{?=$0}并将其添加到打印部分(其中?是变量)

答案 1 :(得分:0)

我发现解决方案只是修改原始AWK,这里是新的

awk '$1=="PACK"{s=$0;next} s && $1=="PROCEDURE"{p=$0;next} p && $1=="TRUNCATE"{t=$2;next}
t==$2 && $1=="INSERT"{print s; print p; print "TRUNCATE " t; print "INSERT " t; print ""; t=""}'