別の列が表す位置にあるある列の文字を別の列の文字列に置き換える方法

別の列が表す位置にあるある列の文字を別の列の文字列に置き換える方法

私は生物情報学に初めて触れて(これが最初の投稿です!)私を悩ませる作業に助けが必要です。

3つの列を持つタブで区切られたデータテーブルがあります。

AATTCTTGCA 4 [A/T]
AATTCCTTCG 7 [C/T]
AATTCAACAA 2 [T/C]

2番目の列が表す位置の最初の列の文字を3番目の列の文字列に置き換えたいと思います。その後、出力は次のようになります。

AAT[A/T]CTTGCA
AATTCC[C/T]TCG
A[T/C]TTCAACAA

私は今さまざまなチュートリアルに従い、sed/を使用した(失敗した)コマンドがあれば投稿を更新しますawk

よろしくお願いします!

答え1

次のawkコマンドで操作を実行する必要があります。

awk -F"\t" '{printf "%s%s%s%s",substr($1,1,$2-1),$3,substr($1,$2+1),ORS}' input.txt

このオプションは-Fフィールド区切り文字をに設定しますTAB。その後、プログラムは(printf()関数を使用して)各行を印刷します。

  • フィールド1の先頭からフィールド2に示されている文字位置までの部分文字列(含まれていません)
  • フィールド3に含まれる文字列
  • フィールド 2 に示す文字位置から始まり、フィールド 1 の残りの部分
  • 「出力レコード区切り記号」、デフォルトは改行です。

これは、表示された文字をフィールド3の内容に効果的に置き換える。

ノート振り返ってみると、そのような大量の明示的な形式制御は実際に不要であり、プログラムは次のように短縮することができました。

awk -F"\t" '{print substr($1,1,$2-1) $3 substr($1,$2+1)}' input.txt

警告する:プログラムは、フィールド2の文字位置が常に合理的であると仮定します。すなわち、ゼロより大きく、フィールド1の全長以下である。ファイルが破損している場合は、追加のエラーチェックが必要です。

答え2

使用幸せ(以前のPerl_6)

raku -ne 'my ($a,$b,$c) = .split("\t"); substr-rw($a, $b-1, 1) = $c; put $a;' 

入力例:

AATTCTTGCA  4   [A/T]
AATTCCTTCG  7   [C/T]
AATTCAACAA  2   [T/C]

出力例:

AAT[A/T]CTTGCA
AATTCC[C/T]TCG
A[T/C]TTCAACAA

-neつまり、コマンドラインフラグを使用してデータを1行ずつ読み込みます。各行はsplitタブに配置され、スカラーとに$a割り当て$bられます$c。 「substring-rewrite」コマンドは、ヌクレオチド配列をsubstr-rw取り$a、文字列を$c長さ1で定義された位置に割り当てるために使用されます(つまり、1つのヌクレオチドの置換)。$b-1修飾された$aヌクレオチド配列が出ますput

https://docs.raku.org/routine/substr-rw
https://raku.org

関連情報