0

ファイル内の括弧で始まる列と括弧で終わる列を削除するにはどうすればよいです


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

わかりやすくするために、id にもう 1 つのサンプル入力を追加すると考えました。

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 にあり、そのケースをカバーするのに十分強力な正規表現を備えています。

ああ、ファイルが括弧で始まる場合は処理できません。1 で終わる場合は、その後に改行があれば問題ありません。それが問題である場合、最も簡単な解決策は、一時的なスペースを追加することです。

于 2012-07-28T07:22:40.387 に答える