Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从数据文件中的一列中删除点后字符串的最后一部分_Python_Design Patterns_Awk - Fatal编程技术网

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

Python 从数据文件中的一列中删除点后字符串的最后一部分,python,design-patterns,awk,Python,Design Patterns,Awk,也许这是一个简单的问题,但我检查了一些问题,我无法找到解决问题的正确方法。我有一个大文件,分为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 我想要的是删除最后一个点之后的字符串的最后一部分。那么输出应该是这样的: id.aa.xx.1.rr.2930 id.ee.yy.2.gres.1 id.w

也许这是一个简单的问题,但我检查了一些问题,我无法找到解决问题的正确方法。我有一个大文件,分为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
我想要的是删除最后一个点之后的字符串的最后一部分。那么输出应该是这样的:

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
如您所见,字符串没有相同的模式,因此我不能使用split函数,python中也不能使用rsplit(),因为点后的最后一个字段是每个字符串1到6个字符


有python或awk的简单解决方案吗

您可以使用此代码
line[:line.rfind('.')]

您可以使用此代码
line[:line.rfind('.')]

也许您可以使用bash来解决此问题:

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

id.aa.xx.1.rr

说明:

版本:反向行-->0392.rr.1.xx.aa.di

切割-d-f2->删除反向字符串的第一个字段


rev:再次将字符串反转为原始字符串

也许您可以使用bash来解决此问题:

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

id.aa.xx.1.rr

说明:

版本:反向行-->0392.rr.1.xx.aa.di

切割-d-f2->删除反向字符串的第一个字段

rev:再次使用rev和cut将字符串反转为原始字符串

cat <filename> | rev | cut -d'.' -f'2-' | rev
cat | rev | cut-d'.-f'2'.| rev
它的作用是:

  • 反转线条,使我们不想要的部分位于开头
  • 使用“剪切”将线按点(.)拆分,并获取从第二个字段开始的所有字段
  • 将线反转回正常状态
使用旋转和切割:

cat <filename> | rev | cut -d'.' -f'2-' | rev
cat | rev | cut-d'.-f'2'.| rev
它的作用是:

  • 反转线条,使我们不想要的部分位于开头
  • 使用“剪切”将线按点(.)拆分,并获取从第二个字段开始的所有字段
  • 将线反转回正常状态

要编辑文件第9列中的值,可以执行以下操作:

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

regex模式是贪婪的,因此将捕获到最后一个
之前的所有内容以用于替换。

要编辑文件第9列中的值,可以执行以下操作:

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

正则表达式模式是贪婪的,因此捕获到最后一个
的所有内容以用于替换。在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

在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

下面是一个简单的
awk

awk -F. -v OFS=. 'NF--' file
id.aa.xx.1.rr
id.ee.yy.2.gres
id.ww
它只是通过递减字段计数器NF来删除最后一个字段



如果Tom使用的拆分只在字段
9
上进行,那么它是一个很好的解决方案。

这里有一个简单的
awk

awk -F. -v OFS=. 'NF--' file
id.aa.xx.1.rr
id.ee.yy.2.gres
id.ww
它只是通过递减字段计数器NF来删除最后一个字段



如果Tom使用的拆分只在字段
9
上执行,则该拆分是一个很好的解决方案。

如果所有行都需要删除,则采用awk方式

awk 'sub(/\.[^\.]+$/,"",$9)' file
如果其他行需要打印

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

如果所有线路都需要拆卸,请使用awk方式

awk 'sub(/\.[^\.]+$/,"",$9)' file
如果其他行需要打印

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


请发布全文
rsplit()有什么问题
s.rsplit('.',1)[0]
应该可以正常工作。请发布全文
rsplit()
有什么问题
s.rsplit('.',1)[0]
应该可以正常工作。我以前建议这样做,但删除了它,因为这只适用于单个列,而OP希望删除文件第9列中的值。@TomFenech我明白了。OP应该发布更多正确的样本数据。我把它留下,因为这个问题是正确的:
删除点后字符串的最后一部分
如果有人用谷歌搜索它。我同意!这就是为什么我自己也犯了同样的错误:)很抱歉给您带来不便,我会在以后的场合尽量说得更具体一些。但感谢您的帮助。请注意,如果有一个空行,这将中断,因为NF不能为负。相反,最好使用
NF&&NF--
或仅使用
{NF--}1
我以前建议过这一点,但删除了它,因为这只适用于单个列,而OP希望从文件的第9列中删除该值。@TomFenech我明白了。OP应该发布更多正确的样本数据。我把它留下,因为这个问题是正确的:
删除点后字符串的最后一部分
如果有人用谷歌搜索它。我同意!这就是为什么我自己也犯了同样的错误:)很抱歉给您带来不便,我会在以后的场合尽量说得更具体一些。但感谢您的帮助。请注意,如果有一个空行,这将中断,因为NF不能为负。相反,最好使用
NF&&NF--
或仅使用
{NF--}1
很好的技巧,很容易添加到我的python代码中。非常有用。谢天谢地,这很容易添加到我的python代码中。非常有用。感谢
gawk
12345678id.aa.xx.1.rr.29309910给出了错误的结果。它给出了
一二三四五六七八一二三四五六七八id.aa.xx.1.rr九十
。首先,
awk
是确定的。你是对的,我只测试了一列,所以对我来说效果很好。我缺少“how”参数,因此目标是
$0
。我现在编辑了。谢谢。
gawk
12345678id.aa.xx.1.rr.29309910给出了错误的结果。它给出了
一二三四五六七八一二三四五六七八id.aa.xx.1.rr九十
。首先,
awk
是确定的。你是对的,我只测试了一列,所以对我来说效果很好。我缺少“how”参数,因此目标是
$0
。我现在编辑了。谢谢,很好。你忘了你可以指定吗