如何仅在带数字的行中执行数学运算?

时间:2013-03-30 01:46:24

标签: perl substitution

我有一个文件,其中只有一些行以数字开头。我想在这些行中执行简单的数学运算。

例如,假设这些行采用以下格式:

010 - 0050 - 20500

我想只将100添加到第二个数字:

010 - 0150 - 20500

perl是最好的工具吗?

4 个答案:

答案 0 :(得分:3)

# 5.10+
perl -pe's/^[0-9]+ - \K([0-9]+)/ sprintf "%04d", $1 + 100 /e'

# Backwards compatible
perl -pe's/^([0-9]+ - )([0-9]+)/ $1 . sprintf "%04d", $2 + 100 /e'

用法:

perl -pe'...' file      # From file
perl -pe'...' <file     # From STDIN
perl -i~ -pe'...' file  # Modifying in place with backup
perl -i -pe'...' file   # Modifying in place without backup

如果你喜欢一个独立的程序,上面的内容只相当于:

while (<>) {
   s/^[0-9]+ - \K([0-9]+)/ sprintf "%04d", $1 + 100 /e;
   print;
}

除了你想要改变的行之外,它不会乱掉任何行,并且它不会像其他解决方案那样混乱行的任何其他部分。

答案 1 :(得分:1)

在Perl中,这并不太难。

open my $fh, "<", "filename" or die $!;
while (<$fh>) {
    if ($_ =~ /(\d{3}) - (\d{4}) - (\d{5})/) {
        printf "%.3d - %.4d - %.5d\n", $1, $2 + 100, $3;
    } else {
        print $_;
    }
}

答案 2 :(得分:1)

在Python中:

fp = open("yourfile.txt","r")
for line in fp.readlines():
    for i in range(0,9):
        if line.startswith(str(i)):
            elems = line.split(" - ")
            elems[1] = "0"+str(int(elems[1]+100))
            whatyouneed = " - ".join(elems)

Whatyouneed包含所需的结果。请原谅任何错误,因为我无法测试该代码。希望这有帮助!

答案 3 :(得分:0)

Perl是一个很好的工具,是的,是的。但如果它是 案例的最佳工具,则取决于许多其他因素:

  • 这是一次性的工作,还是你必须定期做同样的事情?或者类似的事情?
  • 你知道Perl吗?是否有其他相似的语言(如Python或awk),你已经很舒服了吗?
  • 文件有多大? (如果只有5行,请手工完成!)

即使您不希望定期使用新语言,学习新语言也绝不会完全失去。