【发布时间】:2014-12-07 21:59:50
【问题描述】:
这是对这个问题的扩展: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 的所有行,所以上一行的结果将是
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 ,必须打印所有对。
非常感谢,如果您无法理解,请查看原始问题。
【问题讨论】: