web-dev-qa-db-ja.com

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

タブが2列に分かれているこのようなファイルがあります。

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

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

 ENSG00000242268    0.07563
 ENSG00000270112    0.09976
 ENSG00000167578    4.38608
 ENSG00000273842    0.0
 ENSG00000078237    4.08856

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

同様の質問がここで回答されています: 列の拡張子を削除する

まだ1列目だけから削除することはできません。

3
Roli

awk解決策:

_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
_
5
RomanPerekhrest

ただ行う:

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/' 
5
Rob

バージョン化されたEnsemblヒト遺伝子「安定した」ID を拡張正規表現ENSG[0-9]{11}\.[0-9]+と一致させる場合があります。

これをsedで使用する:

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

これは、列間の区切り文字や、行のどこに識別子が存在するかに依存しません。

4
Kusalananda

部分文字列の削除 を使用するBashの場合:

#!/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}"
0
nxnev
$ awk -F'[\t.]' -v OFS='\t' '{print $1,$3 "." $4}'
ENSG00000242268 0.07563
ENSG00000270112 0.09976
ENSG00000167578 4.38608
ENSG00000273842 0.0
ENSG00000078237 4.08856
0
George Vasiliou

Perl解決策:

Perl -pe 's/\.\d+//

  • \.\d+最初の「。」に一致しますその後に1桁以上が続きます。
  • s/pattern//は選択したパターンを削除します。
0
abitmol