Day4--perl上了RStudio的船

作者: 东方不赞 | 来源:发表于2020-03-30 16:00 被阅读0次

RStudio有个terminal,可用Shift+Alt+R新建一个terminal,可在RStudio上创建一个.pl文件

  • ctrl+S保存新建的脚本,后缀为.pl
  • 此后在Rstudio上写代码就可以啦:
    • Ctrl+Enter运行R命令
    • Ctrl+Alt+Enter将代码发送到terminal
    • 在控制台的terminal上,可以用vi哦
  • 控制台的位置为
    • pwd一下,
      • 如果是在rstudio-server上,看到的是自己的Linux环境下的位置
      • 由于我在Windows上也装了Rstudio,所以本地Rstudio打开,位置是/mnt/d/***,此处d是D盘,在mnt目录下面。
  • 在ubuntu下查找windows的文件也可以参照这个
#在ubuntu终端的命令行下
##或在我自己的Rstudio-server上的terminal下
pwd #此时的位置为/home/**
#去D盘
cd /mnt/d/
#回来
cd

话不多说,接着今天的Perl

@ARGV

# 命令行
##perl $0 $ARGV[1] $ARGV[2]
#如
perl 123.pl human.fa save.fa

输入输出

open IN,"<$ARGV[0]";  #输入
open OU,">$ARGV[1]"; #覆盖输出
# open OU,">>$ARGV[1]"; #追加输出

print OU "hello\n";

close IN
close OU

句柄

  • 输入输出句柄
IN
OU
STDIN
STDOUT
STDERR
DATA
ARGV
ARGVOUT
  • 文件句柄<IN>

<IN>介于输入和输出之间,用于摆渡,所以用<>表示。
一次装载一行数据

  • 一次读取并打印一行
#!/usr/bin/perl -w
open IN,"<ARGV[0]", or die "error!!!!!!!!!!!!!";
while(<IN>){
  chomp;
  @line=split /\s+/,$_[1];
  print "@line\n";
}
close IN;
  • 修改默认的字段分割符来读取多行
$/="\n" #默认的字段分隔符
$/=">" #读取一段FASTA  

哈希

哈希hash名字怪怪的,但是挺有用,可以根据key来提取value,而不用担心顺序。就好比于在手机上查单词(key),提取出单词的释义(value)。

  • 赋值
#定义空hash
%hash=();
$hash{"key1"}=value1

#hash赋值
%hash=("key1",value1,"key2",value2,"key3",value3)
#or:
%hash=(
    "key1"=>value1,
    "key2"=>value2,
    -key3=>value3,
    key=>value444
    );
    
#删除
delete $hash{"key1"}
  • 访问
$hash{"key1"};
@keys=keys %hash;
@values=values %hash;
  • 查看
if (exist $hash{"key1"}){
    print "$hash{\"key1\"}\n";
}
  • 遍历
#也可先排序一下sort keys %hash;
foreach(keys %hash){
    print "$_\n";
    print "$hash{$_}\n";
}
#or:
while(($keys,$values)=each %hash){
    print "$keys\n$values\n";
}

小应用:序列提取

已知一堆id,存入A,根据参考基因组B(FASTA格式)的id,提取A中id的序列。

  • 步骤
    • 将A的id存入哈希,
    • 遍历RefSeq的id
      • 判断:如果B.id在A中存在,则存入哈希的value,否则继续
    • 存储结果
  • 代码实现
#!/usr/bin/perl -w
%query_a=();

#提取A的id
open <IN>,"<ARGV[0]";
while (<IN>){
    chomp;
    @query_a{$_}=1;
}
close IN;

#比较B与A,存B序列到%query_A的value
open FA,"<$ARGV[1]";
open OU,">>save.fa";
$/=">";
#将第一行的>的前面的空值过滤掉
<FA>; 
while(<FA>){
    chomp;
    $id_seq=(split /\n/,$_,2);#分成两份,为ID和序列
    if(exist $query_a{$id_seq[0]}){
        $query_a{$id_seq}=$id_seq[1];
        print OU ">$id_seq[0]\n";
        print OU "$id_seq[1]\n";    
    }else{
        next;
    }
}
close FA;

#输出A中那些没匹配到的
@keys=keys @query_a;
@values=values @query_a;

foreach $count (@values){
    if ($count==1);
    print "$keys{$count}\n";
}
print "those id above were not found sequence in RefSeq!!\n\n";

相关文章

网友评论

    本文标题:Day4--perl上了RStudio的船

    本文链接:https://www.haomeiwen.com/subject/uewmuhtx.html