2012-07-27 54 views
0

如何删除列开始,并在文件中有括号结束

Expectd输入 - input.txt中的内容
如何删除列开始,并在文件中有括号结束

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

Expectd输出 - output.txt的内容

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

只是想到了id,为了清晰起见,再添加一个样本输入。

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' 
+0

只要说清楚一点:你是否期望它在行首或行末与'(ABC)'匹配? – 2012-07-27 21:59:10

+0

带括号的文本可以在行尾,但我不认为它是在开始。我的输入基本上是一个ddl。 – user973363 2012-07-27 22:09:19

+0

括号内的文本是从ddl中的数据类型中分离列名的。 – user973363 2012-07-27 22:15:13

回答

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 
} 
+0

这工作完美,除了我的输入文件不幸有一行像ABC EFG(HI JK)LMN。我们希望能够像ABC EFG LMN一样为此付出代价。谢谢!! – user973363 2012-07-27 20:46:22

+1

不错的概念,但它将无法匹配坚持换行符的括号。 – 2012-07-27 20:46:49

+0

@MichałGórny我正在尝试修复它的更新版本。 – slitvinov 2012-07-27 20:57:01

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 

但我认为它可以做简单的...

+0

它似乎并没有为我工作。它只是给我回来的输入。 – user973363 2012-07-27 21:36:21

+0

@ user973363:这很奇怪。我会理解它是否会崩溃输出(这是POSIX awk会做的),但回馈表明它没有得到正则表达式匹配... – 2012-07-27 21:48:13

0

,我可以组装的最简单的事情是:

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

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

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

相关问题