【Perl示例】整合多个文件
这个需求是在生信分析中几乎天天用到,各种语言都能实现,也都各有特点。这次以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示例】整合多个文件的更多相关文章
- 用inno Setup做应用程序安装包的示例脚本(.iss文件)(
用innoSetup做应用程序安装包的示例脚本(.iss文件),具体要看innoSetup附带的文档,好象是pascal语言写的脚本. 示例1(应用程序.exe,客户端安装): ;{089D6802- ...
- 整合MVC实现文件上传
1.整合MVC实现文件上传整合MVC实现文件上传在实际的开发中在实现文件上传的同时肯定还有其他信息需要保存到数据库,文件上传完毕之后需要将提交的基本信息插入数据库,那么我们来实现这个操作.整个MVC实 ...
- Eclipse中的工程引入jar包后没有整合到一个文件夹而是全部在根目录下显示
Eclipse中的工程引入jar包后没有整合到一个文件夹而是全部在根目录下显示 解决方案: 1,在Eclipse中,点击window-->Preferences-->Java-->B ...
- Android vcard使用示例,生成vcf文件
Android vcard使用示例,生成vcf文件 我们备份手机联系人时,导出到SD卡时,会在SD卡中生成一个vcf文件,用于保存联系人姓名,手机号码. vCard 规范容许公开交换个人数据交换 ( ...
- springboot整合OSS实现文件上传
OSS 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量.安全.低成本.高可靠的云存储服务.OSS可用于图片.音视频.日志等海量文件的存储.各种终端 ...
- shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。它通过解释器解释运行,所以速度相对来说比较慢。
shell脚本?在说什么是shell脚本之前,先说说什么是shell. shell是外壳的意思,就是操作系统的外壳.我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包 ...
- Perl IO:随机读写文件
随机读写 如果一个文件句柄是指向一个实体文件的,那么就可以对它进行随机数据的访问(包括随机读.写),随机访问表示可以读取文件中的任何一部分数据或者向文件中的任何一个位置处写入数据.实现这种随机读写的功 ...
- Spring Boot 2.x 综合示例-整合thymeleaf、mybatis、shiro、logging、cache开发一个文章发布管理系统
一.概述 经过HelloWorld示例(Spring Boot 2.x 快速入门(上)HelloWorld示例)( Spring Boot 2.x 快速入门(下)HelloWorld示例详解)两篇的学 ...
- Perl文件名通配和文件查找
在shell中使用*来对文件名进行通配扩展,在Perl中也同样支持文件名通配.而且perl中的glob通配方式和shell的通配方式完全一致,实际上perl的glob函数就是直接调用csh来通配的(如 ...
随机推荐
- [对对子队]会议记录4.21(Scrum Meeting12)
今天已完成的工作 吴昭邦 工作内容:基本实现改变顺序合成 相关issue:实现流水线合成系统的逻辑 相关签入:4.21签入1 梁河览 工作内容:修改设置界面bug 相关签入:4.2 ...
- BUAA2020软工作业(一)——谈谈我和计算机的缘分
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 第一次作业-热身! 我在这个课程的目标是 进一步提高自己的编码能力,工程能力 这个作业在哪个具体方 ...
- 升级MySQL8.0的历险记
最近忙于Fighting的项目,所以笔耕有些松懈,实为不该. 刚好遇到需要从MySQL5.7.33升级到MySQL8.0.x的需求,于是记录一下整个升级过程,踩坑而过. 背景梗概:本地docker容器 ...
- WiFi模块选型参考
经常会碰到一些关于wifi模块的咨询,很多刚接触wifi模块的设计人员或者用户,只知道提wifi模块,很难提具体的模块要求!希望通过文章的介绍,会做到有的放矢!咨询时一定要搞清楚自己希望使用什么主芯片 ...
- Linux C 数据结构 ->单向链表
之前看到一篇单向链表的博文,代码也看着很舒服,于是乎记录下来,留给自己~,循序渐进,慢慢 延伸到真正的内核链表~(敢问路在何方?路在脚下~) 1. 简介 链表是Linux 内核中最简单,最普通的数据结 ...
- sort方法和自定义比较器的写法
摘要 在做一些算法题时常常会需要对数组.自定义对象.集合进行排序. 在java中对数组排序提供了Arrays.sort()方法,对集合排序提供Collections.sort()方法.对自定义对象排序 ...
- 攻防世界 杂项 7.Aesop_secret
打开发现是个gif,以为有个二维码扫一下就给flag,结果被欺骗.呜呜呜 好了,还是使用编辑器看一下吧 发现了好玩的,U2FsdGVkX19QwGkcgD0fTjZxgijRzQOGbCWALh4sR ...
- 算法:杨辉三角(Pascal's Triangle)
一.杨辉三角介绍 杨辉三角形,又称帕斯卡三角形.贾宪三角形.海亚姆三角形.巴斯卡三角形,是二项式系数的一种写法,形似三角形,在中国首现于南宋杨辉的<详解九章算法>得名,书中杨辉说明是引自贾 ...
- robotframework-ride快捷方式打不开
我安装的是最新的RIDE2.0属于beta测试中,覆盖了3.8但仍不支持3.9 我的安装环境如下: 安装ride成功,启动ride的时候遇到了如下问题: 一:AttributeError: No at ...
- uni-app map组件关于marker标记点动态设置的问题
marker是Array类型,赋值的时候只能对整个数组进行更改赋值,不能只改变内部的对象,亲测Vue.$set()也不行 this.marker = [ { latitude: 39.90, long ...