从数据文件的一列中删除字符串中最后一个点后的部分
这可能是个简单的问题,但我查了一些内容,还是找不到合适的解决办法。我有一个很大的文件,里面分成了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('.')
来找到最后一个点(.)之前的所有内容。