how can i delete columns beginning and ending with

2019-03-04 13:16发布

how can i delete columns beginning and ending with parenthesis in a file

Expectd Input - content of input.txt

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

Expectd Output -- content of output.txt

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

Just thought id add one more sample input for clarity.

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'

标签: shell
3条回答
够拽才男人
2楼-- · 2019-03-04 13:32

Based on the solution from @slitvinov:

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

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

/^\(/ {
    eat = 1
    next
}

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

{
    if (eat)
        next
    print $0 RT
}

That to an .awk file and awk -f foo.awk foo.txt gives:

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

But I think it could be done simpler...

查看更多
劫难
3楼-- · 2019-03-04 13:35

The simplest thing that I can assemble is:

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

Sorry for Perl but it's in POSIX and it has regular expressions powerful enough to cover the case.

Ah, and it can't handle if the file starts with a parenthesis. If it ends with one, it's fine as long as there's newline after it. If that's a problem, then the easiest solution would be to just add a temporary space.

查看更多
Melony?
4楼-- · 2019-03-04 13:46

Usage
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
}
查看更多
登录 后发表回答