免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1842 | 回复: 9
打印 上一主题 下一主题

有高手给展示下如何合并文件吗,谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-07 02:51 |只看该作者 |倒序浏览
有大侠给展示个完整程序吗, 感激不尽。

file 1 :
name1 0.3
name2 0.5
name3 0.6

file 2:
name1 0.2
name4 0.5

file 3:

name1 0.2
name4 0.2
name5 0.4

name file:
name1
name2
name4

results:

names    file1 file2 file3
name1   0.3    0.2     0.2
name2   0.5       N     N
name4      N      N      0.2
解释,将name 文件里有的 从3个文件(file 1,2,3)中取出,再共同写入一个result file。

论坛徽章:
0
2 [报告]
发表于 2013-03-07 10:31 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
3 [报告]
发表于 2013-03-07 11:38 |只看该作者
本帖最后由 mcshell 于 2013-03-07 11:39 编辑
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. my %hash;
  5. my @filearr = qw{file1 file2 file3};
  6. for my $file (@filearr){
  7.     open FH,"$file.txt" or die "$!";
  8.     map{$hash{$file}{(split)[0]}=(split)[1]}<FH>;
  9.     close FH;
  10. }
  11. my @filename = qw{name1 name2 name4};
  12. print "names ",join(" ",(sort keys %hash)),"\n";
  13. for my $name (sort @filename){
  14.     print "$name ";
  15.     map{$hash{$_}{$name}?print $hash{$_}{$name}," ":print "N "}sort keys %hash;
  16.     print "\n";
  17. }
复制代码
回复 1# zhxftj


   

论坛徽章:
0
4 [报告]
发表于 2013-03-07 12:00 |只看该作者
回复 2# 芙蓉女侠
真的是大侠耶,这么快,这么全 ,今天试下,再回来反馈下

呵呵 ,还写的很整洁呢 ,嗯 谢谢郭女侠 。。。。哦 不 芙蓉女侠。。。 [拱手,拱手]


   

论坛徽章:
0
5 [报告]
发表于 2013-03-07 12:02 |只看该作者
回复 3# mcshell


    这头像和 签名 牛的 。。。写的 这么短,我也抽空试下吧。。。


呵呵 ,心里话是高手呀 ,能写这么简洁

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
6 [报告]
发表于 2013-03-07 13:42 |只看该作者
本帖最后由 rubyish 于 2013-03-07 10:03 编辑

也试下:
  1. #!/usr/bin/perl
  2. my @files = qw/name file1 file2 file3/;
  3. my @f;

  4. for my $i ( 0 .. $#files ) {
  5.     open my $fh, $files[$i];
  6.     $f[$i] = $i ? { map  split, <$fh> } : [ grep chomp, <$fh> ];
  7. }

  8. print join("\t", 'names', @files[1..$#files]), $/;

  9. for my $n ( @{ shift @f } ) {
  10.     print join("\t", $n, map $$_{$n} // 'N', @f), $/;
  11. }
复制代码

论坛徽章:
0
7 [报告]
发表于 2013-03-08 01:57 |只看该作者
回复 6# rubyish

试了,非常好,非常简洁
大道至简

高手呀。。。

   

论坛徽章:
0
8 [报告]
发表于 2013-03-08 02:00 |只看该作者
回复 1# zhxftj
感谢所有人,嗯会研究下

第一个回复的最快,但好像有报错,我 还没debug呢,有空研究 下, 但感谢您快速完整的 回复

第二个做到了要求 很好
第三个最简洁,每行打印出的都有 tab隔开了,很整洁,,也是最短的,嗯谢谢

    谢谢大家

论坛徽章:
0
9 [报告]
发表于 2013-03-08 02:05 |只看该作者
本帖最后由 zhxftj 于 2013-03-08 02:18 编辑

回复 6# rubyish
高手, 有个简单注释版的吗,本人智商有限,理解不了,只明白前3行+ print那行。。。

    10分钟后。。。现在看懂了 前5行,+最后 一行。。。

也就是说 只有1/3 不懂了 ,呵呵


print那行最后 那个是啥意思呀 “$/”
第7行,
    $f[$i] = $i ? { map  split, <$fh> } : [ grep chomp, <$fh> ];

和 12,13行。不懂呢 。。。

for my $n ( @{ shift @f } ) {
    print join("\t", $n, map $$_{$n} // 'N', @f), $/;

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
10 [报告]
发表于 2013-03-08 10:15 |只看该作者
来个awk的~
  1. awk 'BEGIN{printf "%s\t%s\t%s\t%s\n","names","file1","file2","file3"}{a[$1,ARGIND]=$2}ARGIND==4{printf $0"\t";for(i=1;i<3;i++)printf a[$0,i]!=""?a[$0,i]"\t":"N\t";print a[$0,3]!=""?a[$0,3]"\t":"N\t"}'
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP