1

我有一个 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

谢谢

4

7 回答 7

5

使用Perl

perl -p -e "s/\d+$//" input.txt > output.txt
于 2012-09-18T15:06:07.913 回答
3
sed -i -e 's/[[:digit:]]*$//' filename
于 2012-09-18T15:05:55.310 回答
3

只需通过string.digitsto.rstrip()删除字符串右侧的数字:

import string
with open('inputfile') as infile, open('outputfile') as outfile:
    for line in infile:
        outfile.write(line.rstrip().rstrip(string.digits) + '\n')
于 2012-09-18T15:06:03.133 回答
1

如果最后的唯一数字发生变化,您可能会拼接:

>>> a = '1007_s_at1'
>>> a[0:9]
'1007_s_at'
于 2012-09-18T15:09:15.783 回答
1

Python

只需从末尾删除所有数字。

>>> "1007_s_at10".rstrip('01234567890')
'1007_s_at'
于 2012-09-18T15:32:58.570 回答
0

还没有人提出 bash 解决方案:

shopt -s extglob
while read line; do
    echo "${line%%*([0-9])}"
done < filename
于 2012-09-18T20:52:56.513 回答
0

如果您使用的是 Linux 或 Unix,一个简单的单线解决方案将是:

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

如果是 Windows:

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

如果您已经知道它在做什么,那么很好,否则,用非常简单的术语来说,-iswitch with.bak将首先创建您的备份file.txt并命名它file.txt.bak

然后,该-p选项将遍历文件中的条目,并在最后删除数字file.txt后打印/保存输出。s/\d+$//g

于 2012-09-18T19:06:18.673 回答