2012-02-15 5 views
0

私はこのようなファイルを持っている:>で始まる行を> awkコマンドで同じ行の15列に置き換えるには?

私はその第15回コラムで >で始まるすべての行を置き換えたい
>gi|358482566|ref|NW_003766328.1| Gallus gallus breed Red Jungle fowl, inbred line UCD001 unplaced genomic scaffold, Gallus_gallus-4.0 ChrUn_7180000961607, whole genome shotgun sequence 
TCTGTCTCTTGTCACTGTATTGTAGTGTGAACCCCTTAAAGGGAAGACCTGCTCTCCTTTGAAAATGCTT 
GCTCATCTATATGCCTCATGCATACCCTCACTGGCAAAGGAGAGCTGAAGTAATTTTAGGACAGAGGAGT 
ACTAGATTGTA 
>gi|358482565|ref|NW_003766329.1| Gallus gallus breed Red Jungle fowl, inbred line UCD001 unplaced genomic scaffold, Gallus_gallus-4.0 ChrUn_7180000961609, whole genome shotgun sequence 
TTTGACCAATGCATTTCAGCATGTTTTTTGACACTAGGTATGCCATTTGGGATGACAATATCAGTTTCCA 
TTTCCATTAGAGGAAAATAAGGTT 

。私が知らないことは、行を列で置き換える方法です。その行のすべての列を15行目に置き換えようとしていました。

ので、私が出力されたとして持っていることを期待するもの:

 >ChrUn_7180000961607 
    TCTGTCTCTTGTCACTGTATTGTAGTGTGAACCCCTTAAAGGGAAGACCTGCTCTCCTTTGAAAATGCTT 
    GCTCATCTATATGCCTCATGCATACCCTCACTGGCAAAGGAGAGCTGAAGTAATTTTAGGACAGAGGAGT 
    ACTAGATTGTA 
    >ChrUn_7180000961609 
    TTTGACCAATGCATTTCAGCATGTTTTTTGACACTAGGTATGCCATTTGGGATGACAATATCAGTTTCCA 
    TTTCCATTAGAGGAAAATAAGGTT 

これらは私のコマンドです:

awk '{if ($1 ~ />/) for (i=1; i<=19; i++) gsub ($i, $15)}' 
test.fa 

私はこれを使用するとき、私は私が望むものではないファイルにいくつかの変更を取得しますが、 !!カラム15は取り外される!

awk '{if ($1 ~ />/) for (i=1; i<=19; i++) a= $15 gsub($i, a)}' 
gga_ref_Gallus_gallus-4.0_unplaced.fa 

これを使用すると、このエラーが発生します。

awk: (FILENAME=gga_ref_Gallus_gallus-4.0_unplaced.fa FNR=1) fatal: sub_common: buf: can't allocate 521711124992 bytes of memory (Cannot allocate memory) 

はので、私は、2つの第15回コラムと * >で始まる行LL * を交換で欲しいと私はしたいものをまだ初め>持っています!

+0

気にしますか?フィールドの一部であっても、サンプル出力には表示されません。 –

+0

パイプで区切られたデータではありませんか?フィールドについて話している場合は、別のフィールドセパレータが必要です。また、このためにperlを使用する方がずっと簡単でしょうか? – tchrist

+0

@tchristデータを見ると、空白で区切られたフィールドのようです。私も最初は混乱していました。 awkではそれほど簡単ではないので、perlでもっと簡単にできるとは思えません。 –

答えて

2

私は、これはあなたがやりたいだろうと思う:

awk '$0 ~ /^>/ { print ">" $15; next } 1' 

それは>変わらないと始まらないすべての行を残します。これは、nextを使用して、>で始まる行の場合に次のレコードにスキップするようにawkに指示することによって達成されます。 1は常に真であるため、>で始まらない行に対しては、行を印刷するデフォルトの動作が呼び出されます。

+0

どのような線量1を教えていただけますか? – mahmood

+0

@mahmood答えに編集されました。十分に明確でない場合は教えてください。 –

+0

@mahmoodを '1'の代わりに使うと、' {print} 'と言うルールを持つことができます。 –

0

これはあなたのために働くかもしれません:あなたは15日、フィールドの一部であるカンマについて

sed 's/^\(\s*\)>\(\S*\s*\)\{15\}.*/\1\2/;s/,\s*$//' file 
関連する問題