免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1931 | 回复: 4

请教整合三个文件 [复制链接]

论坛徽章:
0
发表于 2017-04-21 14:48 |显示全部楼层
本帖最后由 zero_BX 于 2017-05-23 22:32 编辑

各位大神,我有三个文件,现在想整合为一个,

文件1:  第一列没有重复
A1        1        1        1        1
A2        1        1        1        1
D1        1        1        1        1

文件2:  有关系对的重复
1        A1
1        A1
2        A1
3        A1
3        A2
4        A2
1        A2
1        D1
1        D1

文件3:  没有重复
1        1.1
3        3.1
2        2.1

现在我想根据文件1的第一列,从文件2,3获取对应的值,添加在最后一列

求指教!非常感谢!

论坛徽章:
0
发表于 2017-04-21 22:02 |显示全部楼层
  1. #!/usr/bin/perl

  2. use 5.016;

  3. my @ARRAY_STRING_Files_Name = qw/NewDocument document1 document2 document3/;

  4. open my $FILEHANDLE_NewDocument, '>', $ARRAY_STRING_Files_Name[0]
  5.   or die "Could not create file [ $ARRAY_STRING_Files_Name[0] ] $!";
  6. open my $FILEHANDLE_document1, '<', $ARRAY_STRING_Files_Name[1]
  7.   or die "Could not open file [ $ARRAY_STRING_Files_Name[1] ] $!";
  8. open my $FILEHANDLE_document2, '<', $ARRAY_STRING_Files_Name[2]
  9.   or die "Could not open file [ $ARRAY_STRING_Files_Name[2] ] $!";
  10. open my $FILEHANDLE_document3, '<', $ARRAY_STRING_Files_Name[3]
  11.   or die "Could not open file [ $ARRAY_STRING_Files_Name[3] ] $!";

  12. my %HASHTABLE_STRING_id_STRING_idalia =
  13.   map {
  14.     my ( $STRING_ID, $STRING_alia ) = split;
  15.     $STRING_ID => "$STRING_ID,$STRING_alia;"
  16.   } <$FILEHANDLE_document3>;

  17. close $FILEHANDLE_document3;

  18. # %HASHTABLE_STRING_id_STRING_idalia
  19. # ( "2" => "2,2.1;", "3" => "3,3.1;", "ID" => "ID,alia;", "1" => "1,1.1;" )

  20. my %HASHTABLE_STRING_Symbol_STRING_idalia;
  21. my %HASHTABLE_STRING_Symbol_REFERENCE_HASHTABLE_STRING_Id_INTEGER_count;

  22. while (<$FILEHANDLE_document2>) {
  23.     my ( $STRING_id, $STRING_symbol ) = split;

  24.     next if not exists $HASHTABLE_STRING_id_STRING_idalia{$STRING_id};

  25.     if (
  26.         !$HASHTABLE_STRING_Symbol_REFERENCE_HASHTABLE_STRING_Id_INTEGER_count{
  27.             $STRING_symbol}{$STRING_id}++ )
  28.     {
  29.         $HASHTABLE_STRING_Symbol_STRING_idalia{$STRING_symbol} .=
  30.           $HASHTABLE_STRING_id_STRING_idalia{$STRING_id};
  31.     }
  32. }

  33. close $FILEHANDLE_document2;

  34. # %HASHTABLE_STRING_Symbol_STRING_idalia
  35. # ( A1 => "1,1.1;2,2.1;3,3.1;", A2 => "3,3.1;1,1.1;", symbol => "ID,alia;", D1 => "1,1.1;" )

  36. # %HASHTABLE_STRING_Symbol_REFERENCE_HASHTABLE_STRING_Id_INTEGER_count
  37. # ( D1 => { '1' => 2 }, symbol => { 'ID' => 1 }, A2 => { '1' => 1, '3' => 1 }, A1 => { '3' => 1, '2' => 1, '1' => 2 } )

  38. chomp( my $STRING_document1_firstline = <$FILEHANDLE_document1> );

  39. # $STRING_document1_firstline
  40. # "Symbol        A                B        C        D"

  41. say $FILEHANDLE_NewDocument $STRING_document1_firstline, "\t", 'V';

  42. while (<$FILEHANDLE_document1>) {
  43.     chomp;
  44.     my ($STRING_symbol) = split;

  45.     say $FILEHANDLE_NewDocument $_, "\t",
  46.       $HASHTABLE_STRING_Symbol_STRING_idalia{$STRING_symbol} // '';
  47. }

  48. close $FILEHANDLE_document1;
  49. close $FILEHANDLE_NewDocument;

  50. # NewDocument
  51. #Symbol        A                B        C        D        V
  52. #A1        1        1        1        1        1,1.1;2,2.1;3,3.1;
  53. #A2        1        1        1        1        3,3.1;1,1.1;
  54. #D1        1        1        1        1        1,1.1;

  55. say '久等啦!', "\n", join( ', ', @ARRAY_STRING_Files_Name[ 1, 2, 3 ] ),
  56.   "\n", '已整合为 ',
  57.   $ARRAY_STRING_Files_Name[0];


复制代码

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-04-23 15:54 |显示全部楼层
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my @args = splice(@ARGV, 0, 2);
  5. my %hPairs = ();
  6. while(<>){        #Load data from File.c
  7.         my ($id, $alia) = split;
  8.         $hPairs{$id} = "$id,$alia";
  9. }

  10. @ARGV = pop(@args);
  11. my %hRelated = ();
  12. while(<>){        #Load data from File.b
  13.         my ($id, $symbol) = split;
  14.         next if(!exists($hPairs{$id}));
  15.         $hRelated{$symbol}{$id}++;
  16. }

  17. foreach my $symbol (keys %hRelated){
  18.         my @aT = map {$hPairs{$_}} keys %{$hRelated{$symbol}};
  19.         delete($hRelated{$symbol});
  20.         $hRelated{$symbol} = join(';', @aT, '');
  21. }

  22. @ARGV = @args;
  23. while(<>){        #Print related data line from File.a
  24.         chomp;
  25.         my $symbol = $1 if(/\A(\S+)/);
  26.         next if(!exists($hRelated{$symbol}));
  27.         print("$_\t$hRelated{$symbol}\n");
  28. }
复制代码

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-04-23 15:57 |显示全部楼层
head a b c
==> a <==
A1        1        1        1        1
A2        1        1        1        1
D1        1        1        1        1

==> b <==
1        A1
1        A1
2        A1
3        A1
3        A2
4        A2
1        A2
1        D1
1        D1

==> c <==
1        1.1
3        3.1
2        2.1

论坛徽章:
0
发表于 2017-04-24 07:47 来自手机 |显示全部楼层
参考shell 的join命令很容易且高效
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP