2017-06-21 25 views
3

我有以下兩個文件:

sequences.txt

158333741  Acaryochloris_marina_MBIC11017_uid58167 158333741  432  1  432  COG0001 0 
158339504  Acaryochloris_marina_MBIC11017_uid58167 158339504  491  1  491  COG0002 0 
379012832  Acetobacterium_woodii_DSM_1030_uid88073 379012832  430  1  430  COG0001 0 
302391336  Acetohalobium_arabaticum_DSM_5501_uid51423  302391336  441  1  441  COG0003 0 
311103820  Achromobacter_xylosoxidans_A8_uid59899 311103820  425  1  425  COG0004 0 
332795879  Acidianus_hospitalis_W1_uid66875  332795879  369  1  369  COG0005 0 
332796307  Acidianus_hospitalis_W1_uid66875  332796307  416  1  416  COG0005 0 

allids.txt

COG0001 
COG0002 
COG0003 
COG0004 
COG0005 

現在我想要閱讀allids.txt中的每一行,搜索sequences.txt中的所有行(具體在第7列中),並在中分別編寫一個文件名爲$line的文件。

我的方法是使用一個簡單的grep:

while read line; do 
    grep "$line" sequences.txt 
done <allids.txt 

,但我在哪裏納入命令的輸出? 如果有一個更快的命令,隨時建議!

我的預期輸出:

COG0001.txt

158333741  Acaryochloris_marina_MBIC11017_uid58167 158333741  432  1  432  COG0001 0 
379012832  Acetobacterium_woodii_DSM_1030_uid88073 379012832  430  1  430  COG0001 0 

COG0002.txt

158339504  Acaryochloris_marina_MBIC11017_uid58167 158339504  491  1  491  COG0002 0 

[and so on]

+0

在mysql中導入要快得多,添加一個索引和輸出。 –

+0

mysql對我來說太高級了。我現在已經熟悉'awk'了。 – rororo

+2

你真的需要allids.txt文件嗎?除非有7美元的價值是你特別想要處理的,而放棄其餘的價值,爲什麼不寫下每一行的順序。TXT到基於每行$ 7命名的文件? –

回答

2

我懷疑你真正需要的是:

awk '{print > ($7".txt")}' sequences.txt 

這種懷疑是基於您的ID文件被命名爲allIds.txt(注意全部)並且sequences.txt中不存在allIds.txt中不存在的ID。

+1

這可能是正確的解決方案,猜測他們正在使用其他文件,因爲他們正在刷新整行。 – 123

+1

你的懷疑是對的! – rororo

-1

擴展你的做法,這似乎工作:

while read line; do 
    # touching is not necessary as pointed out by @123 
    # touch "$line.txt" 
    grep "$line" sequences.txt > "$line.txt" 
done <allids.txt 

它生成具有所需輸出的文本文件。但我不能評論這種方法的效率。

編輯

正如已指出了意見,這種方法是緩慢的,將打破對違反在回答中使用的假設條件沒說的任何文件。我要把它留在這裏讓人們看到一個快速而且很冒險的解決方案可能會適得其反。

+3

你不必碰任何東西。關於'但我不能評論這種方法的效率',對每一行運行grep都是非常低效的。 – 123

+1

這也是脆弱的,並會打破各種輸入值。不要這樣做。 –

+1

此外,它不僅在第7個字段中搜索整行,所以可能會產生錯誤的結果。 – anubhava

5

這是非常簡單awk做到這一點:

awk 'NR==FNR{ids[$1]; next} $7 in ids{print > ($7 ".txt")}' allids.txt sequences.txt 

參考:Effective AWK Programming

+0

我得到以下錯誤:awk:源代碼行1的語法錯誤 上下文爲 \t NR == FNR {ids [$ 1];下一個} $ 7 in ids {print> $ 7 >>>「.txt」<<< awk:源代碼行1的非法聲明' – rororo

+0

yes now it works!我總是喜歡一個不錯的'awk' oneliner! – rororo

相關問題