2013-12-10 260 views
0

我是一個生物學家,開始必須學習一些基本的腳本技能來處理大型DNA序列數據集。所以請對我輕鬆點。我在bash中完成了這一切。我有此格式我的數據文件:for循環和如果在awk語句

CLocus_58919_Sample_25_Locus_33235_Allele_0 
TGCAGGTGCTTCCAGTTGTCTTTGTAGCGTCCCACCATGATCTGCAGGTCCTTG 
CLocus_58919_Sample_9_Locus_54109_Allele_0 
TGCAGGTGCTTCCAGTTGTCTTTGTAGCGTCCCACCATGATCTGCAGGTCCTTG 

我需要的是做的是循環遍歷該文件,並從同一樣品的所有序列寫入自己的文件。只是要清楚,這些序列來自樣品25和9。所以我的想法是用awk格式化我的文件中按以下方式:

CLocus_58919_Sample_25_Locus_33235_Allele_0_TGCAGGTGCTTCCAGTTGTCTTTGTAGCGTCCCACCATGATCTGCAGGTCCTTG 
CLocus_58919_Sample_9_Locus_54109_Allele_0_TGCAGGTGCTTCCAGTTGTCTTTGTAGCGTCCCACCATGATCTGCAGGTCCTTG 

然後通過管道進入另一個AWK這個if語句,如果樣品說」 = $然後我寫出來的是整條生產線,以一個文件名爲sample $我」這是我到目前爲止的代碼:

#!/bin/bash 

a=`ls /scratch/tkchafin/data/raw | wc -l`; 
b=1; 
c=$((a-b)); 

mkdir /scratch/tkchafin/data/phylogenetics 

for ((i=0; i<=$((c)); i++)); do 
    awk 'ORS=NR%2?"_":"\n"' $1 | awk -F_ '{if($4==$i) print}' >> /scratch/tkchafin/data/phylogenetics/sample.$i 
done; 

我明白這是行不通的,因爲$i是單引號這樣的bash是不承認它。我知道awk有一個-v選項用於將外部變量傳遞給它,但我不知道如何在這種情況下應用該選項。我試圖在awk聲明中移動for循環,但是這不會產生所需的結果。任何幫助將非常感激。

+0

我的perl使用經驗有限。問題是我非常大的管道的其餘部分已經寫成bash。 – user3087875

+0

我知道學習曲線看起來更加令人生畏,但這是一個非常適合perl字符串解析的問題。您可以通讀這些行並將您需要的數據收集到字符串數組的散列中,例如 $樣品{ 'CLocus_58919_Sample_25'=> { 'Locus_33235_Allele_0'=> 'TGCAGGTGCTTCCAGTTGTCTTTGTAGCGTCCCACCATGATCTGCAGGTCCTTG', '一些其他locaus AMD等位基因'=> 'DNA序列' } } 一旦這樣做了遍歷和寫入文件/文件會相對容易 –

+0

previouse評論真的沒有出來我想要的方式,對不起。 您仍然可以使用您擁有的bash腳本。只需爲它的這一部分調用一個perl腳本即可。 –

回答

1

你可以awk直接寫入所需的輸出文件,無殼循環:

awk -F_ '(NR % 2) == 1 { line1 = $0; fn="/scratch/tkchafin/data/phylogenetics/sample."$4; } 
     (NR % 2) == 0 { print line1"_"$0 > fn; }' "$1" 

而是要表明你將如何在你的版本中使用-v,這將是:

for ((i=0; i<=$((c)); i++)); do 
    awk 'ORS=NR%2?"_":"\n"' $1 | awk -F_ -v i=$i '$4 == i' >> /scratch/tkchafin/data/phylogenetics/sample.$i 
done; 
+0

非常感謝。這正是我所需要的。我以爲我曾試過這件事,但顯然不是。 – user3087875