2016-04-02 16 views
1

ile her bir örneğinin değiştirilmesi .fasta dosyalarında hızlı bir arka plan, ilk satırdan başlayarak her satır > ile başlar, daha sonra başlık adına sahip oluruz. Dosyada > bulabileceğiniz başka yer yok. Bazen 2 fasta dosyasını birleştirmek benzersiz olmayan başlık isimlerine yol açabileceğinden, her başlık adını benzersiz kılan basit bir betik istedim."> {InstanceNumber} _"

for i in {1..4013}; do awk '/>/{c++;if(c=='"$i"'){sub(">",">'"$i"'_")}}1' Combined_Pass_2D_nanocorrect_round1_renamed.fasta > tmp.fasta; \ 
rm -rf Combined_Pass_2D_nanocorrect_round1_renamed.fasta; \ 
mv tmp.fasta Combined_Pass_2D_nanocorrect_round1_renamed.fasta; done 

Muhtemelen bu yaş sürmesi sizi tahmin edebilirsiniz, ama hile yapar:

ben var. Başlıkların sayısını bulmak için grep -c kullandım ve 4013 olduğunu belirledim.

Daha hızlı bir yol var mı?

+0

Aynı örnek satırları, dönüşümden önce neye benzediklerini ve dönüşümden sonra nasıl görünmeleri gerektiğini ekleyebilir misiniz? –

+0

Sadece metin işlemek için bir kabuk döngüsü yazdığınızda, yanlış yaklaşma vardır. Http://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice sayfasına bakın. –

cevap

5

Yaklaşımınız, her bir değiştirme için tüm fasta dosyasından geçer. Böyle bir giriş dosyası için:

>header 
ATGC 
>another header 
TACG 
>and still another header 
ATCG 

Sen awk doğrudan kullanabilirsiniz:

$ awk '/^>/{sub(/^>/, sprintf(">%04d_", ++i))}1' infile.fasta 
>0001_header 
ATGC 
>0002_another header 
TACG 
>0003_and still another header 
ATCG 

Ben sayıya sıfır dolgu ekledik. Eğer bunu istemiyorsan, 04'u sprintf ifadesinden kaldırmalısın. Bir satır > ile başlarsa

Bu komut sadece kontrol eder ve eğer, bu, bir sayacı > için ekler, bir alt ekler ve satır (komutun sonunda yalnız 1) basar.