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

时间:2014-10-31 10:21:36

标签: 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

正如你所看到的,字符串没有相同的模式,所以我不能使用split函数,而python中也没有使用rsplit(),因为点后面的最后一个字段是每个字符串1到6个字符。

python或awk中的任何简单解决方案?

7 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

要编辑文件第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

使用a作为分隔符,将第9列拆分为数组.。通过循环遍历数组重新创建值,跳过最后一个元素。最后的1是打印该行的{print $0}的简写。

使用GNU awk会更容易:

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

正则表达式模式是贪婪的,所以直到最后.的所有内容都被捕获以用于替换。

答案 2 :(得分:1)

在使用re模块的python中可以做到这一点

>>> 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

答案 3 :(得分:1)

如果所有线路都需要移除它,请使用awk方式。

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

如果其他行需要打印

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

答案 4 :(得分:0)

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

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

结果:

id.aa.xx.1.rr

<强>解释

rev:反向行 - &gt; 0392.rr.1.xx.aa.di

cut -d。 -f2- - &gt;删除反向字符串的第一个字段

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

答案 5 :(得分:0)

这是一个简单的awk

awk -F. -v OFS=. 'NF--' file
id.aa.xx.1.rr
id.ee.yy.2.gres
id.ww

它只是通过递减字段计数器NF

来删除最后一个字段

Tom使用的分割是一个很好的解决方案,如果它只应在字段9上完成。

答案 6 :(得分:-1)

使用rev and cut:

cat <filename> | rev | cut -d'.' -f'2-' | rev

它的作用:

  • 撤销该行,以便我们不想要的部分在开头
  • 使用剪切将线条按(。)分割,并从第二个字段开始获取所有字段
  • 将线路撤回正常