从文件中的每个其他行中删除前15个字符

时间:2015-05-13 22:12:33

标签: bash unix terminal bioinformatics qiime

我有一些看起来像这样的txt文件(它们包含DNA序列和样本代码):

>SRR1502445.1
GACTACACGTAGTATACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCAACACAGGGGGATAGGNNNNNNNNNNNNNNNNNNNNNNN
>SRR1502445.2
GACTACACGTAGTATACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNN
>SRR1502445.3
GACTACACGTAGTATACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNN
>SRR1502445.4
GACTACACGTAGTATACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNNNNNNNNNN

我想删除文件中每隔一行的前15个字符。这将从第二行,第四行,第六行,第八行(等)中删除字符串GACTACACGTAGTAT

例如,cut命令可以删除每一行的前15个字符:

cut -c 1-15 /path/to/file.txt

我想从第二行开始,只申请其他每一行。

6 个答案:

答案 0 :(得分:5)

如果您不介意使用sed并假设其他行以>开头,则以下内容将删除前15个连续的大写字符" A-Z"其他行:

sed 's/^[A-Z]\{15\}//' file > new_file

或者,就地编辑(GNU sed)使用-i

sed -i 's/^[A-Z]\{15\}//' file

或者,就地编辑(BSD sed)使用-i ''

sed -i '' 's/^[A-Z]\{15\}//' file

或者,支持它:

sed -i.bak 's/^[A-Z]\{15\}//' file

示例:

$ cat file
>SRR1502445.1
GACTACACGTAGTATACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCAACACAGGGGGATAGGNNNNNNNNNNNNNNNNNNNNNNN
>SRR1502445.2
GACTACACGTAGTATACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNN
>SRR1502445.3
GACTACACGTAGTATACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNN
>SRR1502445.4
GACTACACGTAGTATACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNNNNNNNNNN
$ sed 's/^[A-Z]\{15\}//' file
>SRR1502445.1
ACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCAACACAGGGGGATAGGNNNNNNNNNNNNNNNNNNNNNNN
>SRR1502445.2
ACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNN
>SRR1502445.3
ACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNN
>SRR1502445.4
ACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTTGAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTGGAAGCGGGTTCCAAGGCACACAGGGGATAGGNNNNNNNNNNN
$ 

答案 1 :(得分:4)

你可以尝试

  

sed '0~2s/^.\{15\}//g' filename

     

0~2每隔一行

     

^.\{15\}

     

查找前15个字符

     

sed命令替换它们什么都没有!

答案 2 :(得分:0)

以下脚本可能会对您有所帮助,它需要两个参数: 1.原始文件(从中进行转换) 2.文件保存结果的位置。

#!/bin/bash
# call this script and pass two arguments:
# ./script FROM_FILE TO_FILE
FROM=$1
TO=$2

i=1;
while IFS=$'\n' read line; do
    ((i++)); 
    # skip 2,4,6, ..., nth lines 
    [ $((i % 2)) -eq 0 ] && (echo -n $line >> $TO; continue);
    echo ${line:15} >> $TO
done < $FROM

答案 3 :(得分:0)

你需要删除文件fasta和qual的分析的第一个基础,而我找到一个使用python和biopython的解决方案 QIIME

from Bio import SeqIO

file_fasta = open("test.fasta")
file_qual = open("test.qual")

iterator_fasta = SeqIO.parse(file_fasta, "fasta")
iterator_qual = SeqIO.parse(file_qual, "qual")

size_trim = 15

output_fasta = open("trim.fasta","w")
for seq in iterator_fasta:
  if len(seq) <= size_trim:
    raise NameError('len seq less or equal than trim size')
  seq.seq = seq.seq[size_trim:]
  output_fasta.write(seq.format("fasta"))

output_fasta.close()

output_qual = open("trim.qual","w")
for seq_qual in iterator_qual:
  if len(seq_qual.letter_annotations['phred_quality']) <= size_trim:
    raise NameError('len qual less or equal than trim size')
  seq_qual.letter_annotations['phred_quality'] = seq_qual.letter_annotations['phred_quality']
  output_qual.write(seq_qual.format("qual"))

output_qual.close()

你进入了trim.fasta

>SRR1502445.1
ACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTT
GAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTG
GAAGCGGGTTCCAAGGCAACACAGGGGGATAGGNNNNNNNNNNNNNNNNNNNNNNN
>SRR1502445.2
ACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTT
GAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAGACGGTTGG
AAGCGGGTTCCAAGGCACACAGGGGATAGGNNN
>SRR1502445.3
ACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTT
GAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTG
GAAGCGGGTTCCAAGGCACACAGGGGATAGGNNN
>SRR1502445.4
ACGAGTGCGTTCCTGCGCTTATTGATATGCTTAAGTTCAGCGGGTAGTCTCACCCGATTT
GAGGTCAAGGTTTGTGGGTCGAGTCACAACTCGAACATCGTCTTTGTACAAAGACGGTTG
GAAGCGGGTTCCAAGGCACACAGGGGATAGGNNNNNNNNNNN

修改

使用qiime,我建议使用split_libraries,它会修剪并检查质量.... truncate_fasta_qual_files.py只选择前B个碱基,修剪最后一个碱基,否则预期。

答案 4 :(得分:0)

使用正则表达式和perl或awk,

perl(编写脚本,并将其展开以检测其他正则表达式,

my $pattern=$ARGV[1]||"GACTACACGTAGT";
#provide any gene sequence prefix, and pattern removes that prefix
while (<>) {
    #explicit check for non-gene/header pattern
    if( $_ =~ /^[\>\;]/ ) {
        print $_;
    }
    #check for the specific header pattern provided, for example
    elsif( $_ =~ /^SRR1502445/ ) {
        print $_;
    }
    #check for the gene pattern given
    elsif( $_ =~ /^$pattern(.*)/ ) {
        print "$1\n";
    }
    else {
        print $_;
    }
}

perl -lane,

perl -lane 'if( $_ =~ /^GACTACACGTAGT(.*)/ ) {print "$1\n";} else {print $_; }'

AWK,

/SRR1502445/ { print $0; }
/^GACTACACGTAGTAT/ { print substr($0,16); }

适用于任何linux / unix盒子,也适用于cygwin。

文件格式似乎是FASTA,此处描述FASTA Specification

答案 5 :(得分:0)

sed的单行代替awk

给定一个名为foo.fa的交替排列元素FASTA文件,您可以使用substr()删除序列字符串的前15个字符:

$ awk '/^#/ {next} /^>/ { print $0 } /^[^>]/ { print substr($0, 16, length($0) - 15) }' foo.fa > foo.filtered.fa

由于awk使用从1开始的索引,substr()中的起始位置参数为16。

除了提供单独处理交替行的代码之外,awk的另一个优点是它有时可以比sed运行得更快。另一个优点是可移植性,考虑到常见生物信息学平台之间sed的差异。

因此,如果你打算这么做或者在全基因组&#34; -scale文件上,你也可以调查这种方法。