特定の列の特定の文字の前の文字を削除する

特定の列の特定の文字の前の文字を削除する

次のファイルがあります。

chr22   43089055    43089055    -   NM_017436   C   300 903delC
chr22   43089715-43089717   43089715-43089717   -   NM_017436   CTT 79

-3列目の前のすべての文字を削除して、次のような出力を得たいと思います。

chr22   43089055    43089055    -   NM_017436   C   300 903delC
chr22   43089715-43089717   43089717    -   NM_017436   CTT 79

awk '{$2+=0}1' file過去に削除された文字を使用したことがありますが、同じ-技術を使用して現在の問題を解決できるとは思いません。どんな提案がありますか?

答え1

Perlが構造に来ます:

perl -lane 'BEGIN { $, = "\t" } $F[2] =~ s/.*-//; print @F' < file
  • -l改行文字を追加print
  • -n入力を1行ずつ読みます。
  • -a各行をスペースで分割して@F配列を埋める
  • $,印刷時にリストメンバーを区切り、タブに設定
  • s/.*-//ダッシュの前のすべてを、3番目の列(0からインデックス付けされた配列)にバインドする何もないものに置き換えます。

答え2

様々なバリエーションで

  1. アッ

    awk '{$3=A[split($3,A,"-")]}1' file

  2. sed

    sed -r 's/((\S+\s+){2})[^- ]+-/\1/' file

答え3

使用awk:

< input awk 'BEGIN {FS=OFS="   "} {gsub(/[^-]*-/, "", $3); print}'

関連情報