Python 按顺序索引增加字符串

Python 按顺序索引增加字符串,python,bash,awk,sed,Python,Bash,Awk,Sed,在一个处理气候变量的文件中,涉及到小时的运行平均值,小时按顺序进行 是否存在一个sed/awk命令,该命令将占用文件中的小时(字符串),然后将其更改为2,以便下次读取文件时将其(202)等改为(204)等 请参阅下面添加到“i”的数字 timeprime = i + 569 'define climomslp = prmslmsl(t = 'timeprime' ) 我的目标是,在本例中,每次文件通过处理数据所涉及的其他命令运行时,将数量增加569 我旁边下一个想要的数字是 timep

在一个处理气候变量的文件中,涉及到小时的运行平均值,小时按顺序进行

是否存在一个
sed
/
awk
命令,该命令将占用文件中的小时(字符串),然后将其更改为2,以便下次读取文件时将其(202)等改为(204)等

请参阅下面添加到“i”的数字

 timeprime = i + 569 
 'define climomslp = prmslmsl(t = 'timeprime' ) 
我的目标是,在本例中,每次文件通过处理数据所涉及的其他命令运行时,将数量增加569

我旁边下一个想要的数字是

timeprime = i + 570 (where 569 is increased by one) 
在那之后

timeprime = i + 571 (where 570 is increased by one)
如果没有sed/awk命令来做这样的事情,那么在其他方法中是否有这样的事情


谢谢你的回答

您完全可以用Python(或者Perl、Ruby或您喜欢的任何其他脚本语言,但是您包含了一个Python标记)来实现这一点。例如:

#!/usr/bin/env python

import re
import sys
def replace(m):
    return '{}{}'.format(m.group(1), int(m.group(2))+2)
for line in sys.stdin:
    sys.stdout.write(re.sub(r'(timeprime = i \+ )(\d+)', replace, line))
希望正则表达式本身理解起来很简单:

(timeprime = i \+ )(\d+)


该函数可以将应用于匹配对象的字符串作为“替换”,而不是字符串。因此,不匹配的行将不变地打印;这样做的行将用匹配项替换相同的两部分,但第二部分替换为
int(number)+2

以下是使用awk的替代方法:

awk '/^timeprime = i [+]/{$5+=2} 1' file
从该文件开始:

$ cat file
timeprime = i + 569 
 'define climomslp = prmslmsl(t = 'timeprime' ) 
我们可以使用awk命令创建新文件:

$ awk '/^timeprime = i [+]/{$5+=2} 1' file
timeprime = i + 571
 'define climomslp = prmslmsl(t = 'timeprime' ) 
要使用新文件覆盖原始文件,请使用:

awk '/^timeprime = i [+]/{$5+=2} 1' file >file.tmp && mv file.tmp file
工作原理
  • /^timeprime=i[+]/{$5+=2}

    这将查找以
    ^timeprime=i+
    开头的行,在这些行上,第五个字段递增2

  • 1

    这是awk对打印行的神秘速记


一个带有预期输出的示例会更好。@hallettwx:您的问题需要所有相关信息,不要试图在注释中添加这些信息。@AvinashRaj-我提供了一个示例。谢谢你的建议。你的描述说你希望它增加2,但是你的例子显示它增加了1。其中一个和另一个一样简单,但你到底想要哪一个?@abarnert-一个就好了,谢谢。不幸的是,我不知道在我的脚本中具体在哪里实现这个,因为我对python比较陌生。它是python(脚本名),还是必须将该代码放入包含我希望自己递增的数字的脚本中?@hallettwx前者。这是一个完整的脚本,您可以将其另存为inctimeprime.py,然后只需将
| python inctimeprime.py
添加到您的shell管道中即可使用。嗯,当我针对想要修改的文件执行脚本时,遇到了麻烦,它挂在引入sys.stdin的地方。我不知道你是如何运行它的。我把它写成了一个过滤器,它从stdin读取数据并写入stdout。例如,如果您希望它将两个文件名作为命令行参数,从第一个文件名读取,然后写入第二个文件名,请使用
将open(sys.argv[1])作为fin,将open(sys.argv[2],'w')作为fout:
,然后将
作为fin:
中的行,然后使用
fout.write(…)
。官方教程对此进行了更详细的解释,或者,如果您向我们展示您的脚本,我可以向您展示如何将其融入其中。但除此之外,我所能做的就是猜测你想要什么。非常感谢你的帮助和指导,帮助我理解你在上面所做的事情!祝你晚上愉快。