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

时间:2012-07-27 20:30:40

标签: shell

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

期望输入 - 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'

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分: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

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

答案 2 :(得分:0)

我能组装的最简单的事情是:

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

对不起Perl,但是它在POSIX中,并且它具有足够强大的正则表达式来覆盖案例。

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