【问题标题】:How to delete all lines except lines that include TRUNCATE - INSERT, incluiding PACK name如何删除除包含 TRUNCATE - INSERT 的行之外的所有行,包括 PACK 名称
【发布时间】: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 ,必须打印所有对。

非常感谢,如果您无法理解,请查看原始问题。

【问题讨论】:

    标签: shell awk ksh


    【解决方案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} 并将其添加到打印部分(其中? 是一个变量)

    【讨论】:

    • 我想在找到的每一对后空一行。
    • 感谢您的帮助,但我已经从我原来的 awk 中制作了自己的解决方案
    【解决方案2】:

    我找到了只是修改原始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=""}'
    

    【讨论】:

    • 我没有在我的回答中添加到您原来的 AWK 的原因是很多部分是多余的。不需要nexts,也不需要检查sp 是否存在。此外,可能不需要与$1 进行比较,除非您希望该值也为 2 美元。最后,您可以使用 RS 作为每个变量之间的换行符,而不是重复打印。
    • 感谢您非常有帮助的评论,将看看我的 awk 代码,我对 AWK 很陌生,而且很难习惯。谢谢,您的回答会像我要求的那样正确! ;)
    猜你喜欢
    • 1970-01-01
    • 2013-11-04
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 2021-04-07
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多