这个需求是在生信分析中几乎天天用到,各种语言都能实现,也都各有特点。这次以perl为例。

已知

文件CT-VS-CON.All.xls为全部蛋白表达矩阵及其差异分析结果。

文件Homo_sapiens.ko为蛋白KEGG注释结果。

文件Homo_sapiens.fa为蛋白鉴定数据库(有的序列以多行展示)。

需求

将以上三表整合为一个表,输出需要的信息。

实现

#! /usr/bin/perl -w
use strict; =pod
Description: combine table
Author:
Created:
Version:
=cut use Getopt::Long;
#use Bio::SeqIO; my ($exp,$ko,$fa,$help,$outdir);
GetOptions(
"exp:s" => \$exp,
"ko:s" => \$ko,
"fa:s" => \$fa,
"outdir:s" => \$outdir,
"help|?" => \$help
);
$outdir ||= "."; if (!defined $exp || !defined $ko || !defined $fa || defined $help){
die << "USAGE";
description: combine table
usage: perl $0 [options]
options:
-exp <file> * all proteins expression matrix
-ko <file> * all proteins ko annotation table (protein=>ko)
-fa <file> all proteins sequence
-outdir <path> output directory, default is current directory "."
-help|? help information
eg:
perl $0 -exp a-VS-b.All.xls -ko All.ko -fa All.fa -outdir .
USAGE
} my %ko;
open KO, "<$ko" or die $!;
while(<KO>){
chomp;
if($_ =~ /^#/){next;}
my @K=split/\t/;
if(defined $K[1]){
$ko{$K[0]}=$K[1];
}else{
$ko{$K[0]}="-";
}
}
close KO; my %hash;
my $keys;
open DB, "< $fa" or die $!;
while(<DB>){
chomp;
if($_ =~ /^>(.*?)\s/){ #非贪婪匹配
$keys = $1;
}else{
$hash{$keys} .= $_;
}
}
close DB;
#foreach my $id(keys %hash){
# print "$id\n$hash{$id}\n";
#} my %exp;
my ($ratio,$class,$des,$pvalue);
open OUT, ">out.txt" or die $!;
open EXP, "< $exp" or die $!;
while(<EXP>){
chomp;
my @tmp=split/\t/,$_;
if($.==1){
for(my $i=0;$i<=$#tmp;$i++){
if($tmp[$i] =~ /ratio/i){$ratio=$i;}
if($tmp[$i] =~ /pvalue/i){$pvalue=$i;}
if($tmp[$i] =~ /class/i){$class=$i;}
if($tmp[$i] =~ /Description/i){$des=$i;}
}
print OUT "Protein\tratio\tpvalue\tClass\tDescription\tlog2FC\tKEGG\tSequence\n";
next;
}
$tmp[$class] =~ s/Non/None/;
$exp{$tmp[0]}="$tmp[0]\t$tmp[$ratio]\t$tmp[$pvalue]\t$tmp[$class]\t$tmp[$des]\t";
$exp{$tmp[0]} .= log2($tmp[$ratio]);
}
close EXP; my ($kegg,$seq);
foreach my $id (keys %exp){
if(exists $ko{$id}){
$kegg=$ko{$id};
}else{
$kegg="-";
}
if(exists $hash{$id}){
$seq=$hash{$id};
}else{$seq="-";}
print OUT "$exp{$id}\t$kegg\t$seq\n";
}
close OUT;
############################
# subroutine
############################
sub log2 {
my $n = shift;
return log($n)/log(2);
}

Perl编写的特点是only write,条条大道通罗马,高手也许几行就能解决,我这里写得有点冗余,但有些是不能省的,目的是为了更规范化,便于维护和他人阅读。

【Perl示例】整合多个文件的更多相关文章

  1. 用inno Setup做应用程序安装包的示例脚本(.iss文件)(

    用innoSetup做应用程序安装包的示例脚本(.iss文件),具体要看innoSetup附带的文档,好象是pascal语言写的脚本. 示例1(应用程序.exe,客户端安装): ;{089D6802- ...

  2. 整合MVC实现文件上传

    1.整合MVC实现文件上传整合MVC实现文件上传在实际的开发中在实现文件上传的同时肯定还有其他信息需要保存到数据库,文件上传完毕之后需要将提交的基本信息插入数据库,那么我们来实现这个操作.整个MVC实 ...

  3. Eclipse中的工程引入jar包后没有整合到一个文件夹而是全部在根目录下显示

    Eclipse中的工程引入jar包后没有整合到一个文件夹而是全部在根目录下显示 解决方案: 1,在Eclipse中,点击window-->Preferences-->Java-->B ...

  4. Android vcard使用示例,生成vcf文件

     Android vcard使用示例,生成vcf文件 我们备份手机联系人时,导出到SD卡时,会在SD卡中生成一个vcf文件,用于保存联系人姓名,手机号码. vCard 规范容许公开交换个人数据交换 ( ...

  5. springboot整合OSS实现文件上传

    OSS 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量.安全.低成本.高可靠的云存储服务.OSS可用于图片.音视频.日志等海量文件的存储.各种终端 ...

  6. shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。它通过解释器解释运行,所以速度相对来说比较慢。

    shell脚本?在说什么是shell脚本之前,先说说什么是shell. shell是外壳的意思,就是操作系统的外壳.我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包 ...

  7. Perl IO:随机读写文件

    随机读写 如果一个文件句柄是指向一个实体文件的,那么就可以对它进行随机数据的访问(包括随机读.写),随机访问表示可以读取文件中的任何一部分数据或者向文件中的任何一个位置处写入数据.实现这种随机读写的功 ...

  8. Spring Boot 2.x 综合示例-整合thymeleaf、mybatis、shiro、logging、cache开发一个文章发布管理系统

    一.概述 经过HelloWorld示例(Spring Boot 2.x 快速入门(上)HelloWorld示例)( Spring Boot 2.x 快速入门(下)HelloWorld示例详解)两篇的学 ...

  9. Perl文件名通配和文件查找

    在shell中使用*来对文件名进行通配扩展,在Perl中也同样支持文件名通配.而且perl中的glob通配方式和shell的通配方式完全一致,实际上perl的glob函数就是直接调用csh来通配的(如 ...

随机推荐

  1. UltraSoft - Beta - Scrum Meeting 7

    Date: May 23rd, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 暂无 Liuzh 前端 编写忘记密码界面 Kkkk 前端 暂无 王fuji 前端 ...

  2. 如何用PADS进行PCB设计?这6步就够了

    在使用PADS进行PCB设计的过程中,需要对印制板的设计流程以及相关的注意事项进行重点关注,这样才能更好的为工作组中的设计人员提供系统的设计规范,同时也方便设计人员之间进行相互的交流和检查. 02 设 ...

  3. Oracle 整库备份还原

    http://www.mamicode.com/info-detail-2481866.html sql语句 system用户登陆 查看表空间和存放位置 select t1.name,t2.name ...

  4. Linux 文本三剑客之 awk

    Linux 系统中一切皆文件. 文件是个文本.可以读.可以写,如果是二进制文件,还能执行. 在使用Linux的时候,大都是要和各式各样文件打交道.熟悉文本的读取.编辑.筛选就是linux系统管理员的必 ...

  5. 完美解决Github网页打开超慢的问题

    由于某些原因,国内访问Github会异常缓慢,在clone仓库时甚至只有10k以下的速度,下载半天有时还会失败需要从头再来,甚是让人恼火.本文介绍通过修改系统hosts文件的办法,绕过国内dns解析, ...

  6. Java 源码如何分析?

    如何阅读源码?万事开头难,源码从哪里开始看?我也是刚对源码的阅读研究不深,但是可以谈谈自己的源码阅读感受. 刚开始吧,只是对某些代码的实现原理感到好奇,好奇是怎么实现这种功能,实现这种效果的,对其背后 ...

  7. hdfs command

    hadoop fs -ls hdfs dfs -mkdir -p /user/$(whoami) hdfs dfs -chown -R $(whoami) /user/$(whoami) hdfs d ...

  8. 如何保证redis中存放的都是热点数据

    当redis使用的内存超过了设置的最大内存时,会触发redis的key淘汰机制,在redis 3.0中有6种淘汰策略: noeviction: 不删除策略.当达到最大内存限制时, 如果需要使用更多内存 ...

  9. 常见yaml写法-deployment

    apiVersion: extensions/v1beta1 #接口版本 kind: Deployment #接口类型 metadata: name: cango-demo #Deployment名称 ...

  10. Java学习(十九)

    先学了字体分类 大概是这种效果: 一般把这些大类放在font-family的最后使用,防止字体呈现的效果不够好. 今天把final关键字学完了 也要几点要注意,我觉得比较重要的就是public sta ...