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