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

  1. 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
中规中矩的写一个:
  1. #!/usr/bin/perl

  2. use warnings;
  3. use strict;

  4. open FILE_1, '<', 'lst1.txt' or die "Error 1 occured: $!";
  5. open FILE_2, '<', 'lst2.txt' or die "Error 2 occured: $!";

  6. my (@sample, @index, $sample, $index);
  7. while (<FILE_1>) {
  8.         chomp;
  9.         if (/^(\w+),(\w+)/m) {
  10.                 $sample = $1.",".$2;
  11.                 push @sample, $sample;
  12.         }       
  13. }

  14. while (<FILE_2>) {
  15.         chomp;
  16.         my @med = split;
  17.         $index = join ",", @med;
  18.         push @index, $index;
  19. }

  20. while (@sample) {
  21.         my $sig_smp = shift @sample;
  22.         my $sig_index = shift @index;
  23.         my $combine = $sig_smp.",".$sig_index;
  24.         print $combine, "\n";
  25. }
复制代码

作者: 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