免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: xunong
打印 上一主题 下一主题

求助:怎么从A文件中提取第一列然后去B文件找对应的值 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-11-15 10:08 |只看该作者 |倒序浏览
如题
假如A文件如下:              文件B:
ID ee fe jj                     ID  A  B   C  D
a   ,   f   .                      a   2  3   6   9
b   .  d  g                      c   1  5    7  12
c   2  /  4                      d   2  4   11  7
d   e  3  /                      e   1  2   3    7
f                                   h   
...                                ...
  

将A文件ID列提取出来,去B文件ID列找,如果有,就输出此ID及后面对应的4列数值到新文件 C

B文件里有些ID,A文件里没有不予考虑。只找A文件ID及对应的数值

论坛徽章:
1
羊年新春福章
日期:2015-04-28 20:40:58
2 [报告]
发表于 2014-11-15 11:13 |只看该作者
本帖最后由 清泉一边 于 2014-11-15 11:14 编辑

可能需要改一下吧~
  1. my %hash;
  2. while (<B>){
  3. my ($k,$v) = split,$_,2;
  4. $hash{$k} = $v;
  5. }
  6. while (<A>){
  7. chomp;
  8. my ($name,$non) = split,$_,2;
  9. print OUT "$name\t$hash{$name}\n" if exists $hash{$name};
  10. }
复制代码
回复 1# xunong



   

论坛徽章:
0
3 [报告]
发表于 2014-11-15 14:05 |只看该作者
或者用 awk 能不能直接实现呢?

求大神指教!

论坛徽章:
0
4 [报告]
发表于 2014-11-15 16:11 |只看该作者
use strict;
open (FH,"<","A.txt");
my @b;
while(<FH>){
        my @a=split(/ /,$_);
        push(@b,$a[0]);
}
my @b2;
open (FH2,"<","B.txt");
while(<FH2>){
        my @a=split(/ /,$_);
        my $it=grep (/^$a[0]$/, @b);
        if($it==1){
                push(@b2,$_);
        }
}
open (FH3,">","C.txt");
print(FH3 @b2);

论坛徽章:
1
狮子座
日期:2014-02-25 09:46:33
5 [报告]
发表于 2014-11-20 15:26 |只看该作者
直接存哈希就行了~~~

论坛徽章:
0
6 [报告]
发表于 2015-04-22 10:15 |只看该作者
请问解决了么?怎么解决的

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
7 [报告]
发表于 2015-04-22 13:46 |只看该作者
这是 Perl 6 版本的:
  1. #!perl6

  2. use v6;

  3. my %hash-a = file-to-hash('A.txt');
  4. my %hash-b = file-to-hash('B.txt');

  5. my %filter-hash = filter-key(%hash-a, %hash-b);
  6. say %filter-hash;

  7. sub file-to-hash($file) {
  8.   my @lines = $file.IO.lines;
  9.   my %hash;
  10.   for @lines -> $line {
  11.     my @elems = $line.split(/\s+/);
  12.     %hash{@elems[0]} = @elems[1..*];
  13.   }
  14.   return %hash;
  15. }

  16. sub filter-key (%hash-a, %hash-b) {
  17.   my %hash-filter;
  18.   for %hash-a.keys -> $key {
  19.     if %hash-b{$key}:exist {
  20.       %hash-filter{$key} = %hash-b{$key};
  21.     }
  22.   }
  23.   return %hash-filter;
  24. }

复制代码

论坛徽章:
0
8 [报告]
发表于 2015-04-30 15:40 |只看该作者
直接就行了

perl -ane 'print if $_[$F[0]]++' A.txt B.txt > C.txt

论坛徽章:
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
9 [报告]
发表于 2016-09-21 12:50 |只看该作者
回复 8# ba_du_co
大师, 您这个是个啥写法?
$_[$F[0]]++



论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
10 [报告]
发表于 2016-09-26 10:06 |只看该作者

  1. awk 'NR==FNR&&FNR>1{a[$1]=1;next}a[$1]' A B > C
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP