タブで区切られた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}"