他の列の指示に従って、1列の文字を変更します。

他の列の指示に従って、1列の文字を変更します。

NGSデータで見つかったバリアントに基づいて、あるコドンシーケンスを別のコドンシーケンスに変換するスクリプトを設定しようとしています。

現在私のスクリプトは、6つの列を持つタブで区切られた出力ファイルを生成します。各列は次を示します。

  • 最初:ゲノムの位置
  • 第二:ヌクレオチド塩基
  • 3番目の場所:コドン
  • 第四:コドンのゲノム位置配列
  • 5番目:SNP頻度
  • 6位:SNPベース

出力データは次のとおりです。

2289     G       GTG    3        0.0346505      A

2478     G       ATG    2        0.0054087      C

出力ファイルの7列を設定して、4列の番号に基づいてコドンのヌクレオチド配列をSNPヌクレオチド(6列)に変更することは可能ですか?

例えば、

  • ゲノム位置2289の場合:

GTGコドンはGTAになります。 SNPヌクレオチドAは、列4に記載されているコドン配列の3番目のヌクレオチド配列を置き換えます。

  • ゲノム位置2478の場合

ATGコドンはACGになります。 SNPヌクレオチドCは、コドンの第2のヌクレオチド配列を置き換える。

この操作を使用awkまたは実行できますか?sed

答え1

「できるか…」という質問に「はい」と答えるのはあまりにも誘惑的です。

そんなことが起こりますか?

awk '{l=substr($3,1,$4-1); r=substr($3,$4+1); print $0"\t"l $6 r}' genome > mutated

答え2

Perlソリューション:

perl -lane 'substr $n = $F[2], $F[3] - 1, 1, $F[5]; print join "\t", $_, $n' -- file
  • -n入力を1行ずつ読みます。
  • -l入力から改行を削除して追加します。印刷S
  • -a空白の各行を @F 配列に分割します。
  • バラよりサブストリング詳細

答え3

いくつかのperl分割と結合を使用すると、次のようになります。

perl -alne '
  @c = split //, $F[2]; 
  splice @c, $F[3]-1, 1, $F[5]; 
  print join "\t", @F, join "", @c;
' data

説明する:

- split 3rd column into character array @c
- replace the value indexed by the 4th column with that of the 6th
- stitch it all back together, delimited by tabs

試験に与えられた

$ cat data
2289    G       GTG     3       0.0346505       A
2478    G       ATG     2       0.0054087       C

それから

$ perl -alne '
    @c = split //,$F[2]; splice @c,$F[3]-1,1,$F[5]; print join "\t",@F,join "",@c
  ' data
2289    G       GTG     3       0.0346505       A       GTA
2478    G       ATG     2       0.0054087       C       ACG

答え4

perl -plane 'substr($F[2],$F[3]-1,1)=$F[5]; $_.="\t$F[2]"' data
  • 問題に応じてF2を変更してください。substr($F[2],$F[3]-1,1)=$F[5]
  • 入力ラインに接続して$_.="\t$F[2]"

関連情報