Linux论坛's Archiver

《开源》旗舰电子杂志2008年11期发布,火热下载中!

DUT_girl 发表于 2008-8-13 13:40

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]]

linuxpk 发表于 2008-8-13 14:50

awk -F'File ' '{print $1}'

DUT_girl 发表于 2008-8-13 14:52

[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的去掉了!

linuxpk 发表于 2008-8-13 14:55

Fedora 9,测试通过。

我给的语句,务必拷贝使用。

nlcj_linuxmine 发表于 2008-8-13 20:59

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]]

cnangel 发表于 2008-8-14 12:46

File 后面有个空格

fool 发表于 2008-8-14 13:04

刚学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

DUT_girl 发表于 2008-8-15 14:25

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)不知道该怎么做,就是现在第二步

DUT_girl 发表于 2008-8-15 14:33

现在有点思路了,好像的用awk的NF变量来确定最后的域!
等项好了,就放上来

DUT_girl 发表于 2008-8-15 16:34

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]]

DUT_girl 发表于 2008-8-15 18:40

现在已经能做到如下的形式了:
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]]

DUT_girl 发表于 2008-8-18 17:58

准备结贴,搞定了!

DUT_girl 发表于 2008-8-18 17:58

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]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.