2016-11-07 25 views
1

何千行もの長さのDNA配列の 'ヘッダー'行内の列/フィールドを変更しようとしています。具体的には、私はヘッダ(compX_seqy)の最初のフィールドを変更したい、これは常に「>」で始まる:AWK - 一致する行の特定の列を置き換えて、他の行を印刷します。

ちょうど最初の2つのシーケンスの例:

#cat example 

>comp0_seq1 444 [12:23] 
AGAGGACAC 
GATCCAACATA 
AGASCAC 
>comp0_seq2 333 [12:32:599:1] 
GTCGATC 
CYAACY 
CCCCA 
... 

は、私が追加したいと最初の列の末尾に「A」が、「>」で始まるすべての行に対して、

comp0_seq1A

は、行の残りの部分を出力して、NEX次の ">"行に到達するまで繰り返されます。

私は、出力は次のようになりたい:

>comp0_seq1A 444 [12:23] 
AGAGGACAC 
GATCCAACATA 
AGASCAC 
>comp0_seq2A 333 [12:32:599:1] 
GTCGATC 
CYAACY 
CCCCA 
... 

私が最初にこれを試してみました:

awk '$1=$1"A"' example 

>comp0_seq1A 444 [12:23] 
AGAGGACACA 
GATCCAACATAA 
AGASCACA 
>comp0_seq2A 333 [12:32:599:1] 
GTCGATCA 
CYAACYA 
CCCCAA 
A 
A 

それは、すべての行の最初のフィールドにAを追加し、そうではない、非常に。

は、その後、私は

# awk '/^>/ {print $1=$1"A";getline;print $0}' example 
>comp0_seq1A 
AGAGGACAC 
>comp0_seq2A 
GTCGATC 

しかし、唯一の試合後の最初の行を表示することを「>」で始まる行だけを交換するために正規表現を使用して、これを試してみました。だから、マッチ/置換後、そして次の ">"までのすべての行を印刷する方法は?私は '次へ'を使用しようとしましたが、この文脈でどのように使用するのか分かりません。

アドバイスはありますか?私は私が近くにいることを知っているし、私のキーボードで頭を叩いている。

Thx、LP。

答えて

3

あなたはほとんどそれを持っています。あなたはgetlineで物事を思っているだけです。

awkでは、次のように動作するはずです:

$ awk '/^>/ {$1=$1"A"} 1' file.txt 

これは正規表現^>に一致するすべての行に中括弧内のコマンドを実行して動作します。最後の1は、 "現在の行を印刷する"というawkの短手です。

この単純なsedを用いることであろう置換するためのもう1つのオプション:

$ sed '/^>/s/ /A /' file.txt 

これは、文字列(/A /)との最初のスペースを置き換え、その後、同じ正規表現と一致する行を検索することで動作します。 sedは、デフォルトで各行を印刷するので、明示的に印刷する必要はありません。

それとも、最初の「フィールド」ではなく最初の「フィールドセパレータ」を代入し、何かを好むならば、これが動作することができます

$ sed 's/^\(>[^ ]*\)/\1A/' file.txt 

デフォルトでは、sed正規表現は「BRE」であるため、グループ化括弧エスケープする必要があります。 \1は、検索正規表現内の最初の(この場合は「のみ」)括弧で囲まれた式への参照です。

+0

sedを使うと、そのファイルにタブがある場合に "空白"文字クラスを使って 'sed '/ ^> [^ [:blank:]] \ +/s //&A /''と書くことができます。 –

+0

すべてのオプションをありがとう。だから、sed/substituteを使ってスペースを追加の文字に置き換えるだけで簡単です。 –

+0

@glennjackman - ああ、 '&'を使うことをお勧めします。私は答えをそのまま残しておきます。それはOPのデータで動作するようですが、コメントをいただきありがとうございます。それは間違いなく類似しているかもしれない他の人々を助けるでしょう。 – ghoti

関連する問題