2013-04-25 106 views
0

我有一個非常大的平面文件列表,我已經能夠用awk的新手知識來解析,但是當我的字段沒有被空格分開並且不是很統一時,我正在學習一些曲線。我的樣本數據如下:如何檢查一個字段是否包含圓括號?

AAA 10(05/12)(06:59) BBB 
CCC 12  (12:24) DDD 
EEE 10 04:39 (02:10) FFF 
GGG 13 12/09 03:52 HHH 

我想解析出從第3列中的字段,但只有當他們不爲空,也沒有用括號包圍。所以我應該有4號線,2個空白和2的輸出數據填充:

*blank* 
*blank* 
04:39 
12/09 

我迄今爲止嘗試是:

my loop: 
dtime=substr($0,7,7) 
if (match(dtime,"(\\(.*\\))")==1) { 
    dtime="" 
} 
print dtime 

有沒有更有效的方法來做到這一點?

+0

爲什麼你輸出包含空格,如果你不」不想要他們。 – perreal 2013-04-25 01:24:02

+0

我不確定如何在本網站上顯示「空行」。基本上我的輸出,當空白找到時,返回一個7字符的空白字符串。 – fembot 2013-04-25 01:28:00

+0

你*想*這些空白行? – 2013-04-25 03:19:40

回答

2

嘗試呆子FIELDWIDTHS變量:

# AAA 10(05/12)(06:59) BBB 
# .3.1.21.5...11..5..11.3. 
$ gawk -vFIELDWIDTHS='3 1 2 1 5 1 1 5 1 1 3' '{if($4=="(" && $6==")")print ""; else print $5}' input 


04:39 
12/09 
+0

這也是我的第一個想法,但可悲的是我們客戶的機器(這個腳本將運行的地方)沒有可用的gawk。只是awk。 – fembot 2013-04-25 01:46:54

+1

你可以運行'sed'把它先轉換成'csv'文件。 – kev 2013-04-25 03:47:54

1

使用SED:

sed -e 's/[^ ]* *[^(]*//'       \ 
    -e 's/[(]*[0-9][0-9]:[0-9][0-9][)]* *...$//' \ 
    -e 's/(.*)//' input 
+0

謝謝!我會試試這個。 – fembot 2013-04-25 01:59:39

0

這可能會爲你做的伎倆:

$ awk 'NF==5{print $3;next}{print "*blank*"}' file 
*blank* 
*blank* 
04:39 
12/09 
相關問題