首页 > tips > 命令行下简单的检索

命令行下简单的检索

2009年5月30日 wuzhez 发表评论 阅读评论

前段时间有这么个需求,两个文件,假设是tmp1和tmp2,tmp1里有服务器序列号和服务器主机名,如下:
a    1
b    2
c    3
d    4
e    5
f    6
g    7

tmp2里则是一些无序的序列号,如下:
d
c
e
f
a
g
b

现在需要做的是按tmp2里的顺序得到它们所对应的主机名。

对于这个需求,最开始想到的就是对tmp2里的每个序列号循环,每个循环里再遍历一次tmp1的内容,从而找到需要的主机名,不过这方法当文件很大时就很慢了。所以改进了一下,把tmp1存到一个hash里,然后遍历tmp2从hash里获得需要的东西。脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/perl
use warnings;
use strict;
 
open(TMP1,"<tmp1") or die("error1\n");
my %hash;
while(<TMP1>){
    chomp(my $tmp = $_);
    my($index,$value) = split(/\s+/,$tmp);
    $hash{$index} = $value;
}
close(TMP1);
 
open(TMP2,"<tmp2") or die("error2\n");
while(<TMP2>){
    chomp(my $tmp = $_);
    print $hash{$tmp}."\n";
}
close(TMP2);

当然,这样还是麻烦了点,简单一点可以直接在命令行下就搞定了

for i in `cat tmp2`
    do grep $i tmp1 | awk '{print $2}'
done
分类: tips 标签: , 368 views

收藏本文:Del.icio.us - Google书签 - 分享到Twitter - 收藏到鲜果 - yahoo收藏 - digg - 更多 »


转载请注明出处及作者信息

本文链接: http://blog.happysa.org/tips/easy_index_for_tips.html


Creative Commons License

  1. 2009年5月30日21:51 | #1

    命令行下那个还是老问题:那可是两层循环呀,文件大了估计要等很久。。。

  2. 2009年5月31日11:43 | #2

    @zesheng
    试了下果然是很慢,10万行数据,在perl里用双重循环用了12s,hash用了0.2s,命令行下循环用了4m多钟。perl的效率比shell要高很多

  3. 2009年6月10日17:52 | #3

    有点奇怪啊

  4. monger
    2010年1月21日00:22 | #4

    open $fp, '< tmp1';
    %t = map { chomp; split } ;

    open $fp, '< tmp2;
    print $_, "\n" foreach map { chomp; $t{$_} } ;

  5. monger
    2010年1月21日00:23 | #5

    \;

  6. monger
    2010年1月21日00:23 | #6

    把读文件符给吃掉了。。。

  7. wuzhez
    2010年1月21日10:16 | #7

    @monger
    谢谢指点,以后多交流。

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。