忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT 视频 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 655 | 回复: 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


请大神指教!多谢!


论坛徽章:
299
程序设计版块每周发帖之星
日期: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
多谢大神!不过对于我这样的小白来说,看懂有点费劲呢

论坛徽章:
299
程序设计版块每周发帖之星
日期: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

最后结果如何去除呢?

论坛徽章:
108
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07巳蛇
日期:2014-05-09 16:43:18巨蟹座
日期:2014-10-23 17:48:38子鼠
日期: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
发表于 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;
}

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

本版积分规则

【有奖调查】AI时代如何迎接未知挑战?

人工智能一直在医疗行业扮演着重要角色,最早的专家系统和后来的基因诊断都是人工智能技术在医疗的行业探索。近年来,随着深度学习等技术的进步,人工智能在医疗行业的应用领域不断扩展,医学影像智能诊断、语音电子病历、癌症智能诊断等均已逐渐成为热门发展方向。
而作为人工智能重要推动力的深度学习技术的快速发展却亟需认知系统的强力支撑。
----------------------------------------
活动时间:2017年5月15日-6月5日

调查入口>>
  

北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP