也许这是一个简单的问题,但我检查了一些问题,我无法为我的问题找到合适的解决方案。我有一个大文件分为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中的任何简单解决方案?
答案 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
它的作用: