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

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

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

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の全長以下である。ファイルが破損している場合は、追加のエラーチェックが必要です。

おすすめ記事