从字符串中删除数值

时间:2012-09-18 15:03:41

标签: python perl bash shell

我有一个2000行和1列的文件

1007_s_at1
1007_s_at2
1007_s_at3
1007_s_at4
1007_s_at5
1007_s_at6
1007_s_at7
1007_s_at8
1007_s_at9
1007_s_at10

如上所示,我想删除“at”之后的最后一个数值。原则上,最后一个数字应该被截断。

我尝试过拆分它们然后重新启动它,但它只是使问题复杂化,我远离回答。

请你用bash或shell或python或perl来推荐一些东西来解决这个问题。

需要如下输出

   1007_s_at
    1007_s_at
    1007_s_at
    1007_s_at
    1007_s_at
    1007_s_at
    1007_s_at
    1007_s_at
    1007_s_at
    1007_s_at

谢谢

7 个答案:

答案 0 :(得分:5)

使用 Perl

perl -p -e "s/\d+$//" input.txt > output.txt

答案 1 :(得分:3)

sed -i -e 's/[[:digit:]]*$//' filename

答案 2 :(得分:3)

只需将string.digits传递给.rstrip()即可删除字符串右侧的数字:

import string
with open('inputfile') as infile, open('outputfile') as outfile:
    for line in infile:
        outfile.write(line.rstrip().rstrip(string.digits) + '\n')

答案 3 :(得分:1)

如果只有最后的数字发生变化,你可能会拼接:

>>> a = '1007_s_at1'
>>> a[0:9]
'1007_s_at'

答案 4 :(得分:1)

<强>的Python

从最后删除所有数字。

>>> "1007_s_at10".rstrip('01234567890')
'1007_s_at'

答案 5 :(得分:0)

如果您使用的是Linux或Unix,那么简单的单线解决方案就是:

perl -i.bak -pe 's/\d+$//g' file.txt

如果是Windows:

perl -i.bak -pe "s/\d+$//g" file.txt

如果您已经知道它正在做什么那么好,否则,用非常简单的术语来说,-i切换.bak会先创建file.txt的备份,并将其命名为{ {1}}。

然后file.txt.bak选项将循环遍历文件中的条目,并在-p删除最后的数字后在file.txt中打印/保存输出。

答案 6 :(得分:0)

还没有人建议使用bash解决方案:

shopt -s extglob
while read line; do
    echo "${line%%*([0-9])}"
done < filename