我有一个像这样的文件,其中制表符分隔两列:
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}"