2017-03-21 3 views
0

awkと同じパターンを見つけて、ファイルの末尾にファイルが何回存在するかを示します。 Spiroplasma_culicicolaが7回発生した場合、私はこのようになりますFASTAファイルを持っているしかしたとえば、[次へ最初に出現する、それが次の第3の発生Spiroplasma_culicicola_3などなど行が ">"で始まるパターンを見つけるためにawkを使用し、パターンの出現回数を追加してください。

の隣に2回目の出現Spiroplasma_culicicola_2に、Spiroplasma_culicicola_1を書く必要があります:

>Spiroplasma_taiwanense 
GKGVKYKNEKIIRKEGKAAGKMTTDVIADMLTRIRNANQRFHKEVVIPGSKVKLEIANIL 
KKEGFIEDFKVADDFKKDITISLKYRGKTRVIKGLKRISKPGLRVYSHATEIPQVLNGLG 
IAIVSTSHGIMTDKEARQQNAGGEVLAFVW 
>Spiroplasma_diminutum 
NRLEKQYKEKIVPELFKEKQYKSIMQVPKITKVVINMGIGDAVQDTKKLDDAVLELQQIT 
GQKPLVTKAKKSLAVFKLREGMPIGAKVTLRGKRMYEFLDKLISVALPRVRDFRGVPKTS 
FDKQGNYTMGIKEQIIFPEIDYDKVKKVRGMDITIVTTANQKDEAFSLLQKMGMPFVKMN 
KSKILRGDVVKVIAGSHKGKIGPVVKLSKDKKRVYVEGIVAIK-HAKPSQTDQEGGIREI 
PAGVDISNVSLVDPKVKDSATRVGYKIADGKKVRIAKKSGSEVK-MIQNESRLKVADNSG 
>Spiroplasma_diminutum 
NRLEKQYKEKIVPELFKEKQYKSIMQVPKITKVVINMGIGDAVQDTKKLDDAVLELQQIT 
GQKPLVTKAKKSLAVFKLREGMPIGAKVTLRGKRMYEFLDKLISVALPRVRDFRGVPKTS 
FDKQGNYTMGIKEQIIFPEIDYDKVKKVRGMDITIVTTANQKDEAFSLLQKMGMPFVKMN 
... 

このように、ヘッダーの隣にしか表示されない「タグ」を追加したいと思います!したがって、上記のファイルは、次のようになります。以前に基づいて

>Spiroplasma_taiwanense_1 
GKGVKYKNEKIIRKEGKAAGKMTTDVIADMLTRIRNANQRFHKEVVIPGSKVKLEIANIL 
KKEGFIEDFKVADDFKKDITISLKYRGKTRVIKGLKRISKPGLRVYSHATEIPQVLNGLG 
IAIVSTSHGIMTDKEARQQNAGGEVLAFVW 
>Spiroplasma_diminutum_1 
NRLEKQYKEKIVPELFKEKQYKSIMQVPKITKVVINMGIGDAVQDTKKLDDAVLELQQIT 
GQKPLVTKAKKSLAVFKLREGMPIGAKVTLRGKRMYEFLDKLISVALPRVRDFRGVPKTS 
FDKQGNYTMGIKEQIIFPEIDYDKVKKVRGMDITIVTTANQKDEAFSLLQKMGMPFVKMN 
KSKILRGDVVKVIAGSHKGKIGPVVKLSKDKKRVYVEGIVAIK-HAKPSQTDQEGGIREI 
PAGVDISNVSLVDPKVKDSATRVGYKIADGKKVRIAKKSGSEVK-MIQNESRLKVADNSG 
>Spiroplasma_diminutum_2 
NRLEKQYKEKIVPELFKEKQYKSIMQVPKITKVVINMGIGDAVQDTKKLDDAVLELQQIT 
GQKPLVTKAKKSLAVFKLREGMPIGAKVTLRGKRMYEFLDKLISVALPRVRDFRGVPKTS 
FDKQGNYTMGIKEQIIFPEIDYDKVKKVRGMDITIVTTANQKDEAFSLLQKMGMPFVKMN 
... 

私はこのようなSTHと、AWKを使用する必要があることを考え出し質問に答え: のawk「$ 1〜/ ^>/{GSUB(」 "" "、$ 0); a [$ 0] ++;印刷$ 0「_」[$ 0]}」

(ここから盗まれたコード:find the number of occurences and add it next to the pattern)(-iとsedのように、たとえば)

は、しかし、私は、ファイルの変更を保存する方法を見つけるカントと新しいファイルにリダイレクトすることはできません。単にヘッダーを印刷/保存するだけです。

アイデア?

おかげ P

+0

ので、問題は*しかし、私はファイルの変更を保存する方法を見つけることができません*?パターンマッチングに問題はありませんか? – RomanPerekhrest

+0

上記のawkコマンドは以下を返すので、Spiroplasma_taiwanense_1 Spiroplasma_diminutum_1 Spiroplasma_diminutum_2 – Panos

+0

新しいファイルに出力を書き込むには、ここのような出力リダイレクトを使用しますhttp://stackoverflow.com/questions/14660079/how-to-save-the-output -of-this-awk-command-to-file – RomanPerekhrest

答えて

2

それは問題はあなたが他の場所で発見したコードを理解していないということであるようだ。物事のルックスによって

awk '$1 ~ /^>/ {gsub(" ", "", $0); a[$0]++; print $0"_"a[$0]}' 

を、それはあなたが望む置換を実行し、 >で始まる行を出力します。

欠けている部分は、改行せずに残りの行を印刷することです。

あなたはこのようにそれを行うことができます:

ある
awk '$1 ~ /^>/ { gsub(" ", "", $0); a[$0]++; $0 = $0"_"a[$0] } { print }' 

、最初のブロックでの割り当てにprintを変更し、常にすべてを印刷し無条件第二のブロックを追加します。

インクリメンタルを割り当てと組み合わせて{ print }を共通の略記(デフォルトのアクションの場合は1の条件)に変更すると、コードをさらに単純化できます。

コメントで述べたように、使用する前に正規表現に変換する必要がある文字列ではなく、最初の引数として正規表現リテラルを渡すことで、gsubの呼び出しを改善できます。デフォルトの最後の引数$0を削除することで短縮することもできます。

awk '$1 ~ /^>/ { gsub(/ /, ""); $0 = $0 "_" ++a[$0] } 1' 

だけのオリジナルを上書きし、その後一時ファイルにリダイレクトし、元のファイルを上書きするには、次のコメントで述べたように、

awk '...' input > tmp && mv tmp input 

またはGNU AWKで:

awk -i inplace '...' input 
+0

はいTom I morry、私は本当にawkの経験はありませんが、助けてくれてありがとう! – Panos

関連する問題