仅从第一列删除扩展名

仅从第一列删除扩展名

我有一个像这样的文件,其中制表符分隔两列:

 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'.'也会从第二列中删除值,因为有十进制数字。

类似的问题已在这里得到回答: 删除列中的扩展名

我仍然无法仅从第一列删除。

答案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

答案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

与 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}"

相关内容