2013-04-25 70 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 
相关问题