3

我有一些看起来像这样的 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

我只想从第二行开始申请。

4

6 回答 6

5

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

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
$ 
于 2015-05-13T23:11:29.000 回答
4

你可以试试

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

0~2 每第二行取一次

^.\{15\}

查找前 15 个字符

sed 命令将它们替换为空!

于 2015-05-14T05:28:14.510 回答
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
于 2015-05-13T22:53:52.663 回答
0

您需要擦除文件 fasta 的第一个碱基并进行分析,而我使用QIIME找到了一个解决方案,一个使用 python 和 biopython 的解决方案:

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 个碱基,修剪最后一个碱基,否则会超出预期。

于 2015-05-13T23:39:42.787 回答
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 - 车道,

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

哦,

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

适用于任何 linux/unix 机器,也适用于 cygwin。


文件格式似乎是FASTA,此处描述为FASTA 规范

于 2015-05-13T23:45:16.880 回答
0

单线替代sedawk.

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

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

由于awk使用基于 1 的索引,因此起始位置参数 insubstr()为 16。

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

因此,如果您计划大量执行此操作或“全基因组”规模的文件,您也可以研究这种方法。

于 2015-05-14T20:45:42.637 回答