免费注册 查看新帖 |

Chinaunix

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

有没有更简单的方法? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-11-06 23:51 |只看该作者 |倒序浏览
#!usr/bin/perl -w
use strict;

open (IA,"$ARGV[0]") || die "input file can't open $!";
open (IB,"$ARGV[1]") || die "input file can't open $!";
my (@a,@b,@site,$s);
while (<IA>){
        chomp;
        @a=split;
        if ($a[1] ne 1){
        push (@site,$a[0]);}

}

while (<IB>){
        chomp;
        @b=split;
        foreach $s(@site){
                if ($s eq $b[0])
                {print "$_\n";}
        }
}


IA:
1        1
2        2
3        1
4        2
5        1


IB:
1        a        b
2        b        b
3        c        e
4        a        c
5        c        d

OUT:
2        b        b
4        a        c

论坛徽章:
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
2 [报告]
发表于 2015-11-07 00:09 |只看该作者
本帖最后由 sunzhiguolu 于 2015-11-07 08:52 编辑

回复 1# 静女,其姝
if ($s eq $b[0])

确定上面这个判断逻辑可以得到下面的结果?

  1. OUT:
  2. 2        b        b
  3. 4        a        c
复制代码
非常抱歉, 我没有仔细看.
if ($a[1] ne 1)


进行数值比较, 最好还是使用 (== | !=) 比较运算符较好, 不过在您的例子中没有问题.

论坛徽章:
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
3 [报告]
发表于 2015-11-07 01:13 |只看该作者
本帖最后由 sunzhiguolu 于 2015-11-07 14:01 编辑

试下:

  1. #!/usr/bin/perl -w
  2. use strict;

  3. my %hKeys;
  4. while (<>){
  5.     my ($sId, $sVal) = split;
  6.     if ($sVal !~ m{\A[a-z]\z}){
  7.         $hKeys{$sId} = '' if ($sVal != 1);
  8.     }else{
  9.         print if (exists $hKeys{$sId});
  10.     }
  11. }
复制代码

  1. perl iab.pl ia ib
复制代码

论坛徽章:
0
4 [报告]
发表于 2015-11-08 01:03 |只看该作者
非常感谢,我先自己看看每一行的含义,有不懂之处再请教
另外,我用ne比较数值时确实碰壁过,多谢指点

回复 3# sunzhiguolu


   

论坛徽章:
0
5 [报告]
发表于 2015-11-09 23:19 |只看该作者
这个程序并没有简便太多,而且那个匹配只是适用example的数据,
请问,有没有更简单的方法(一行code)?grep 可以达到吗?


回复 3# 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
6 [报告]
发表于 2015-11-09 23:35 |只看该作者
本帖最后由 sunzhiguolu 于 2015-11-09 23:38 编辑

回复 5# 静女,其姝
这个程序并没有简便太多,而且那个匹配只是适用example的数据,
请问,有没有更简单的方法(一行code)?grep 可以达到吗?

1.> 真实的数据啥样?
2.> 您能否提供一个一行 code 代码 show 一下?

我并没有冒犯您的意思, 如果言语不周请您见谅. 我只是针对问题而言.

   

论坛徽章:
0
7 [报告]
发表于 2015-11-10 11:20 |只看该作者
  1. perl -ane '$h{$F[0]}?print:$F[1]!=1&&$h{$F[0]}++' file1 file2
复制代码

评分

参与人数 1信誉积分 +10 收起 理由
sunzhiguolu + 10 赞一个!

查看全部评分

论坛徽章:
0
8 [报告]
发表于 2015-11-13 01:01 |只看该作者
是我太抱歉,索要太多

谢谢你不吝赐教
IA:
chr1        1        1
chr1        2        1
chr1        3        2
chr1        4        2
chr1        5        1       
chr1        6        2

IB:
chr1        1        A        A        A        A
chr1        2        T        T        T        T
chr1        3        C        G        C        G
chr1        4        G        G        G        A
chr1        5        A        A        A        A
chr1        6        A        A        T        A

output:
chr1        3        C        G        C        G
chr1        4        G        G        G        A
chr1        6        A        A        T        A

解释:两个文件的第一列都是染色体编号(忽略),第二列都是坐标(忽略),IB的三列到最后一列是

碱基,如果一行只有一种碱基,IA的第三列就是1,如果有2种碱基,IA的第三列就是2,现在要将IB中有

两种碱基的输出。虽然不用IA也可以得出结果,但是有其他比较复杂的情况,总之一定要根据IA来判断

。注:chr1有时也可能是Chr1或者包含T、C、G字母的其他string


回复 6# 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
9 [报告]
发表于 2015-11-13 08:12 |只看该作者
回复 8# 静女,其姝
一行 code 7 楼的前辈已经给您回复了. 参考 (他 | 她) 的代码即可.


   

论坛徽章:
12
2015年亚洲杯之乌兹别克斯坦
日期:2015-04-10 18:29:00狮子座
日期:2016-01-17 15:40:28处女座
日期:2016-01-16 17:36:17巨蟹座
日期:2016-01-16 17:35:48未羊
日期:2015-12-12 16:18:26青铜圣斗士
日期:2015-12-09 01:07:50IT运维版块每日发帖之星
日期:2015-12-05 06:20:00神斗士
日期:2015-12-03 23:13:59IT运维版块每日发帖之星
日期:2015-11-22 06:20:00IT运维版块每日发帖之星
日期:2015-11-08 06:20:00IT运维版块每日发帖之星
日期:2015-10-29 06:20:00IT运维版块每日发帖之星
日期:2016-06-30 06:20:00
10 [报告]
发表于 2015-11-13 11:27 |只看该作者
回复 3# sunzhiguolu


    很简单的做法,支持一个
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP