最初の列からのみ拡張子を削除する

最初の列からのみ拡張子を削除する

タブで区切られた2つの列を持つ次のファイルがあります。

 ENSG00000242268.2    0.07563
 ENSG00000270112.3    0.09976
 ENSG00000167578.15   4.38608
 ENSG00000273842.1    0.0
 ENSG00000078237.5    4.08856

最初の列の末尾から数値拡張子を削除したいので、出力は次のようになります。

 ENSG00000242268    0.07563
 ENSG00000270112    0.09976
 ENSG00000167578    4.38608
 ENSG00000273842    0.0
 ENSG00000078237    4.08856

単に最初の列の値のみを返し、sed 's/\..*$//'フィールド区切り文字'.'でawkを使用するとawk -F'.'小数点があるため、2番目の列の値も削除されます。

同様の質問に対する答えはここにあります: 列から拡張子を削除する

まだ最初の列だけを削除することはできません。

答え1

アッ解決策:

awk -F'\t' '{sub(/\..+$/,"",$1)}1' OFS='\t' file
  • -F'\t'- フィールド区切り記号

  • sub(/\..+$/,"",$1)-.最初のフィールドで次の文字をすぐに削除します。

出力:

ENSG00000242268 0.07563
ENSG00000270112 0.09976
ENSG00000167578 4.38608
ENSG00000273842 0.0
ENSG00000078237 4.08856

または簡単に使用してくださいsed方法:

sed 's/\.[0-9]*//' file

答え2

ただし:

sed 's/\(.[0-9]\+\) / /' 

小数点の最初の部分のみを一致して削除します。

サンプルから:

echo "ENSG00000242268.2    0.07563
>  ENSG00000270112.3    0.09976
>  ENSG00000167578.15   4.38608
>  ENSG00000273842.1    0.0
>  ENSG00000078237.5    4.08856" | sed 's/\(.[0-9]\+\) / /'
ENSG00000242268    0.07563
ENSG00000270112    0.09976
ENSG00000167578   4.38608

タブがある場合は、編集して次のことを試してください。

sed 's/\(.[0-9]\+\)\( \|\t\)\2/' 

答え3

私たちは一致することができますバージョン指定されたEnsemblヒト遺伝子「安定」ID拡張正規表現を使用しますENSG[0-9]{11}\.[0-9]+

以下と組み合わせて使用​​してくださいsed

$ sed -r 's/(ENSG[0-9]{11})\.[0-9]+/\1/' file.in >file.out

これは、列間の区切り文字や行に識別子が表示される場所には依存しません。

答え4

バッシュで使用部分文字列の削除:

#!/usr/bin/env bash

file='file.txt'

while read -r i; do

  a=$( <<< "${i}" cut -d $'\t' -f 1 )
  a=${a%.*}
  b=$( <<< "${i}" cut -d $'\t' -f 2- )

  printf '%s\t%s\n' "${a}" "${b}"

done < "${file}"

関連情報