タブが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列目だけから削除することはできません。
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
_
ただ行う:
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/'
バージョン化されたEnsemblヒト遺伝子「安定した」ID を拡張正規表現ENSG[0-9]{11}\.[0-9]+
と一致させる場合があります。
これをsed
で使用する:
$ sed -r 's/(ENSG[0-9]{11})\.[0-9]+/\1/' file.in >file.out
これは、列間の区切り文字や、行のどこに識別子が存在するかに依存しません。
部分文字列の削除 を使用する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}"
$ 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
Perl解決策:
Perl -pe 's/\.\d+//
\.\d+
最初の「。」に一致しますその後に1桁以上が続きます。s/pattern//
は選択したパターンを削除します。