Board logo

标题: [转载代码] 使用PowerShell来完成像awk一样对多个文件的筛选(二) [打印本页]

作者: DAIC    时间: 2013-10-17 09:36     标题: 使用PowerShell来完成像awk一样对多个文件的筛选(二)

本篇文章引用的小例子来自如下链接:
http://bbs.chinaunix.net/thread-577044-1-1.html

上次只完成了1,2两个例子. 今天我将给出使用之前编写函数awk 来完成3,5,6三个例子的代码. 通过使用函数awk, 我们使得代码更加简单明了. 然后对于帖子中第4个例子来说, 我将在下次讨论中, 加强awk的功能, 来更好的完成同时操作多个文件.

3. 如果文件a中包含文件b, 则将文件b的记录打印出来

首先, 我们来看看两个文件的内容:

PS C:\Documents and Settings\Eden\PowerShell\test3> gc a
10/05766798607,11/20050325191329,29/0.1,14/05766798607
10/05767158557,11/20050325191329,29/0.08,14/05767158557

PS C:\Documents and Settings\Eden\PowerShell\test3> gc b
05766798607
05766798608
05766798609


如果a中的关键字(/和,之间的)出现在b中, 那么就需要把a显示出来. 代码如下:

PS C:\Documents and Settings\Eden\PowerShell\test3> $hash = @{}
PS C:\Documents and Settings\Eden\PowerShell\test3> gc b | awk { $hash[$1] = $true }
PS C:\Documents and Settings\Eden\PowerShell\test3> gc a | awk -delimiter '[/,]' { if ($hash[$2]) {$0} }
10/05766798607,11/20050325191329,29/0.1,14/05766798607


完全和awk的思路一致, 轻松的完成了任务.

5.

文件内容:

PS C:\Documents and Settings\Eden\PowerShell\test5> gc a
1000 北京市 地级 北京市 北京市
1100 天津市 地级 天津市 天津市
1210 石家庄市 地级 石家庄市 河北省
1210 晋州市 县级 石家庄市 河北省
1243 滦县 县级 唐山市 河北省
1244 滦南县 县级 唐山市 河北省

PS C:\Documents and Settings\Eden\PowerShell\test5> gc b
110000,北京市
120000,天津市
130000,河北省
130131,平山县
130132,元氏县


这里要求有些变化, 如果b中的城市名称没有出现在a中, 那么就保留b的原样. 否则将a文件的第一列添加到b文件的末尾. 代码如下:

PS C:\Documents and Settings\Eden\PowerShell\test5> $hash=@{}
PS C:\Documents and Settings\Eden\PowerShell\test5> gc a | awk { $hash[$2] = $1 }
PS C:\Documents and Settings\Eden\PowerShell\test5> gc b | awk -delimiter ',' { if ($hash[$2]) {$0.Trim() + "," + $hash[$2]} else {$0} }
110000,北京市,1000
120000,天津市,1100
130000,河北省
130131,平山县
130132,元氏县


又一次顺利完成了所需要完成的任务.

6. 多个域进行连接

对于多个域进行连接, 其实只是将多个域连接起来, 做为HashTable的键值. 文件如下:

PS C:\Documents and Settings\Eden\PowerShell\test6> gc file1
AAA 001 1000.00
BBB 001 2000.00
DDD 002 4000.00
EEE 002 5000.00
FFF 003 6000.00

PS C:\Documents and Settings\Eden\PowerShell\test6> gc file2
01 1111 AAA WW001 $$$$ 1000.00
02 2222 BBB GG001 %%%% 2000.00
03 3333 CCC JJ001 **** 3000.00
04 4444 DDD FF002 &&&& 4000.00
05 5555 EEE RR002 @@@@ 5000.00
06 666 FFF UU003 JJJJ 6000.00
07 777 III II005 PPPP 7000.00
08 8888 TTT TT008 TTTT 8000.00


a文件中各列分别对应于b文件的第3列, 第四列后3个字符, 第6列. 只打印能够匹配. 代码如下:

PS C:\Documents and Settings\Eden\PowerShell\test6> $hash=@{}
PS C:\Documents and Settings\Eden\PowerShell\test6> gc file1 | awk {$hash["${1}x${2}x${3}"] = $true}
PS C:\Documents and Settings\Eden\PowerShell\test6> gc file2 | ?{ $_ | awk {$hash["${3}x$($4.substring(2,3))x${6}"]} }
01 1111 AAA WW001 $$$$ 1000.00
02 2222 BBB GG001 %%%% 2000.00
04 4444 DDD FF002 &&&& 4000.00
05 5555 EEE RR002 @@@@ 5000.00
06 666 FFF UU003 JJJJ 6000.00


再一次顺利完成了任务. 用awk处理这种非结构的脚本思路比较固定, 只要掌握一种, 就能举一反三. 希望大家自己能多进行实践. 对于第4个例子, 我们需要先加强awk的功能. 就留作这篇文章第三部分完成吧^^

http://blog.chinaunix.net/uid-9781829-id-1997704.html




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2