Chinaunix
标题:
求助小脚本编写
[打印本页]
作者:
kevin_furant
时间:
2017-02-26 09:40
标题:
求助小脚本编写
脚本读入两个文件 lst1和lst2
lst1:
RRA45973,RRA45973,CACTTCGA,,
RRA45974,RRA45974,CAGCGTTA,,
RRA45975,RRA45975,CATACCAA,,
RRA45976,RRA45976,CCAGTTCA,,
RRL06701,RRL06701,ATCCTGTA,,
需求把后面的8个碱基加两个逗号删除,碱基有的时候是6个。
lst2:
ATTACTCG TATAGCCT
ATTACTCG ATAGAGGC
ATTACTCG CCTATCCT
ATTACTCG GGCTCTGA
ATTACTCG AGGCGAAG
要求把中间的空格换成逗号隔开。
写一个脚本把做完修改的两个文件对应行粘到一起,结果就像
RRA45973,RRA45973,ATTACTCG,TATAGCCT
.
.
.
请教各位大神应该怎么写,小弟初学,自己写的运行起来有问题。
作者:
sunzhiguolu
时间:
2017-02-26 13:43
能否将你的要求说的详细一点,对生物信息的知识比较匮乏。另外,将希望得到的结果提出来。
作者:
kevin_furant
时间:
2017-02-26 14:02
回复
2#
sunzhiguolu
就是说lst1那个文件每行的最后两个逗号加上【ATGC】组成的8个(有的时候是六个)字符我要把它删了,替换成list2中的相应行,但是list2中的每行要把中间的空格换成逗号,最终的结果就是我贴子上已经粘的那个结果,只不过我只是贴了一行,已知lst1和lst2这两个文件行数是一样的,有多少行就输出多少个合并后的行。
作者:
kevin_furant
时间:
2017-02-26 14:10
回复
2#
sunzhiguolu
lst1每行改完后的结果就像这样:RRA45973,RRA45973,
lst2每行改完后的结果就像这样:ATTACTCG,TATAGCCT
最终希望的结果是把这两行粘成一行
RRA45973,RRA45973,ATTACTCG,TATAGCCT
lst1中有多少行就打印出多少行。
作者:
moperyblue
时间:
2017-02-26 14:25
paste -d '' <(sed 's/\w*,*$//' lst1) <(sed -r 's/\s+/,/' lst2)
复制代码
?
作者:
kevin_furant
时间:
2017-02-26 14:35
回复
5#
moperyblue
因为这是这两个文件的一部分,如果只是用paste命令用正则的话会把一些不需要修改的地方也改了,我粘出来的只是这两个文件需要修改的部分。所以我还是希望能有一个只是针对上面我给出的两个文件的小脚本。
作者:
moperyblue
时间:
2017-02-26 17:44
回复
6#
kevin_furant
可以只针对符合条件的记录修改后 再 连接起来
作者:
华小飞_Perl
时间:
2017-02-26 18:04
感觉怎么像index
作者:
kevin_furant
时间:
2017-02-26 18:09
回复
8#
华小飞_Perl
其实就是index,拆分双端index的时候有些东西需要改,显得麻烦所以就想搞一搞。楼上的方法其实就能实现,不过我正在学perl,我想看一下别人怎么写的 为什么我自己写的不能达到效果。
作者:
华小飞_Perl
时间:
2017-02-26 19:04
回复
9#
kevin_furant
楼上大神们的建议很不错,双端拆分的话应该是miseq / nextseq / miniseq平台的下机数据咯~
作者:
华小飞_Perl
时间:
2017-02-26 19:04
回复
9#
kevin_furant
楼上大神们的建议很不错,双端拆分的话应该是miseq / nextseq / miniseq平台的下机数据咯~
作者:
sditmaner
时间:
2017-02-26 20:03
回复 8# 华小飞_Perl
作者:
华小飞_Perl
时间:
2017-02-26 20:04
中规中矩的写一个:
#!/usr/bin/perl
use warnings;
use strict;
open FILE_1, '<', 'lst1.txt' or die "Error 1 occured: $!";
open FILE_2, '<', 'lst2.txt' or die "Error 2 occured: $!";
my (@sample, @index, $sample, $index);
while (<FILE_1>) {
chomp;
if (/^(\w+),(\w+)/m) {
$sample = $1.",".$2;
push @sample, $sample;
}
}
while (<FILE_2>) {
chomp;
my @med = split;
$index = join ",", @med;
push @index, $index;
}
while (@sample) {
my $sig_smp = shift @sample;
my $sig_index = shift @index;
my $combine = $sig_smp.",".$sig_index;
print $combine, "\n";
}
复制代码
作者:
kevin_furant
时间:
2017-02-27 13:50
谢谢,不过我自己写的也搞定了,
#! usr/bin/perl
@ARGV ||die "can not open the file!\n";
open (my $fh_1, "< $ARGV[0]");
open (my $fh_2, "< $ARGV[1]");
my %hash;
my @arr;
while (<$fh_1>){
chomp;
s/[ATGC]{6,8},,//;
@arr = split /,/;
chomp(my $lst2 = <$fh_2>);
my ($idx) = grep s/\s+/,/, ($lst2);
push @arr, $idx;
$hash{$arr[0]} = [@arr];
print join(",",@{$hash{$arr[0]}}),"\n";
}
close $fh_1;
close $fh_2;
写得烂但是运行没发现问题。
作者:
kevin_furant
时间:
2017-02-27 14:07
回复
10#
华小飞_Perl
是illunina hiseq4000的数据
作者:
kevin_furant
时间:
2017-02-27 14:09
回复
7#
moperyblue
是的,我第一次就是这么干的,因为在学perl,所以想找个东西练练手。
作者:
华小飞_Perl
时间:
2017-02-27 20:29
kevin_furant 发表于 2017-02-27 14:07
回复 10# 华小飞_Perl
是illunina hiseq4000的数据
原来这样 数据量有点大 要考虑脚本性能
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2