使用awk删除字符串ID中的小数位数

使用awk删除字符串ID中的小数位数,awk,Awk,我想从标识符列表中删除字符串中的小数位: ENSG00000166224.12 ENSG00000102897.5 ENSG00000168496.3 ENSG00000010295.15 ENSG00000147533.12 ENSG00000119242.4 我期望的输出是 ENSG00000166224 ENSG00000102897 ENSG00000168496 ENSG00000010295 ENSG00000147533 ENSG00000119242 我想用awk来做,我一直

我想从标识符列表中删除字符串中的小数位:

ENSG00000166224.12
ENSG00000102897.5
ENSG00000168496.3
ENSG00000010295.15
ENSG00000147533.12
ENSG00000119242.4
我期望的输出是

ENSG00000166224
ENSG00000102897
ENSG00000168496
ENSG00000010295
ENSG00000147533
ENSG00000119242
我想用awk来做,我一直在玩
printf
,但没有成功

更新:

awk答案将字段分隔符设置为
在只有一列的文件中效果很好,但是如果文件由不同的列(字符串和浮点数)组成呢? 以下是一个例子:

ENSG00000166224.12  0.0730716237772557  -0.147970450702234
ENSG00000102897.5   0.156405616866614   -0.0398488625782745
ENSG00000168496.3   -0.110396121325736  -0.0147093758392248
如何仅删除第一个字段中的小数位


谢谢

您可以将字段分隔符设置为点并打印第一个元素:

$ awk -F. '{print $1}' file
ENSG00000166224
ENSG00000102897
ENSG00000168496
ENSG00000010295
ENSG00000147533
ENSG00000119242
sed
中,您会说
sed的/\.[^\.]*$/'文件
,它将捕获最后一个点的所有内容并将其删除

如果它只是一个数字,您就可以使用
printf
。然后,您可以使用一些不打印小数点的东西。但是,由于它是字母数字字符串,因此最好将其作为字符串处理


使现代化 使用
gsub
替换第一个字段中
中的所有内容:

$ awk '{gsub(/\..*$/,"",$1)}1' a
ENSG00000166224 0.0730716237772557 -0.147970450702234
ENSG00000102897 0.156405616866614 -0.0398488625782745
ENSG00000168496 -0.110396121325736 -0.0147093758392248

您可以将字段分隔符设置为点并打印第一个元素:

$ awk -F. '{print $1}' file
ENSG00000166224
ENSG00000102897
ENSG00000168496
ENSG00000010295
ENSG00000147533
ENSG00000119242
sed
中,您会说
sed的/\.[^\.]*$/'文件
,它将捕获最后一个点的所有内容并将其删除

如果它只是一个数字,您就可以使用
printf
。然后,您可以使用一些不打印小数点的东西。但是,由于它是字母数字字符串,因此最好将其作为字符串处理


使现代化 使用
gsub
替换第一个字段中
中的所有内容:

$ awk '{gsub(/\..*$/,"",$1)}1' a
ENSG00000166224 0.0730716237772557 -0.147970450702234
ENSG00000102897 0.156405616866614 -0.0398488625782745
ENSG00000168496 -0.110396121325736 -0.0147093758392248
同时使用子函数

awk '{sub(/\..*/, "")}1' file
同时使用子函数

awk '{sub(/\..*/, "")}1' file

使用
cut

$ cut -d. -f1 file
ENSG00000166224
ENSG00000102897
ENSG00000168496
ENSG00000010295
ENSG00000147533
ENSG00000119242

使用
cut

$ cut -d. -f1 file
ENSG00000166224
ENSG00000102897
ENSG00000168496
ENSG00000010295
ENSG00000147533
ENSG00000119242

如果您正在寻找perl解决方案

perl-pne的/\..*$/'file.txt


这最终会删除小数点后的所有内容。

如果您正在寻找perl解决方案

perl-pne的/\..*$/'file.txt


这最终会删除小数点后的所有内容。

谢谢@fedorqui,我会给你正确的答案,因为不同的解决方案,是的,
awk-F.{print$1}'
是一种更优雅的方式。一开始我试图发布相同的答案,但f****capatcha延迟了我的发布。如果文件有另外两个字段,并且两个字段都有浮点数,那么字段分隔符将不起作用,有没有办法将分隔符设置为字段?@user2380782不确定我是否理解你的意思。您可以发布一些示例吗?例如,一个文件带有此
ENG00000166224.12 0.0730716237772557-0.147970450702234 ENG00000102897.5 0.156405616866614-0.0398488625782745 ENG00000168496.3-0.110396121325736-0.0147093758392248
,我只对从第一个字段中删除小数感兴趣(ENSG…),带字符串的字段谢谢@fedorqui,我会给你正确的答案,因为不同的解决方案,是的,
awk-F.{print$1}
是一种更优雅的方式。一开始我试图发布相同的答案,但f****capatcha延迟了我的发布。如果文件有另外两个字段,并且两个字段都有浮点数,那么字段分隔符将不起作用,有没有办法将分隔符设置为字段?@user2380782不确定我是否理解你的意思。您可以发布一些示例吗?例如,一个文件带有此
ENG00000166224.12 0.0730716237772557-0.147970450702234 ENG00000102897.5 0.156405616866614-0.0398488625782745 ENG00000168496.3-0.110396121325736-0.0147093758392248
,我只对从第一个字段中删除小数感兴趣(ENSG…),带字符串的字段