perl 两个数组 合并成一个新数组 按行分别对齐 按关键词计算差值

各位好,请教如下Perl编程问题。现有两个数组@one和@two@one内容如下TimeData0.11:210.522:1000.9101:201@two内容如下Tim... 各位好,请教如下Perl编程问题。现有两个数组@one 和@two@one内容如下Time Data0.1 1:210.5 22:1000.9 101:201@two内容如下Time Data0.2 1:210.65 22:1001.2 101:201现在想建立一个数组@three讲前述两数组合并为以下格式Time Data Time Data0.1 1:21 0.2 1:210.5 22:100 0.65 22:1000.9 101:201 1.2 101:201数组@one 和数组 @two都是从文件中读取的,长度比较长,数值都是随机的。现在想计算关键词部分的时间差值例如本例的情况想得到如下结果:0.1 1:21 //以@two的data列为准,两数组均有1:21,其时间分别为0.2和0.1,取其差值,如果没有相0.15 22:100 //同的值,就从@one的对应列的下一行寻找,如果搜索完也没有,就取0。0.3 101:201etc...请各位指教,能解决建立数组@three并得到正确格式的,送上20分能一并解决data关键词计算结果的,再送上30。请在语句后面写上适当的期待您的回复。
非常抱歉,问题提出后格式全都乱掉了,请参考附件图片。谢谢合作!
展开
 我来答
5857068
2013-11-29 · 超过12用户采纳过TA的回答
知道答主
回答量:25
采纳率:100%
帮助的人:26.7万
展开全部
#!/usr/bin/env perl
use strict;

open( my $fh1, '<', 'file1' ) or die $!; 
open( my $fh2, '<', 'file2' ) or die $!; 

my @one = grep { not /Time/ } <$fh1>;
my @two = grep { not /Time/ } <$fh2>;
my %three = map{ 
                  my ($t2, $d2) = (/(\S+)\s+(\S+)/);
                  my ($t1, $d1) = (shift(@one) =~ /(\S+)\s+(\S+)/);
                  $d2 => $t2-$t1
} @two;

printf( "%-5s\t%-8s\n", 'Time', 'Data');
for my $key (keys %three) {
  printf( "%-5s\t%-8s\n", $three{$key}, $key );
}
close $fh1;
close $fh2;

 

我来补充一下,你的”如果没有相同的值,就从@one的下一行寻找“是指哪个没有相同的值, 是Data吗? 

追问
您理解的很对,发送方data时刻time1,接收方data的时刻time2,这个data是用号码来区分的,现在想统计时间差。

我在写问题描述的时候有一个地方有歧义,在想处理的txt文件中,没有time和data字样,全部是数字列。因此在实际应用的时候,尚不能得出想要的结果,程序还是需要修改。
不知道是否违规,你有淘宝账户吗?可能别的程序还需要调试,我可以支付一些酬金(小钱儿,别期待太高)。
追答
不要了,举手之劳而已。 下次有需求记得找我。 新浪微博 : @luciuz
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
捷竹Ok
2013-11-28
知道答主
回答量:78
采纳率:0%
帮助的人:10.5万
展开全部
#! /usr/bin/perl

open SRC_FILE_1, "data_1" or die "cann't open data_1";
open SRC_FILE_2, "data_2" or die "cann't open data_2";
my @one = <SRC_FILE_1>;
my @two = <SRC_FILE_2>;
my $length = ( @one > @two ) ? scalar @one : scalar @two;
my @three;
for my $idx (0..($length-1)){
chomp($one[$idx]);
chomp($two[$idx]);
$three[$idx] = sprintf "%-30s %s \n", $one[$idx], $two[$idx];
}
open DEST_FILE, "> data_3" or die "cann't open output";
for my $line (@three){
print DEST_FILE $line;
}
my %one = &list_2_hash(@one);
my %two = &list_2_hash(@two);
open DIFF_FILE, "> diff_result" or die "cann't open diff_result";
printf DIFF_FILE ("%-12s %s\n", "Time", "Data");
for (keys %one){
if(defined($two{$_})){
my $diff_value = $two{$_} - $one{$_};
printf DIFF_FILE ("%-12s %s\n", "$diff_value", "$_")
}
}
sub list_2_hash{
my @list = @_;
#print @list;
my %hash;
for (@list){
next if /Time/;
chomp($_);
my ($value, $key) = split /\s+/, $_;
$hash{"$key"} = $value;
}
return %hash;
}
更多追问追答
追问
非常感谢您的解答!
我试着调试一下。
另外不知道是否违规,你有淘宝账户吗?可能还有别的perl程序需要调试,我可以支付一些酬金。
追答
淘宝帐户: firstephen82 
qq:240364254
mail: firstephen@163.com
你还有什么问题,加qq,留言都可以哈
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式