0

如何删除文件中以括号开头和结尾的列

Expected Input - input.txt 的内容

ABC (BCD) EFG    
BCD (ABC) (BCD) 
DEF  BCD (ABC)  
EFG HI(JKL)
ABC EFG (HI JK) LMN

预期输出——output.txt 的内容

ABC EFG    
BCD    
DEF BCD
EFG HI(JKL)    
ABC EFG LMN

只是为了清楚起见,我想再添加一个示例输入。

ABC (lll) INTEGER NOT NULL -3
EDG (FK) (lll) INTEGER NOT NULL -3
HIJ (nn ooo) CHAR(16) NOT NULL 'Not Provided'
KLM (ppp) VARCHAR(75) NOT NULL 'Not Provided'
NOP (qqq) VARCHAR(75) NOT NULL 'Not Provided'
QARD (rrr) DATE NOT NULL '1900-01-01'
QRS (sss) DATE NOT NULL '1900-01-01'
TUV  DATE NOT NULL '1900-01-01'
WXY (uuu) CHAR(1) NOT NULL 'N'
4

3 回答 3

2

用法
awk '{print $0" "}' foo.txt | awk -f foo.awk

foo.awk

BEGIN {
    RS=ORS=" "
}

{
    n=length($0)
    if (!n) next
    split($0, s, "")
}

s[1]=="(" && s[n]==")" {
    # it is column like (abcd), skip it
    next
}

s[1]=="(" {
    # stop printing
    f=1
}

!f {
    print $0
}

s[n]==")" {
    # start printing again
    f=0
}
于 2012-07-27T20:42:16.607 回答
1

基于@slitvinov 的解决方案:

BEGIN {
    RS = "[[:space:]]"
    ORS = ""
    eat = 0
}

/^\(.*\)$/ {
    next
}

/^\(/ {
    eat = 1
    next
}

/\)$/ {
    if (eat) {
        eat = 0
        next
    }
}

{
    if (eat)
        next
    print $0 RT
}

那到一个.awk文件并awk -f foo.awk foo.txt给出:

ABC EFG    
BCD 
DEF  BCD  
EFG HI(JKL)
ABC EFG LMN

但我认为它可以做得更简单......

于 2012-07-27T21:19:58.850 回答
0

我可以组装的最简单的东西是:

perl -pe 'BEGIN { undef $<; } s/\s(\(.*?\)(\s))+/\2/cgs' foo.txt

对不起 Perl,但它在 POSIX 中,它的正则表达式足以涵盖这种情况。

啊,如果文件以括号开头,它就无法处理。如果它以一个结尾,只要后面有换行符就可以了。如果这是一个问题,那么最简单的解决方案就是添加一个临时空间。

于 2012-07-28T07:22:40.387 回答