簡體   English   中英

如何根據標識符列表提取參考文本的特定部分?

[英]How to extract specific parts of a reference text, based on a list of identifiers?

我有一個參考文件 (.fasta) 和一個基因 ID 列表。 對於基因ID列表中的每個ID,我需要將對應的序列放入一個文本文件中。 我怎樣才能自動化呢?

到目前為止我嘗試過的事情:

  1. sed

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 正在閱讀參考文件,但我不明白為什么它不會抓取序列?

  1. grep

grep -o -P '(?={GENEID}).*(?=>)

在這里我有同樣的問題 - 單獨工作,但不適用於 xargs 或循環。

  1. 使用 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 除外)。

優點是它設計精良,經過測試且速度快

缺點是對你的任務來說可能是多余的

(但如果您將繼續在這個領域工作,仍然非常有用)

https://duckduckgo.com/?q=build+a+blast+database&ia=web

鑒於:

$ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM