我有一些看起来像这样的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
我想从第二行开始,只申请其他每一行。
答案 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文件上,你也可以调查这种方法。