这个需求是在生信分析中几乎天天用到,各种语言都能实现,也都各有特点。这次以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. 改善深层神经网络-week1编程题(Initializaion)

    Initialization 如何选择初始化方式,不同的初始化会导致不同的结果 好的初始化方式: 加速梯度下降的收敛(Speed up the convergence of gradient desc ...

  2. Golang通脉之反射

    什么是反射 官方关于反射定义: Reflection in computing is the ability of a program to examine its own structure, pa ...

  3. UltraSoft - Alpha - Scrum Meeting 5

    Date: Apr q9th, 2020. Scrum 情况汇报 进度情况 组员 负责 昨日进度 后两日任务 CookieLau PM 统筹个人进度,协助推进进度 辅助前后端连接工作 刘zh 前端 完 ...

  4. [对对子队]会议记录5.19(Scrum Meeting6)

    今天已完成的工作 吴昭邦 ​ 工作内容:搭建第9关 ​ 相关issue:搭建关卡7.8.9 ​ 相关签入:feat: 第9关能够通过 何瑞 ​ 工作内容:搭建第9关 ​ 相关issue:搭建关卡7.8 ...

  5. 网络摄像机中的IR-CUT详解

    自然界存在着各种波长的光线,通过折射人眼能看到不同颜色的光线,这就是光线的波长不同所导致的.其实还有许多光线是人眼看不到的,人眼识别光线的波长范围在320nm-760nm之间,超过760nm的光线人眼 ...

  6. 字符串与模式匹配算法(一):BF算法

    一.BF算法的基本思想 BF(Brute Force)算法是模式匹配中最简单.最直观的算法.该算法最基本的思想是从主串的第 start 个字符起和模式P(要检索的子串)的第1个字符比较,如果相等,则逐 ...

  7. SQL Server 插入、更新和删除数据

    1.主要内容 ● 通过SSMS,插入.更新和删除表数据 ● 通过INSERT语句向表中插入数据 ● 通过UPDATE语句更新表内数据 ● 通过DELETE语句删除表内数据 ● 使用INSERT.UPD ...

  8. hdu 3199 Hamming Problem(构造?枚举?)

    题意: For each three prime numbers p1, p2 and p3, let's define Hamming sequence Hi(p1, p2, p3), i=1, . ...

  9. Mysql 5.7 集群部署,keepalived

    参考文章: https://blog.csdn.net/f18770366447/article/details/80703347 https://www.cnblogs.com/benjamin77 ...

  10. python语法与pycharm的基本使用

    内容概要 pycharm基本使用 python注释语法 变量与常量 垃圾回收机制 数据类型 1. pycharm基本使用 pycharm安装完成后首次打开要注意: 文件路径(不要选择C盘) pytho ...