gpt4 book ai didi

linux - AWK 文件多行命令不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 11:06:26 25 4
gpt4 key购买 nike

我有一个 awk 文件get_PV_sql_from_file.awk:

#! /bin/awk -f
/^CREATE.*VIEW.*PV_/
{
inside_create = 1; print "view found"
}

{
if(inside_create == 1)
{
print $0
}
}

/.*;$/
{
if(inside_create == 1){
inside_create = 0;
}
}

当我运行它时:

awk -f get_PV_sql_from_file.awk test_PV_sql.txt

我在每一行中都有“查看发现”短语:

view found
CREATE FORCE VIEW "POSC"."P3V_SEC_TREES_V" ("BSASC_ID", "BSASC_S", "LV0_K", "LV0_V", "LV1_K", "LV1_V", "LV2_K", "LV2_V", "LV3_K", "LV3_V", "LV4_K", "LV4_V", "LV5_K", "LV5_V") AS
view found
SELECT DISTINCT
view found
B1.BSASC_ID,
view found
B2.BSASC_S,
view found
R_SEC_TREES.LV0_K,
view found
R_SEC_TREES.LV0_V,
...
etc

但是如果我将 awk 文件中的每个命令都写在一行中:

#! /bin/awk -f
/^CREATE.*VIEW.*PV_/ { inside_create = 1; print "view found" }

{ if(inside_create == 1) { print $0 } }

/.*;$/ { if(inside_create == 1) { inside_create = 0; } }

它是正确的:

view found
CREATE FORCE VIEW "POSC"."PV_SEC_MODULES_V" ("BSASC_ID", "MODULE", "ACT") AS
SELECT DISTINCT
B1.BSASC_ID BSASC_ID,
BSASC_PRIVILEGE.GDLN_OR_PRIV_ID MODULE,
BSASC_PRIVILEGE.R_BSASC_PRIV_KIND ACT
...
etc

为什么会这样?我哪里弄错了?

最佳答案

您需要将模式和开始操作的左大括号放在同一行。否则,该模式将被视为没有任何操作,因此执行默认操作打印该行。下一行的 Action 被视为没有模式,这意味着它匹配每一行。所以像这样编写您的 AWK 代码:

/^CREATE.*VIEW.*PV_/ { 
inside_create = 1; print "view found"
}

{
if(inside_create == 1)
{
print $0
}
}

/.*;$/ {
if(inside_create == 1) {
inside_create = 0;
}
}

关于linux - AWK 文件多行命令不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25073338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com