awk脚本-提取括号之间的文本

awk脚本-提取括号之间的文本,awk,Awk,我试图提取文件中第一个括号与其匹配的右括号之间的文本 输入 CREATE MULTISET TABLE ABCD.EFGH, NO FALLBACK, NO BEFORE JOURNAL, NO AFTER JOURNAL, CHECKSUM = Default ( ABCK_SK INTEGER NOT NULL, PRQ VARCHAR(1024) NOT NULL, RST DECIMAL (12,4) NOT NULL

我试图提取文件中第一个括号与其匹配的右括号之间的文本

输入

CREATE MULTISET TABLE ABCD.EFGH,
NO FALLBACK,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = Default
( ABCK_SK      INTEGER         NOT NULL,
PRQ  VARCHAR(1024)           NOT NULL,
RST   DECIMAL (12,4)          NOT NULL,
LMN     CHAR(1)         NOT NULL,
OPQ      DATE            NOT NULL,
PQRS     DATE            NOT NULL,
TUV       INTEGER         NOT NULL,
WXY        INTEGER         NOT NULL
)  UNIQUE PRIMARY INDEX ABCK_PI (ABCK_SK)
;
ABCK_SK      INTEGER         NOT NULL,
PRQ  VARCHAR(1024)           NOT NULL,
RST   DECIMAL (12,4)          NOT NULL,
LMN     CHAR(1)         NOT NULL,
OPQ      DATE            NOT NULL,
PQRS     DATE            NOT NULL,
TUV       INTEGER         NOT NULL,
WXY        INTEGER         NOT NULL
预期产出

CREATE MULTISET TABLE ABCD.EFGH,
NO FALLBACK,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = Default
( ABCK_SK      INTEGER         NOT NULL,
PRQ  VARCHAR(1024)           NOT NULL,
RST   DECIMAL (12,4)          NOT NULL,
LMN     CHAR(1)         NOT NULL,
OPQ      DATE            NOT NULL,
PQRS     DATE            NOT NULL,
TUV       INTEGER         NOT NULL,
WXY        INTEGER         NOT NULL
)  UNIQUE PRIMARY INDEX ABCK_PI (ABCK_SK)
;
ABCK_SK      INTEGER         NOT NULL,
PRQ  VARCHAR(1024)           NOT NULL,
RST   DECIMAL (12,4)          NOT NULL,
LMN     CHAR(1)         NOT NULL,
OPQ      DATE            NOT NULL,
PQRS     DATE            NOT NULL,
TUV       INTEGER         NOT NULL,
WXY        INTEGER         NOT NULL
我已经编写了以下脚本,用于获取需要从何处提取文本的行号和列号,但我无法实际打印输出。如有任何建议,将不胜感激。 谢谢

#/垃圾箱/垃圾箱
nawk'BEGIN{n=0;j=0;i=0;endln=0;startchr=0;endchr=0}{

i=1;而(i这里有一个很好的方法来提取第一个匹配括号中包含的数据:

sed -n -e '1,/(/s/[^(]*/foo/' -e '/(/,$p' input-file | m4 -D 'foo=$* m4exit(0)'
sed将第一个打开参数之前的所有文本替换为文本
foo
,然后使用m4,定义了名为
foo
的宏,该宏只输出其第一个参数,然后丢弃其余数据。
m4
对括号进行了非常健壮的解析,因此这在大多数情况下都适用。(请注意,如果所附文本包含字符串
foo
,后跟
),则此操作将失败。请选择除
foo
)以外的唯一字符串。

用法:
awk-f foo.awk foo.txt

foo.awk

BEGIN {
    ORS=""
    RS="[()]"
}

RT=="(" {
    s++;
    if (s>1) print $0 RT
}


RT==")" {
    s--;
    if (s==0) {
      print $0 "\n"
      exit
    } else {
      print $0 RT
    }
}
perl解决方案:

perl -e '$/=\1;
    while(<>) {
        if( /\)/ ) { $c -=1; exit unless $c }
        print if $c > 0;
        $c += /\(/
    }' input-file
perl-e'$/=\1;
while(){
如果(/\)/){$c-=1;除非$c}否则退出
如果$c>0,则打印;
$c+=/\(/
}'输入文件

这似乎对我不起作用。
我得到的输出是
ABCK_SK INTEGER not NULL我必须按如下方式运行命令,因为它给了我在solaris上找不到的命令。
sed-n-e'1,/(/s/[^(]*/foo/'-e'/,$p'输入文件|/usr/ccs/bin/m4-D'foo=$1/usr/ccs/bin/m4exit(1)'还有一点需要注意的是,我的输入不需要有第一个字段(如行的第一个字段),这可能是CHECKSUM=Default(对不起,在foo.Edited的定义中,您应该使用
$*
而不是
$1
。谢谢。这对我来说非常有效,只是它将输出包装成一行。您能帮我将其转换成输入中的多行吗?
m4
将使用空格在逗号附近,我不认为可以做很多事情来解决这个问题。谢谢你的回复。如果我的开头和结尾括号是行中的第一个字段,这个脚本对我来说是有效的。但是如果括号在一行中间,它就不起作用。我需要它来处理这两种情况。这对我来说似乎是完美的。…我只需要将它嵌入我的主scrpt中,并确保它不会在我提供给它的不同类型的输入中失败..非常感谢!!这让我从昨天早上起就完全不知所措。。