[英]How to extract specific parts of a reference text, based on a list of identifiers?
我有一個參考文件 (.fasta) 和一個基因 ID 列表。 對於基因ID列表中的每個ID,我需要將對應的序列放入一個文本文件中。 我怎樣才能自動化呢?
到目前為止我嘗試過的事情:
sed -n -e '/{GENEID1}/,/>/p' referencefile.fasta | sed $d >> seqs.txt
'>' 是我希望 sed 停止的字符。 我需要第二個 sed 來刪除最后一行,這也抓住了下一個序列的第一行。 如果我只運行一次,這有效,但如果我嘗試
cat geneID.txt | xargs sed -n -e '/{}/,/>/p' referencefile.fasta >> seqs.txt
然后我只得到一個 ID 列表,沒有序列。 它也需要很長時間,所以我假設 sed 正在閱讀參考文件,但我不明白為什么它不會抓取序列?
grep -o -P '(?={GENEID}).*(?=>)
在這里我有同樣的問題 - 單獨工作,但不適用於 xargs 或循環。
使用 for 循環
for LINE in $(cat geneIDs.txt); do echo $LINE >> seqs.txt sed -n -e '/$LINE/,/>/p' referencefile.fasta | sed $d >> seqs.txt done
我也願意在 python 中嘗試一些東西,盡管我還不是很精通它。 我的初步嘗試是基於這里的這個問題。 我有一個 10 行的測試 ID 列表,我嘗試這樣運行:
t = open('test.txt', 'r')
test = t.readlines()
test = test.split()
t.close()
with open('referencefile.fasta', 'r') as ref:
for line in ref:
for i in test:
if i in line:
print(line)
這一個,我什至無法從參考文件中獲得序列,無論循環如何。
大家能看出問題嗎? 為什么這些都不會給我序列?
提前致謝!
編輯添加:
示例參考:
>000000F
ctatcttcgaggttgccacctgtatcgaggagttggcgtctagatcacgaacatgtattttagctatcgtgagctcacacctgacggatccagctttcgaggtcacatcctcaagtctcg
>000001F
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
>000002F
TGCGTGAGGTGCTAGGGATGACAATTGAAAAGAGGACATTGATCGATCACTTGACTCATTTCAGAAAGGAGTTTGGGTTGTCCAACAAGTTGAGGGGGATGATCATCAGGCATCCTGAGT
測試 ID:000000F、000001F
理想結果:
000000F ctatcttcgaggttgccacctgtatcgaggagttggcgtctagatcacgaacatgtattttagctatcgtgagctcacacctgacggatccagctttcgaggtcacatcctcaagtctcg
000001F NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
當前結果:
000000F 000001F
如果您的 fasta 文件中的一個geneId 后面總是有一行,這將有所幫助:
grep -A1 -Fwf geneIds.txt input.fasta
檢查這個例子:
$ head -n 20 *
==> ids.txt <==
000000F
000001F
==> input.fasta <==
>000000F
Yes I want it!
>000001F
Yes I want it too!
>000002F
skip
>00000XYZ
skip
kent$ grep -A1 -Fwf ids.txt input.fasta
>000000F
Yes I want it!
--
>000001F
Yes I want it too!
取決於大小和訪問模式以及您可以使用的其他序列,因為它可能是最簡單的構建一個 BLAST 數據庫,然后將您的標識符提供給它,它會准確返回您要求的內容(格式正確的 FASTA 除外)。
優點是它設計精良,經過測試且速度快
缺點是對你的任務來說可能是多余的
(但如果您將繼續在這個領域工作,仍然非常有用)
鑒於:
$ cat file
>000000F
ctatcttcgaggttgccacctgtatcgaggagttggcgtctagatcacgaacatgtattttagctatcgtgagctcacacctgacggatccagctttcgaggtcacatcctcaagtctcg
>000001F
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
使用awk
您可以在段落模式下讀取由兩個或多個\n
分隔的數據。 這使您可以輕松地以該格式構建文件的關聯數據庫。
示例,按確切字符串搜索:
awk -v RS= -v FS="\n" -v q=">000000F" '$1==q{print $2}' file
ctatcttcgaggttgccacctgtatcgaggagttggcgtctagatcacgaacatgtattttagctatcgtgagctcacacctgacggatccagctttcgaggtcacatcctcaagtctcg
或通過正則表達式搜索:
awk -v RS= -v FS="\n" -v q="[01]F$" '$1~q {print $2}' file
ctatcttcgaggttgccacctgtatcgaggagttggcgtctagatcacgaacatgtattttagctatcgtgagctcacacctgacggatccagctttcgaggtcacatcctcaagtctcg
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
或者,構建一個關聯數組:
awk -v RS= -v FS="\n" '{arr[$1]=$2} END{ "do something with the data in arr" }' file
您可以使用它從具有 id 列表的文件中打印:
cat ids
>000001F
>000000F
awk -v RS= -v FS="\n" 'FNR==NR{for(i=1; i<=NF; i++) ids[$i]; next}
$1 in ids{print $2}' ids file
ctatcttcgaggttgccacctgtatcgaggagttggcgtctagatcacgaacatgtattttagctatcgtgagctcacacctgacggatccagctttcgaggtcacatcctcaagtctcg
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.