2012-07-27 33 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中它具有足夠強大的正則表達式來覆蓋該案例。

啊,它不能處理,如果文件以括號開頭。如果它以一個結尾,只要後面有換行符就沒問題。如果這是一個問題,那麼最簡單的解決方案就是添加一個臨時空間。

相關問題