免费注册 查看新帖 |

Chinaunix

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

求助 统计一个文件中的行是否在另外5个文件中出现,并输出 [复制链接]

论坛徽章:
2
15-16赛季CBA联赛之山西
日期:2015-12-16 09:17:4315-16赛季CBA联赛之广夏
日期:2016-04-05 11:56:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-08-20 03:08 |只看该作者 |倒序浏览
一共有6个文件,file1、file2、file3、file4、file5以及file_c,
它们的格式如下:
chr_       xxxx      x      x      x
都有5列,这里我需要将file_c中的行与file1、file2、file3、file4、file5比较,看file_c中的行是否出现(若出现则记为1,没有出现则记为0),并统计出现次数(0-5),按次数排序
最后想要输出的格式如下:
                                                     file1      file2     file3     file4     file5    total
chr_       xxxx      x      x      x           1          1         0         1         1        4
chr_       xxxx      x      x      x           1          1         1         1         0        4
chr_       xxxx      x      x      x           0          0         1         1         1        3               
                   ...

这个用perl该怎么实现呢?求各位大神指教,谢谢!

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2015-08-20 09:41 |只看该作者
本帖最后由 MMMIX 于 2015-08-20 09:42 编辑

回复 1# 不仅仅是符号


    先自个写一个吧. 至少要尝试一下, 别一上来就当伸手党.

论坛徽章:
2
15-16赛季CBA联赛之山西
日期:2015-12-16 09:17:4315-16赛季CBA联赛之广夏
日期:2016-04-05 11:56:15
3 [报告]
发表于 2015-08-20 09:56 |只看该作者
回复 2# MMMIX


   是,我的想法是先处理file_c,将\t作分隔符,split,将每一列作为key,构建hash
接着往file1~5里匹配,但是到这里就不知道该怎么操作了。。。不知道该怎么输出成我想要的格式_(:з」∠)_

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2015-08-20 10:31 |只看该作者
回复 3# 不仅仅是符号


    拿出代码来

论坛徽章:
1
羊年新春福章
日期:2015-04-28 20:40:58
5 [报告]
发表于 2015-08-20 10:40 |只看该作者
可以分开输出,再写个代码合并呀回复 3# 不仅仅是符号


   

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
6 [报告]
发表于 2015-08-20 13:08 |只看该作者
你可以用你最熟悉的语言实现,或者表达清楚,到底是哪里不会。否则一句想不清楚了,很少有人会帮助不愿意想原因的人。

论坛徽章:
2
15-16赛季CBA联赛之山西
日期:2015-12-16 09:17:4315-16赛季CBA联赛之广夏
日期:2016-04-05 11:56:15
7 [报告]
发表于 2015-08-20 14:49 |只看该作者
回复 6# 104359176


  额,最熟悉的大概是两年前学的C++...期间就没怎么写过程序了......我试试用perl写吧,刚刚才学,书还没看完但老板让我写这个,所以有点头疼嘿嘿

论坛徽章:
2
15-16赛季CBA联赛之山西
日期:2015-12-16 09:17:4315-16赛季CBA联赛之广夏
日期:2016-04-05 11:56:15
8 [报告]
发表于 2015-08-20 14:50 |只看该作者
回复 5# 清泉一边
谢谢,我试试~


   

论坛徽章:
2
15-16赛季CBA联赛之山西
日期:2015-12-16 09:17:4315-16赛季CBA联赛之广夏
日期:2016-04-05 11:56:15
9 [报告]
发表于 2015-08-20 18:53 |只看该作者
#!/usr/bin/perl -w
open INN ,"<", "file1" or die $!;
while ($line=<INN>) {
        chomp $line;
        @colu=split(/\t/,$line);
        $key=$colu[0]."\t".$colu[1]."\t".$colu[2]."\t".$colu[3]."\t".$colu[4];
        $hash{$key}=1;
}
close INN;

open IN ,"<", "file_c" or die $!;
my $resultFile="file_1";
open $out , ">", $resultFile or die "Cann't open file $resultFile ($!) \n";
while ($line=<IN>) {
        chomp $line;
         @colu=split(/\t/,$line);
        $key=$colu[0]."\t".$colu[1]."\t".$colu[2]."\t".$colu[3]."\t".$colu[4];
        if (exists $hash{$key}) {
                print $out "$line\t1\n" ;
        }else{
                print $out "$line\t0\n";
        }
}
close IN;

一共要写5个这样的(像我一样的代码还有四个!233),虽然挺笨的,但总算是在今天弄出结果来了_(:з」∠)_

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
10 [报告]
发表于 2015-08-20 21:37 |只看该作者
本帖最后由 MMMIX 于 2015-08-21 10:50 编辑

回复 9# 不仅仅是符号


    这是还不会用命令行参数?

可以参考下这个解法(输出不甚美观):

  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. use v5.14;
  5. use autodie;
  6. use Data::Dumper;

  7. if (@ARGV < 2) {
  8.     printf  "Usage: ./p.pl pattern_file file1 [file1 ...]\n";
  9.     exit 1;
  10. }

  11. my $pat_file = shift;

  12. open my $in, '<', $pat_file;

  13. my %count_of;
  14. my $N = @ARGV;

  15. while (<$in>) {
  16.     my $key = join "\t", split;
  17.     $count_of{$key}->[$N] = 0;
  18. }

  19. for my $i (0 .. $#ARGV) {
  20.     my $f = $ARGV[$i];

  21.     open my $h, '<', $f;
  22.     while (<$h>) {
  23.         my $key = join "\t", split;
  24.         $count_of{$key}->[$i] = 1 if $count_of{$key};
  25.     }
  26. }

  27. for my $val (values %count_of) {
  28.     my $t = 0;
  29.     for (@{$val}) {
  30.         $t++ if $_;
  31.     }
  32.     $val->[$N] = $t;
  33. }

  34. my $hf0 = (keys %count_of)[0];
  35. $hf0 =~ s/\w/ /g;

  36. say join "\t", ($hf0, @ARGV, 'total');
  37. for (sort { $count_of{$b}->[$N] <=> $count_of{$a}->[$N] } keys %count_of) {
  38.     say join "\t", ($_, map { $_ ? $_ : 0 } @{$count_of{$_}});
  39. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP