2017-11-02 9 views
2

AWKの使用新しい "id"が表示されたときにナンバリングが再開される点を除いて、 3列目($ 3)。 '{print $0 "\t" $3"-exon-"NR}'番号エクソン1から20 フィールド$ 3(つまり、497097、19888、20671、18777、および58175)の新しいIDごとに番号付けを再開したい。このファイルの場合、すべてのID番号は隣接する行にあります。私は$ 6をコードしようとしている書式の例を書いています。私の実際のファイルは25万行以上で、さらに多くのフィールドを持っています。私はこれが本当に簡単だと思っていますが、私は正しい解決策を見つけることができませんでした。
ありがとうございます!

chr gene id start stop exon_number 
1 Xkr4 497097 3216021 3216967 497097-exon-1 
1 Xkr4 497097 3421701 3421900 497097-exon-2 
1 Xkr4 497097 3670551 3671347 497097-exon-3 
1 Rp1 19888 4344599 4350090 19888-exon-1  
1 Rp1 19888 4351909 4352080 19888-exon-2 
1 Rp1 19888 4352201 4352824 19888-exon-3 
1 Sox17 20671 4491715 4492667 20671-exon-1 
1 Sox17 20671 4493099 4493405 20671-exon-2 
1 Lypla1 18777 4807913 4807981 18777-exon-1 
1 Lypla1 18777 4808454 4808485 18777-exon-2 
1 Lypla1 18777 4828583 4828648 18777-exon-3 
1 Lypla1 18777 4830267 4830314 18777-exon-4 
1 Lypla1 18777 4832310 4832380 18777-exon-5 
1 Lypla1 18777 4837000 4837073 18777-exon-6 
1 Lypla1 18777 4839386 4839487 18777-exon-7 
1 Lypla1 18777 4840955 4841131 18777-exon-8 
1 Lypla1 18777 4844962 4845015 18777-exon-9 
1 Rgs20 58175 4910473 4910661 58175-exon-1 
1 Rgs20 58175 4912313 4912547 58175-exon-2 
1 Rgs20 58175 4916896 4916979 58175-exon-3 
+1

あなたの問題を解決するための最良の試みを示すためにQを更新してください。これは、そのようなタスクに 'awk'を使う方法を理解するのを助ける唯一の方法です。 (はい、これは非常に簡単に解決するはずです)。しかし、 '497097'はファイルの後ろに現れますか、ここに表示されているように常にレコードは一緒にグループ化されます。最後に、 '497097'の' $ 3'はありませんか?コメントで返信するのではなく、Qを更新してください。がんばろう。 – shellter

+1

スタックオーバーフローへようこそ、期待した出力をコードタグで表示していれば、最初のサンプル入力を表示してからコードタグに予想される出力を表示できるので、クエリをより理解できるようになります。ありがとう、知識と喜びを共有し続ける! – RavinderSingh13

+0

あなたは正しい "id"が$ 3であることを申し訳ありません。また、idレコードはグループ化されており、ファイルのさらに下には繰り返されません。私はこれらの問題の両方を反映するようにQを更新しました。ありがとうございました。 – John

答えて

1

ワンライナー:

awk 'FNR==1{print $0,"exon_number";next}p!=$3{c=0;p=$3}{print $0, $3"-exon-"++c}' infile 

説明:awk

awk 'FNR==1{        # If first line read by awk 
      print $0,"exon_number";   # print current record, 
              # and other header for new field 
      next       # we are done go to next line 
     } 
     p!=$3{        # if p is not equal to 3rd column 
      c=0;       # reset counter variable 
      p=$3       # set variable p with 3rd column value         
              # Here you assume p mean previous value 
     } 
     { 
      print $0, $3"-exon-"++c   # print current record, 
              # 3rd field 
              # "-exon-" string and 
              # pre-increment variable c 
     } 
     ' infile 
+0

ありがとう!コードはまた、私が求めたものとまったく同じでした。私は "exon_number"フィールドに計算された数値を出力するために少し修正しました。 '' FNR == 1 {print $ 0、 "exon_number"; next} p!= $ 3 {c = 0; p = $ 3} {print $ 0、++ c} ''あなたの説明は、コードがどのように機能したかを理解するのに非常に役立ちました。 – John

+0

あなたが解決したら受け入れると思うかもしれない –

1

は同じであなたを助けるかもしれません。

awk 'FNR==1{print $0,"exon_number";next} {printf("%s-exon-**%s**\n",$0 FS $3,val!=$3?(i=1):++i);val=$3}' Input_file 

出力は以下の通りである。

chr gene **id** start stop exon_number 
1 Xkr4 497097 3216021 3216967 497097-exon-**1** 
1 Xkr4 497097 3421701 3421900 497097-exon-**2** 
1 Xkr4 497097 3670551 3671347 497097-exon-**3** 
1 Rp1 19888 4344599 4350090 19888-exon-**1** 
1 Rp1 19888 4351909 4352080 19888-exon-**2** 
1 Rp1 19888 4352201 4352824 19888-exon-**3** 
1 Sox17 20671 4491715 4492667 20671-exon-**1** 
1 Sox17 20671 4493099 4493405 20671-exon-**2** 
1 Lypla1 18777 4807913 4807981 18777-exon-**1** 
1 Lypla1 18777 4808454 4808485 18777-exon-**2** 
1 Lypla1 18777 4828583 4828648 18777-exon-**3** 
1 Lypla1 18777 4830267 4830314 18777-exon-**4** 
1 Lypla1 18777 4832310 4832380 18777-exon-**5** 
1 Lypla1 18777 4837000 4837073 18777-exon-**6** 
1 Lypla1 18777 4839386 4839487 18777-exon-**7** 
1 Lypla1 18777 4840955 4841131 18777-exon-**8** 
1 Lypla1 18777 4844962 4845015 18777-exon-**9** 
1 Rgs20 58175 4910473 4910661 58175-exon-**1** 
1 Rgs20 58175 4912313 4912547 58175-exon-**2** 
1 Rgs20 58175 4916896 4916979 58175-exon-**3** 

PS:あなたは上記のコードで**をしたくないなら、あなたはprintfからそれらを削除することができます。

+0

ありがとう!コードは、私が求めたものとまったく同じでした。私は "exon_number"フィールドに計算された数値を出力するために少し修正しました。 ($ 0、 "ex#1"):val = $ 3($ 0、 "exon_number"; next} {printf( "%s%s \ n"、$ 0 FS、val!= $ 3? } '' – John

+0

@ジョン、それはあなたを助けてくれてうれしい。このhttps://stackoverflow.com/help/someone-answersを一度ご覧ください。 – RavinderSingh13

関連する問題