免费注册 查看新帖 |

Chinaunix

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

两个文件提取合并 [复制链接]

论坛徽章:
0
发表于 2017-04-18 14:39 |显示全部楼层
本帖最后由 Eva326 于 2017-04-18 16:20 编辑

小白请教各位,有两个文件都是tab分隔,
文件1:
ID
1
1.1
2
3

文件2:
1 a1 11
1 a2 12
3 c1 31
3 c2 32
3 c3 33
4 d  41

文件1和2的第一列ID有部分相同,想把文件2中含文件1的行提取出来,并且以第一列作为文件名,得到1.txt和3.txt两个文件:
>cat 1.txt
a1 11
a2 12
>cat.3.txt
c1 31
c2 32
c3 33


请大神指教!多谢!


论坛徽章:
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-18 16:10 |显示全部楼层
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. sub Load{
  5.         local @ARGV = @_;
  6.         my %hData = ();
  7.         while(<>){
  8.                 my @aT = split;
  9.                 @aT % 2 ? $hData{$aT[0]}++ : push(@{$hData{$aT[0]}}, $aT[-1]);
  10.         }
  11.         return wantarray ? keys %hData : \%hData;
  12. }

  13. my $fb = Load(pop);
  14. foreach(Load(pop)){
  15.         next if(!exists($fb->{$_}));
  16.         open(my $FHw, '>', "$_.txt");
  17.         print($FHw join("\n", @{$fb->{$_}}, ''));
  18.         close($FHw);
  19. }
复制代码

perl abc.pl a.txt b.txt

论坛徽章:
0
发表于 2017-04-19 09:10 |显示全部楼层
回复 2# sunzhiguolu
多谢大神!不过对于我这样的小白来说,看懂有点费劲呢

论坛徽章:
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-19 11:17 |显示全部楼层
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. open(my $FHr, '<', shift(@ARGV));        #Read data from a.txt
  5. my %hKeys = ();
  6. while(<$FHr>){
  7.         my ($k) = split;
  8.         $hKeys{$k} = 1;
  9. }
  10. close($FHr);

  11. my %hData = ();
  12. open($FHr, '<', shift(@ARGV));
  13. while(<$FHr>){
  14.         my ($k, @aT) = split;
  15.         push(@{$hData{$k}}, "@aT");
  16. }
  17. close($FHr);

  18. foreach(keys %hKeys){
  19.         next if(!exists($hData{$_}));
  20.         open(my $FHw, '>', "$_.txt");
  21.         print($FHw join("\n", @{$hData{$_}}, ''));
  22.         close($FHw);
  23. }
复制代码

perl abc.pl a.txt b.txt

论坛徽章:
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
发表于 2017-04-21 03:10 |显示全部楼层
本帖最后由 rubyish 于 2017-04-20 23:12 编辑

perl abc.pl doc1 doc2
  1. #!/usr/bin/perl -w

  2. my $z = pop;
  3. my %l = map { chomp; $_ => 0 } <>;
  4. @ARGV = $z;

  5. while (<>) {
  6.     my ( $k, $v ) = split /\t/, $_, 2;
  7.     next unless exists $l{$k};
  8.     $l{$k} ||= do { open my $F, '>', "$k.txt"; $F };
  9.     print { $l{$k} } $v;
  10. }

  11. close $_ for grep $_, values %l;

  12. __DATA__
  13. $_
复制代码

论坛徽章:
0
发表于 2017-04-21 14:31 |显示全部楼层
文件2:
谢谢大家!还有一个小问题,
如果文件2有重复:
1 a1 11
1 a1 11
1 a2 12
3 c1 31
3 c2 32
3 c3 33
4 d  41

最后结果如何去除呢?

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2017-04-27 09:25 |显示全部楼层
回复 6# Eva326

如果文件2有重复: ... 最后结果如何去除呢?

$ cat a.txt
1
1.1
2
3

$ cat b.txt
1 a1 11
1 a1 11

1 a2 12
3 c1 31
3 c2 32
3 c3 33
4 d  41

$ perl gen_x_txt.pl a.txt b.txt
Create output file: 1.txt
Create output file: 3.txt


$ cat 1.txt
a1 11
a2 12

$ cat 3.txt
c1 31
c2 32
c3 33

$ cat gen_x_txt.pl
#! /usr/bin/perl

use strict;
use warnings;

sub message{
  print <<EOF;
Usage  : $0 ID_FILE DATA_FILE
Example: $0 a.txt   b.txt
EOF
  exit 1;
}

message() if @ARGV != 2;

my(%hIdx, %hTxt, %hCnt);
my $sCnt = 0;

my($sFidx, $sFdat)  = @ARGV;

open(my $FHidx, "<", $sFidx) or die "cannot open $sFidx file\n";
open(my $FHdat, "<", $sFdat) or die "cannot open $sFdat file\n";


while(<$FHidx>){
  s/^\s+|\s+$//g;
  next if(m/^(#|$)/);
  $hIdx{$_} = 1;
}

while(<$FHdat>){
  s/^\s+|\s+$//g;
  next if(m/^(#|$)/);
  my($sKey, @aData) = split;
  next if(! exists $hIdx{$sKey});
  next if($hCnt{"$sKey @aData"}++);
  openfile($sKey) if(! exists $hTxt{$sKey});
  print {$hTxt{$sKey}} join(" ",@aData),"\n";
}
sub openfile{
  my($sKey) = @_;
  my $sFile = "$sKey.txt";
  open(my $FHout, ">", $sFile) or die "cannot open $sFile file\n";
  print "Create output file: $sFile\n";
  $hTxt{$sKey} = $FHout;
}

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP