2012-11-13 60 views
0

我有一個文件(fasta),我使用awk從(帶有標題的序列)中提取所需的字段。然後,我將它傳給一個BLAST程序,最後我將它傳遞給qsub以提交一份工作。 文件:如何使用awk和條件管道提交qsub作業?

>sequence_1 
ACTGACTGACTGACTG 
>sequence_2 
ACTGGTCAGTCAGTAA 
>sequence_3 
CCGTTGAGTAGAAGAA 

和命令(工作):

awk < fasta.fasta '/^>/ { print $0 } $0 !~ /^>/' | echo "/Local/ncbi-blast-2.2.25+/bin/blastx -db blastdb.fa -outfmt 5 >> /User/blastresult.xml" | qsun -q S 

我希望做的是一個補充,將採樣的就業人數的條件,我跑(使用qstat命令)如果它低於某個閾值,則會提交工作。 例如:

allowed_jobs=200 #for example 
awk < fasta.fasta '/^>/ { print $0 } $0 !~ /^>/' | echo "/Local/ncbi-blast-2.2.25+/bin/blastx -db blastdb.fa -outfmt 5 >> /User/blastresult.xml" | cmd=$(qstat -u User | grep -c ".") | if [ $cmd -lt $allowed_jobs ]; then qsub -q S 

不幸的是(對我來說反正)我失敗了,我都嘗試做到這一點。 我會任何幫助

編輯感激:闡述了一下: 什麼,我試圖做的是從FASTA文件中提取此:

>sequene_x 
ACTATATATATA 

或基本上是:>頭\ nSEQUENCE 一個接一個,並將其傳送到可以採用stdin的blast程序。我想爲每個序列創建一個獨特的作業,這就是我想爲每個序列輸入qsub的原因。 說白了的qsub提交本來看起來是這樣的:

qsub -q S /Local/ncbi-blast-2.2.25+/bin/blastx -db blastdb.fa -query FASTA_SEQUENCE -outfmt 5 >> /User/blastresult.xml 

注意,如果標準輸入序列通過管道輸送到它的-query標誌是不必要的。然而,對我來說,主要問題是如何合併我上面提到的條件,以便只有當qstat結果低於閾值時纔會將序列傳送到qsub。理想情況下,如果qstat結果高於閾值,它會睡覺,直到我低於,然後傳遞它。

謝謝。

+0

如果'qsub'在後臺運行,你不能只用'ps ax | grep -wc'[q] sub''?或者,比僅僅不運行作業更好,爲什麼不將它們提交到隊列中,然後編寫一個隊列運行器,在前200個作業中生成'qsub',然後在舊作業完成時生成新實例?當然,這將是一個完全不同的問題。 – ghoti

+4

您的第一個awk調用不會進行過濾:它會打印整個文件,就像cat一樣。實際上,根本不使用awk命令的輸出:echo命令不會從標準輸入(本例中爲管道)獲取輸入。也許,你告訴我們你試圖完成什麼:輸入是什麼樣的,輸出應該是什麼。 –

+0

@HaiVu我在上面添加了一些關於我的問題的更多信息。謝謝。 –

回答

0

外殼的該位讀取兩條線,把結果打印到標準輸出和管道到您的qsub命令

while IFS= read -r header; do 
    IFS= read -r sequence 
    printf "%s\n" "$header" "$sequence" | 
    qsub -q S /Local/ncbi-blast-2.2.25+/bin/blastx -db blastdb.fa -outfmt 5 >> /User/blastresult.xml 
done < fasta.fasta 
+0

謝謝你。然而,我的問題是,我在向管道添加一個條件時會遇到問題,該條件將檢查用戶正在運行的作業數量,並且只會在低於閾值時將命令傳遞給qsub。 –

2

你好,我想這是因爲長今回答。

我只是提供一種方法來解決這個問題,通過計算應該被處理的行(序列),然後將它傳遞給awk,awk片斷將返回回顯時間,以工作

#!/bin/bash 
ct=`grep -c '^>' fasta.fasta` 
if [ $ct -lt 201 ] ; then 
    echo time to work 
else 
    echo too much 
fi 
+0

感謝您的嘗試。然而,這不是我的問題。我正在尋找一種方法來發送序列,以qsub爆炸。你的回答沒有解決這個問題。 –