从数据文件的一列中删除字符串中最后一个点后的部分

1 投票
7 回答
3296 浏览
提问于 2025-04-30 20:36

这可能是个简单的问题,但我查了一些内容,还是找不到合适的解决办法。我有一个很大的文件,里面分成了10列。在第9列中,有个字符串,里面包含数字和字母,用点号分隔开。大概是这样的:

id.aa.xx.1.rr.2930
id.ee.yy.2.gres.1
id.ww.3232

我想要做的是去掉这个字符串最后一个点号后面的部分。然后输出应该是这样的:

id.aa.xx.1.rr
id.ee.yy.2.gres
id.ww

如你所见,这些字符串的格式不一样,所以我不能用分割函数,也不能用Python里的rsplit(),因为点号后面的部分长度从1到6个字符不等。

有没有什么简单的方法可以用Python或者awk来解决这个问题?

暂无标签

7 个回答

0

也许你可以用bash来解决这个问题:

echo id.aa.xx.1.rr.2930 | rev | cut -d. -f2- | rev

结果:

id.aa.xx.1.rr

解释:

rev: 反转行 --> 0392.rr.1.xx.aa.di

cut -d. -f2- --> 删除反转字符串的第一个部分

rev: 再次反转字符串,恢复到原来的样子

1

如果所有的行都需要被删除,可以用awk来处理。

awk 'sub(/\.[^\.]+$/,"",$9)' file

如果还有其他的行需要打印出来,可以使用下面的方式。

awk '{sub(/\.[^\.]+$/,"",$9)}1' file
1

在Python中,可以使用re模块来解决这个问题。

>>> x=['id.aa.xx.1.rr.2930', 'id.ee.yy.2.gres.1', 'id.ww.3232']
>>> for str in x:
...     re.sub(r"\.[^.]+$", "",str)
...
'id.aa.xx.1.rr'
'id.ee.yy.2.gres'
'id.ww'

或者可以使用sed命令。

$ sed -r 's/\.[^.]+$//g' input
id.aa.xx.1.rr
id.ee.yy.2.gres
id.ww

也可以使用grep命令。

$ grep -oP  "[\w.]+(?=\.[^.]+$)" input
id.aa.xx.1.rr
id.ee.yy.2.gres
id.ww
1

要编辑一个文件中第九列的值,你可以这样做:

awk '{n=split($9,a,".");$9="";for(i=1;i<n;++i)$9=$9 sprintf("%s%s",a[i],(i<n-1?".":""))}1' file

首先,用.作为分隔符,把第九列的内容分割成一个数组a。然后,通过循环这个数组,重建值,但要跳过最后一个元素。最后的1其实是{print $0}的简写,意思是打印这一整行。

使用GNU awk来做这个事情会简单很多:

gawk '{$9=gensub(/(.*)\..*$/, "\\1", 1, $9)}1' file

这里的正则表达式是贪婪的,所以它会捕获到最后一个.之前的所有内容,以便在替换时使用。

5

你可以使用这段代码 line[:line.rfind('.') 来找到最后一个点(.)之前的所有内容。

撰写回答