亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 如何在兩個(gè)文件中比較 [打印本頁]

作者: zljjg2000    時(shí)間: 2013-07-25 14:53
標(biāo)題: 如何在兩個(gè)文件中比較
有個(gè)問題:
file1:
10.5.246.3
10.5.247.130
10.5.247.2
10.5.248.130
10.5.248.2
10.5.249.3


file2:
地點(diǎn)      ip
經(jīng)一路        10.5.246.0
小河村        10.5.247.0
大廈        10.5.10.0

以file1里的ip為關(guān)鍵字,從file2中搜索出包含此ip地址的前三段數(shù)字的行,并將地點(diǎn)和ip顯示在一個(gè)新文件file3中,
結(jié)果舉例:
經(jīng)一路 10.5.246.3
小河村 10.5.247.130
小河村 10.5.247.2
          10.5.248.130
          10.5.248.2
          10.5.249.3

不知該如何編寫啊,采用的perl是windows版本,沒有unix下的grep等命令。
作者: 只是一個(gè)紅薯    時(shí)間: 2013-07-25 16:07
本帖最后由 只是一個(gè)紅薯 于 2013-07-25 16:09 編輯

  1. #!/usr/bin/perl
  2. use 5.016;
  3. use strict;
  4. use warnings;
  5. use Tie::File;
  6. tie my @a,'Tie::File', '1.txt';
  7. tie my @b,'Tie::File', '2.txt';
  8. tie my @c,'Tie::File', '3.txt';
  9. my %hash;
  10. my @tmp=@a;
  11. for my $bb(@b){
  12.     next unless $bb=~/\d/;
  13.     my($adr,$ip)=split /\s+/,$bb;
  14.     duu($ip);   
  15.     for my $aa(@a){
  16.     if(duu($ip) eq duu($aa)){
  17.         @tmp = grep { $_ ne $aa } @tmp;
  18.         $hash{$aa}=$adr ;
  19.     }
  20. }  
  21. }
  22. $hash{$_}='' for (@tmp);
  23. sub duu{
  24.     my $t=shift;
  25.     my($a,$b,$c,$d)=split /\./,$t;
  26.     ($a,$b,$c);
  27. }
  28. push @c,$hash{$_}."\t".$_ for  keys %hash;
  29. @c=reverse sort @c;
  30. untie @a;
  31. untie @b;
  32. untie @c;
復(fù)制代碼

作者: zljjg2000    時(shí)間: 2013-07-25 16:31
謝謝,這么快,我學(xué)習(xí)一下程序代碼,還看不太懂:)
作者: zljjg2000    時(shí)間: 2013-07-25 20:24
還有兩個(gè)地方看不明白:
第一:
if(duu($ip) eq duu($aa)){

        @tmp = grep { $_ ne $aa } @tmp;

        $hash{$aa}=$adr ;
以上是說生成一個(gè)hash數(shù)組,但是中間這一行有什么用呢?
第二:
$hash{$_}='' for (@tmp);
是兩個(gè)單引號嗎?起什么作用呢?

作者: grshrd49    時(shí)間: 2013-07-25 21:23
回復(fù) 4# zljjg2000


@tmp = grep { $_ ne $aa } @tmp;
grep和map的功能基本差不多 都是從grep{}后的數(shù)組中篩選出滿足{}中的條件,并且返回一個(gè)數(shù)組

$hash{$_}='' for (@tmp);
這句話的意思是將列表@tmp中的每個(gè)元素作為哈希hash的key 并將這些key對應(yīng)的value清空
作者: rubyish    時(shí)間: 2013-07-26 01:52
也來試試 ~
  1. #!/usr/bin/perl

  2. open my $F1, 'file1';
  3. open my $F2, 'file2';
  4. open my $F3, '>', 'file3';

  5. my %f2 = map { reverse /(\S+)\s+(.*?)\d+$/ } <$F2>;
  6. while (<$F1>) {
  7.     my ($k) = /(.*\.)/;
  8.     print $F3 $f2{$k} ? "$f2{$k}\t$_" : "\t$_";
  9. }
復(fù)制代碼

作者: grshrd49    時(shí)間: 2013-07-26 07:18
回復(fù) 6# rubyish


太妙了! 值得細(xì)細(xì)分析
有點(diǎn)象文言文或者古詩
作者: 只是一個(gè)紅薯    時(shí)間: 2013-07-26 10:03
奇怪,用komodo編譯,要加個(gè)括號...
rubyish 發(fā)表于 2013-07-26 01:52
  1. my %f2 = map { reverse (/(\S+)\s+(.*?)\d+$/) } <$F2>;
復(fù)制代碼
也來試試 ~

作者: zljjg2000    時(shí)間: 2013-07-26 12:12
再請教:
@tmp = grep { $_ ne $aa } @tmp;
中的$_指的哪個(gè)變量啊
作者: grshrd49    時(shí)間: 2013-07-26 12:27
回復(fù) 9# zljjg2000


    grep { $_ ne $aa } @tem
$_是后面的數(shù)組中的每個(gè)元素,類似于for循環(huán)吧
作者: zljjg2000    時(shí)間: 2013-07-26 14:20
怎么覺得在這個(gè)程序中,經(jīng)過for my $aa(@a){
@tmp = grep { $_ ne $aa } @tmp;

循環(huán)后,@tmp最后是空的了,然后再$hash{$_}='' for (@tmp),則%hash也是空的了。實(shí)際上,最后
push @c,$hash{$_}."\t".$_ for  keys %hash; 才真正將%hash賦值。所以覺得前面這兩步好像沒用。

我在此程序中,將@tmp = grep { $_ ne $aa } @tmp;和$hash{$_}='' for (@tmp),兩行注釋了,程序輸出結(jié)果和沒有注釋前是一樣的,不知是這么理解嗎

作者: 唐歸來    時(shí)間: 2013-07-26 15:13
試驗(yàn)了一下,為什么得到的哈希%f2只有file2中的最后一行?求解啊.回復(fù) 6# rubyish


   
作者: 只是一個(gè)紅薯    時(shí)間: 2013-07-26 17:34
一樣的?這個(gè)哪去了:
  1.           10.5.248.130
  2.           10.5.248.2
  3.           10.5.249.3
復(fù)制代碼
?

zljjg2000 發(fā)表于 2013-07-26 14:20
怎么覺得在這個(gè)程序中,經(jīng)過for my $aa(@a){
@tmp = grep { $_ ne $aa } @tmp;

作者: rubyish    時(shí)間: 2013-07-27 05:38
回復(fù) 13# 唐歸來

試驗(yàn)了一下,沒問題啊   
my %f2:
  1. { 10.5.10. => 大廈, 10.5.246. => 經(jīng)一路, 10.5.247. => 小河村 }
復(fù)制代碼
my output:
  1. 經(jīng)一路  10.5.246.3
  2. 小河村  10.5.247.130
  3. 小河村  10.5.247.2
  4.         10.5.248.130
  5.         10.5.248.2
  6.         10.5.249.3
復(fù)制代碼

作者: rubyish    時(shí)間: 2013-07-27 05:46
回復(fù) 8# 只是一個(gè)紅薯


沒用komodo
我不知道。
作者: rubyish    時(shí)間: 2013-07-27 06:18
回復(fù) 7# grshrd49

謝謝,古詩一首賞析
q.zip (317 Bytes, 下載次數(shù): 3)
   
作者: 唐歸來    時(shí)間: 2013-07-28 09:03
好吧,不知道為什么我試驗(yàn)的時(shí)候得到的hash一直是
10.5.10.  大廈
10.5.10.  大廈
不解啊,不過還是謝謝啊,回復(fù) 15# rubyish


   




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2