AWK 有关域分隔符的问题
现在在处理一些文本, 这些是微软提供的一些工具产生的,不是很规范(现在恨死它了),大体形势如下,我选出来一些有代表性质的:C:\Program Files\[color=Red]Com mon[/color] Files\Rockwell\[color=Red]W FCU[/color]\[color=Red]NetFwPublicTypeL ib[/color].DLL 38184 File 1.1.0.0 2008-05-19 13:47:08
C:\Program Files\[color=Red]Com mon[/color] Files\Rockwell\[color=Red]W FCU[/color]\SHDocVw.DLL 132392 File 1.1.0.0 2008-05-19 13:47:10
C:\Program Files\[color=Red]Com mon[/color] Files\Rockwell\[color=Red]W FCU[/color]\stdole.dll 16384 File 7.0.9466.0 2004-11-29 13:09:46
C:\Windows\[color=Red]Microsof t[/color].NET\Framework\[color=Red]v1. 1.4322[/color]\1033\alinkui.dll 16896 File 7.10.3052.4 2003-02-21 01:59:44
红色的语句本来是一个单词,但是他却中间多出个空格(图中为了看清楚,我多加了几个空格)。我现在想得到前面的文件,最终结果如下:
C:\Program Files\[color=Red]Common[/color] Files\Rockwell\[color=Red]WFCU[/color]\[color=Red]NetFwPublicTypeLib[/color].DLL
C:\Program Files\[color=Red]Common[/color] Files\Rockwell\[color=Red]WFCU[/color]\SHDocVw.DLL
C:\Program Files\[color=Red]Common[/color] Files\Rockwell\[color=Red]WFCU[/color]\stdole.dll
C:\Windows\[color=Red]Microsoft[/color].NET\Framework\[color=Red]v1.1.4322[/color]\1033\alinkui.dll
大体的步骤如下
1。 选取File之前部分:cat myfile | awk -F'File ' '{print $1}'
2。 去掉最后的数字域: ?
3。 删除剩下的红色中的那些空格: ?
还请高手解答阿!
本人想得到File之前的字段 awk -FFile '{print $1}'
但是由于前面有类似Files的字段,所以现在我只能精确匹配File, 不止怎么用域来限定??
[[i] 本帖最后由 DUT_girl 于 2008-8-13 15:23 编辑 [/i]] awk -F'File ' '{print $1}' [quote]原帖由 [i]linuxpk[/i] 于 2008-8-13 14:50 发表 [url=http://bbs.linuxpk.com/redirect.php?goto=findpost&pid=99533&ptid=33845][img]http://bbs.linuxpk.com/images/common/back.gif[/img][/url]
awk -F'File ' '{print $1}' [/quote]
不行啊,老大,还是把前边的programe files的去掉了! Fedora 9,测试通过。
我给的语句,务必拷贝使用。
fc7 下通过
aaaaa 为包含需要过滤的文件awk -F '\ [0-9]' '{print $1}' aaaaa
过滤结果:
awk: warning: escape sequence `\ ' treated as plain ` '
C:\Program Files\Com mon Files\Rockwell\W FCU\NetFwPublicTypeL ib.DLL
C:\Program Files\Com mon Files\Rockwell\W FCU\SHDocVw.DLL
C:\Program Files\Com mon Files\Rockwell\W FCU\stdole.dll
C:\Windows\Microsof t.NET\Framework\v1.
方法不对,你看看最后的那个文件
[[i] 本帖最后由 DUT_girl 于 2008-8-14 11:50 编辑 [/i]] File 后面有个空格 刚学Python,只会写这种正则表达式
l=re.findall(r'(.*)\bFile\b',s)
for i in l:
s=re.search(r'\D+',i).group()
s=re.sub(r'\s+','',s)
s=re.sub('Files',' Files',s)
print s C:\Program Files\Com mon Files\Rockwell\W FCU\NetFwPublicTypeL ib.DLL 38184
C:\Program Files\Com mon Files\Rockwell\W FCU\SHDocVw.DLL 132392
C:\Program Files\Com mon Files\Rockwell\W FCU\stdole.dll 16384
C:\Windows\Microsof t.NET\Framework\v1. 1.4322\1033\alinkui.dll 16896
现在我想删除后面的数字域(每行最后的域,不能用$num)不知道该怎么做,就是现在第二步 现在有点思路了,好像的用awk的NF变量来确定最后的域!
等项好了,就放上来 cat myfile | awk -F'File ' '{print $1}' | \
sed 's/[ ]*$//g' | \
awk '{print substr($0,1,(length($0)-length($NF)))}'
这样就可以删除最后的数字域了!
[[i] 本帖最后由 DUT_girl 于 2008-8-15 16:39 编辑 [/i]] 现在已经能做到如下的形式了:
C:\Program Files\[color=Red]Com mon[/color] Files\Rockwell\[color=Red]W FCU[/color]\[color=Red]NetFwPublicTypeL ib[/color].DLL
C:\Program Files\[color=Red]Com mon[/color] Files\Rockwell\[color=Red]W FCU[/color]\SHDocVw.DLL
C:\Program Files\[color=Red]Com mon[/color] Files\Rockwell\[color=Red]W FCU[/color]\stdole.dll
C:\Windows\[color=Red]Microsof t[/color].NET\Framework\[color=Red]v1. 1.4322[/color]\1033\alinkui.dll
就是图中红色的空格的部分,这个空格是有规律的:每隔20个字符,就会出现一个,大家帮看看,怎么删除他们
[[i] 本帖最后由 DUT_girl 于 2008-8-15 18:44 编辑 [/i]] 准备结贴,搞定了! cat myfile | awk -F'File ' '{print $1}' | \
sed 's/[ ]*$//g' | \
awk '{print substr($0,1,(length($0)-length($NF)))}' | \
awk '{for(i=1;i<length($0),i+=21) {printf("%s",substr($0,i,20));} printf("\n")}' \
> result.txt
[[i] 本帖最后由 DUT_girl 于 2008-8-18 18:00 编辑 [/i]]
页:
[1]