perl练习——FASTA格式文件中序列GC含量计算&perl数组排序如何获得下标或者键

一、关于程序:

FUN:计算FASTA文件中每条序列中G和C的含量百分比,输出最大值及其id

INPUT:FASTA格式文件

>seq1
CGCCGAGCGCTTGACCTCCAGCAAGACGCCGTCTGGCACATGCAACGAGCTGTAGCAGAC
>seq2
ATGCCTAGAACGTTCGAGACTTCTCGGGTGCGGTAGAATTAGCCATTCGACCGACTTCCA
GCATCTGCGAGCCGCCTGTTGATTGCATCCGCCGGGGACGCAACAAGGCAAGGCCCTAAC

OUTPUT:最高含量的序列id及其含量(这是上面的结果)

seq1
63.333333%

二、编程思想及代码

当是注释行时(>……),获得序列 ID ,并跳过该次循环;当读到非注释行即序列行时,记录该行“G和C的含量”以及“序列的总含量”,这都可以利用perl上下文实现。(但是在这里有一些疑惑——当把14行@num换成$num会出现计算错误,知道的朋友欢迎留言)

 1 use strict;
 2 my %GC_content; # id=>GC_content
 3 my %sequences; # id=>sequence
 4 my ($id, $sum); # id, 每个序列的字符个数
 5 my @num; # 中间变量,用于存储单行中某字符的含量
 6 while(my $seq = <>){
 7         chomp($seq);
 8         if($seq =~ m/^>(.*)/){
 9             $id = $1;
10             next;
11         }
12         @num = ($seq =~ m/(G|C)/g);
13         $GC_content{$id} += @num;
14         @num = ($seq =~ m/(.)/g);
15         $sequences{$id} += @num;
16 }
17
18     foreach(keys(%GC_content)){
19         $GC_content{$_} /= $sequences{$_};
20     }
21 my @sort = sort{$GC_content{$b} <=> $GC_content{$a}} keys(%GC_content);
22 printf("%s\n%.6f%\n", $sort[0], $GC_content{$sort[0]}*100);

三、技巧

神奇的perl,神奇的sort!!

对数组(或者哈希)排序获得下标的方式:

# 数字排序:
my @arr = qw(2 3 41 2 34 );
my @result1 = sort{$a <=> $b} @arr;
# 获得下标:
my @result2 = sort{$arr[$a] <=> $arr[$b]} 0..$#arr;
# 获得key:
my %hash = (
    one =>1,
    two =>5,
    tree=>9
);
my @result3 = sort{$hash{$a} <=> $hash{$b}} keys(%hash);
print "数字排序:@result1\n获得下标:@result2\n获得key:@result3\n";

时间: 2024-12-15 07:16:24

perl练习——FASTA格式文件中序列GC含量计算&perl数组排序如何获得下标或者键的相关文章

fasta文件中序列的排序

同样的名为read_1.fa 的fasta文件,里面有若干序列,如: >@r1TGAATGCGAACTCCGGGACGCTCAGTAATGTGACGATAGCTGAAAACTGTACGATAAACNGTACGCTGAGGGCAGAAAAAATCGTCGGGGACATTNTAAAGGCGGCGAGCGCGGCTTTTCCG>@r2NTTNTGATGCGGGCTTGTGGAGTTCAGCCGATCTGACTTATGTCATTACCTATGAAATGTGAGGACGCTATGCCTGTACCAAAT

php提取csv格式文件中的字符串出现的问题及解决办法

php带csv格式的数据要用到fgetcsv()函数. 用这下面的语句 $hd=fopen('test.csv','r'); $buf=fgetcsv($hd,1000,','); 打开一个test.csv格式的文件,文件中的内容以","号分开. 取出的第一行代表自动含义,比如 id,messaget,time等等. 从第二行开始表示具体的数据,比如1,消息,12:00. if($buf[1]=="some messages") echo "yes&quo

python生成20个随机的DNA fasta格式文件

生成20个随机的文件, 由于没有用到hash名字,文件名有可能会重复 每个文件中有30-50条序列 每条序列的长度为70-120个碱基 import os import random import string print (dir(string)) letter = string.ascii_letters os.chdir("D:\\") bases = {1:"A", 2:"T", 3:"C", 4:"G&qu

perl实现从一个文件中随机抽取n行

源码之前,了无秘密,直接上源码: if(@ARGV!=2){ die "Usage: $0 sample_file sample_number\n"; } my($sample_file, $sample_number) = @ARGV; open my $FILE, "<$sample_file" or die "Can't open $sample_file $!\n"; my @content = <$FILE>; my

[转]【流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流

[流媒體]H264—MP4格式及在MP4文件中提取H264的SPS.PPS及码流 SkySeraph Apr 1st 2012  Email:[email protected].com 一.MP4格式基本概念 MP4格式对应标准MPEG-4标准(ISO/IEC14496) 二.MP4封装格式核心概念 1  MP4封装格式对应标准为 ISO/IEC 14496-12(信息技术 视听对象编码的第12部分: ISO 基本媒体文件格式/Information technology Coding of a

perl 读取json 格式的文件

使用JSON 模块中的 decode_json 函数,将json文件中的数据解码为perl 中的对象,然后进行处理 代码如下: #!/usr/bin/env perl use JSON; use Encode; my ($json) = @ARGV; my $context; open TXT, $json or die "Can't open $json!\n"; while (<TXT>) { $context .= $_; } close TXT; my $obj =

利用perl批量重命名文件

使用perl自带函数rename可以重命名文件名称,具体用法,rename $old_name, $new_name. 例如,要把文件名中“7--1_F03_2018-12-28.fsa”中的前缀“7--”去除. 1 use strict; 2 3 my $DIR_PATH = "./"; # current directory 4 opendir TEMP, ${DIR_PATH} || die "Can not open this directory"; 5 m

ashx文件中使用session提示“未将对象引用设置到对象的实例”

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Data;using System.Web.SessionState;namespace friends {    /// <summary>    /// Handler 的摘要说明    /// </summary>    public class Handler : IHttpHandler

简单创建json格式文件

简单创建json格式文件 核心就两点: addProperty 添加属性(也就是加键值对) add是添加 另外的object对象 然后直接toString()输出 核心代码如下; public class CreateJson { public static void main(String[] args) { JsonObject object= new JsonObject(); object.addProperty("cat", "it"); JsonArra