如何替换文件列表中特定位置的字符?
How to replace characters at specific positions from a file list?
我有一个包含序列的文件:
>sequence
TAGGACTGAGGGCTGGACAGGGCTGCGGGAG
和另一个包含引用位置的数字:
3
6
11
我想得到一个包含 'N' 的新文件,而不是第二个文件中定义的位置的 A、C、G、T,例如:
>sequence
TANGANTGAGNGCTGGACAGGGCTGCGGGAG
有没有一种方法可以使用 bash awk/sed 或者我应该使用来自 biopython 的 SeqIO 的 python 脚本?
编辑:
这是 python 脚本的开始:
from Bio import SeqIO
import sys
import string
unput1=raw_input("enter sequence:")
unput2=raw_input("enter position file:")
fasta_file=unput1
position_file=unput2
result_file="outfile.fasta"
nb_list=list()
with open(position_file) as f:
for line in f:
line=line.strip()
headerline = line.split()
position=headerline[0]
position_list.add(position)
for record in SeqIO.parse(StringIO(data), "fasta"):
if record.id in nb_list:
seq_record[position_list]="N"
SeqIO.write([seq_record], f, "fasta")
将 awk 与空 FS
结合使用。这可能不适用于每个 awk 版本或任意长的序列:
$ awk 'BEGIN {
FS=OFS="" # process each char as an individual field
}
NR==FNR { # process the numbers file
a[[=10=]] # hash numbers to a hash
next
}
/^[ACGT]/ { # process sequence file
for(i=1;i<=NF;i++) # itetate every field
if(i in a) # if i found in a
$i="N" # replace char with N
}1' no-file seq-file
输出:
>sequence
TANGANTGAGNGCTGGACAGGGCTGCGGGAG
使用 POSIX awk 和 substr()
寻址字符串索引:
awk '
FNR==NR {a[c++] = [=10=]}
FNR!=NR && !/^[[:space:]]*[;>]|^[[:space:]]*$/ {
for (i in a) {
n=a[i]
[=10=] = substr([=10=], 1, n-1) "N" substr([=10=], n+1)
}
}
FNR!=NR' indexes.txt sequence.fasta
我有一个包含序列的文件:
>sequence
TAGGACTGAGGGCTGGACAGGGCTGCGGGAG
和另一个包含引用位置的数字:
3
6
11
我想得到一个包含 'N' 的新文件,而不是第二个文件中定义的位置的 A、C、G、T,例如:
>sequence
TANGANTGAGNGCTGGACAGGGCTGCGGGAG
有没有一种方法可以使用 bash awk/sed 或者我应该使用来自 biopython 的 SeqIO 的 python 脚本?
编辑:
这是 python 脚本的开始:
from Bio import SeqIO
import sys
import string
unput1=raw_input("enter sequence:")
unput2=raw_input("enter position file:")
fasta_file=unput1
position_file=unput2
result_file="outfile.fasta"
nb_list=list()
with open(position_file) as f:
for line in f:
line=line.strip()
headerline = line.split()
position=headerline[0]
position_list.add(position)
for record in SeqIO.parse(StringIO(data), "fasta"):
if record.id in nb_list:
seq_record[position_list]="N"
SeqIO.write([seq_record], f, "fasta")
将 awk 与空 FS
结合使用。这可能不适用于每个 awk 版本或任意长的序列:
$ awk 'BEGIN {
FS=OFS="" # process each char as an individual field
}
NR==FNR { # process the numbers file
a[[=10=]] # hash numbers to a hash
next
}
/^[ACGT]/ { # process sequence file
for(i=1;i<=NF;i++) # itetate every field
if(i in a) # if i found in a
$i="N" # replace char with N
}1' no-file seq-file
输出:
>sequence
TANGANTGAGNGCTGGACAGGGCTGCGGGAG
使用 POSIX awk 和 substr()
寻址字符串索引:
awk '
FNR==NR {a[c++] = [=10=]}
FNR!=NR && !/^[[:space:]]*[;>]|^[[:space:]]*$/ {
for (i in a) {
n=a[i]
[=10=] = substr([=10=], 1, n-1) "N" substr([=10=], n+1)
}
}
FNR!=NR' indexes.txt sequence.fasta