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目录下面。
- pwd一下,
- 在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";
网友评论