免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4571 | 回复: 11

在文件A中查找B、C、D中存在的元素,有的则为y,无则为n [复制链接]

论坛徽章:
0
发表于 2014-06-24 19:51 |显示全部楼层
各位大神,请出手相助

在文件A中查找BCD中存在的元素,有的则为y,无则为n

处理前:

file A:             file B:        file C:        file D:
小明           小明                小红           小蔡
小王                 小王           小黄                小杨
小李                 小红                小蔡            小牛
小东                       
小蔡                       
小杨                       
小牛                       
小红                       
小黄                       


处理后:


file A:             file B:        file C:        file D:
小明            y                  n               n
小王            y               n               n
小李            n                  n               n
小东            n                  n               n
小蔡            n                  y               y
小杨            n                  n               y
小牛            n                  n               y
小红            y                  y               n
小黄            n                  y               n

谢谢!

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
发表于 2014-06-24 20:52 |显示全部楼层
本帖最后由 stanley_tam 于 2014-06-24 20:58 编辑

试试这个{:3_184:}
  1. #!perl
  2. use Modern::Perl;
  3. use FileHandle;

  4. my $data_href = +{};

  5. for my $file ('a', 'b', 'c', 'd'){
  6.     my @lines = FileHandle->new($file, 'r')->getlines;
  7.     chomp @lines;
  8.     $data_href->{$file} = \@lines;
  9. }

  10. my $out_fh = FileHandle->new('output.txt', 'w');
  11. $out_fh->printf("%-10s%-10s%-10s%s$/", 'file A:', 'file B:', 'file C:', 'file D:');

  12. for my $a_item ( @{ $data_href->{a} } ){
  13.     my $in_b = $a_item ~~ $data_href->{b} ? 'Y' : 'N';
  14.     my $in_c = $a_item ~~ $data_href->{c} ? 'Y' : 'N';
  15.     my $in_d = $a_item ~~ $data_href->{d} ? 'Y' : 'N';
  16.     $out_fh->printf("%-10s%-10s%-10s%s$/", $a_item, $in_b, $in_c, $in_d);
  17. }
  18. $out_fh->close;

  19. __END__
复制代码

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
发表于 2014-06-24 21:30 |显示全部楼层
我想问一下,1 file ?  4 file ? 谢谢!

论坛徽章:
0
发表于 2014-06-24 21:42 |显示全部楼层
本人小白一个,使用了一个awk命令,awk -v OFS='\t' 'NR==FNR{x[$1]=1}NR>FNR{if(x[$1]){a="y"}else{a="n"} print $0,a}'  file1  file2,就是要重复几次

论坛徽章:
0
发表于 2014-06-24 22:15 |显示全部楼层
本帖最后由 45177659 于 2014-06-24 22:24 编辑
  1. $ cat search.pl
  2. #!/usr/bin/perl -w

  3. @file_list = qw/B C D/;
  4. $pat = qw/A/;

  5. # construct hash table
  6. foreach my $file (@file_list) {
  7.         open(my $fh, $file) or die;
  8.         while (defined (my $item = <$fh>)) {
  9.                 next if $item =~ /^\s*$/;
  10.                 chomp $item;
  11.                 $file{$item} = 1;
  12.         }
  13.         close $fh;
  14. }

  15. # search for each pattern in file a
  16. open($pat, "$pat") or die;
  17. print "A      B   C   D\n";
  18. while (defined(my $item = <$pat>)) {
  19.         next if $item =~ /^\s*$/;
  20.         chomp $item;
  21.         print $item;
  22.         foreach my $file (@file_list) {
  23.                 print exists $$file{$item} ? "   y" : "   n";
  24.         }
  25.         print "\n";
  26. }

  27. close $pat;
复制代码
result:
$ ./search.pl
A      B   C   D
小明   y   n   n
小王   y   n   n
小李   n   n   n
小东   n   n   n
小蔡   n   y   y
小杨   n   n   y
小牛   n   n   y
小红   n   y   n
小黄   n   y   n

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
发表于 2014-06-25 15:25 |显示全部楼层
本帖最后由 mcshell 于 2014-06-25 15:26 编辑
  1. my @files = qw/A B C D/;
  2. my ( $g;
  3. print join "\t", @files, "\n";
  4. my $all = shift @files;
  5. for my $file (@files) {
  6.     open FH, $file or die $!;
  7.     while (<FH>) {
  8.         chomp;
  9.         push @{ $g->{$file} }, $_;
  10.     }
  11. }
  12. open FA, $all or die $!;
  13. while (  my $line = <FA>  ) {
  14.     chomp $line;
  15.     print $line;
  16.     my $letter;
  17.     for my $file (@files) {
  18.         for ( @{ $g->{$file} } ) {
  19.             $line eq $_ ? do { $letter = "y"; last } : do { $letter = "n" };
  20.         }
  21.         print "\t$letter";
  22.     }
  23.     print "\n";
  24. }
复制代码

论坛徽章:
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
发表于 2014-06-26 04:08 |显示全部楼层
本帖最后由 rubyish 于 2014-06-26 00:20 编辑

perl abc.pl file1 > file2
  1. #!/usr/bin/perl
  2. my ( %h, @k );
  3. my $title = <>;
  4. my $max   = ( $title =~ tr/\t// ) - 1;
  5. print $title;

  6. while (<>) {
  7.     chomp;
  8.     my ( $k, @ks ) = split /\t/;
  9.     push @k, $k;
  10.     $h{ $ks[$_] }[$_] = 'y' for 0 .. $#ks;
  11. }

  12. for my $k (@k) {
  13.     print join( "\t", $k, map { $h{$k}[$_] || 'n' } 0 .. $max ), $/;
  14. }

复制代码

论坛徽章:
0
发表于 2014-06-26 10:06 |显示全部楼层
回复 1# 米兰的_小木匠
  1. my @fileA = qw(小明 小王 小李 小东 小蔡 小杨 小红);
  2. my @fileB = qw(小明 小王 小红);
  3. my %hash;

  4. foreach my $item (@fileB){
  5.         $hash{$item} = 1;
  6. }

  7. foreach my $item (@fileA){
  8.         if($hash{$item}){
  9.                 print "$item -> Y\n";
  10.         }
  11.         else
  12.         {
  13.                 print "$item -> N\n";
  14.         }
  15. }
复制代码
  1. 小明 -> Y
  2. 小王 -> Y
  3. 小李 -> N
  4. 小东 -> N
  5. 小蔡 -> N
  6. 小杨 -> N
  7. 小红 -> Y
复制代码

论坛徽章:
0
发表于 2014-07-01 15:43 |显示全部楼层
mark downhere

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
发表于 2014-07-01 17:03 |显示全部楼层
菜鸟也来一个吧。。。
不过,总是感觉哪不对。。。
  1. my ( %h, @k );
  2. my $ref = shift @ARGV;
  3. my $title = 'file\name';
  4. open REF, $ref or die "$!";
  5. map {chomp;$title .= "\t$_"} <REF>;
  6. close REF;
  7. foreach my $value(@ARGV){
  8.         open RT, $value or die "$!";
  9.         map {chomp;$h->{$value}->{$_} = 'y';}<RT>;
  10.         open REF, $ref or die "$!";
  11.         push @k, join( "\t", $value, map {chomp;$h->{$value}->{$_} || 'n';} <REF>)."\n";
  12.         close REF;
  13.         close RT;
  14. }

  15. print "$title\n@k";


  16. ---------------------------------
  17. perl test.pl ref file1 file2 file3
  18. file\name    小明    小王    小李    小东    小蔡    小杨    小牛    小红    小黄
  19. file1   y       y       n       n       n       n       n       y       n
  20. file2  n       n       n       n       y       n       n       y       y
  21. file3  n       n       n       n       y       y       y       n       n
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP