我知道这是一个非常基本的问题,但我无法解决这个问题。我有如下所示的文本文件:
ATOM 1 O1 UNK X 1 2.535 8.998 3.050 0.00 0.00 TEST
ATOM 2 H1 UNK X 1 1.706 9.330 3.256 0.00 0.00 TEST
-------------------- up to 5120 lines.
我想在每20行[包含1的列]之后将第6列增加1。应该更改文件的格式。我怎样才能做到这一点?
小补充:我希望在20行之后增加1而不是之前的增量。如果第5列以1开头,那么在20行之后它应该变为2,这应该继续最多40行然后在41行它应该再次变为3它应该继续到60然后它应该由先前的增加1增加,即3+ 1 = 4
答案 0 :(得分:1)
首先,加载文件并拆分每一行(假设列由制表符分隔):
arrs = [ l.rstrip().split("\t") for l in open("your_file.tsv") ]
然后,循环遍历数组,并将每第20行中的第六列(索引为5)递增1:
val = 0
for i in range(len(arrs)):
if i % 20 == 0:
arrs[i][5] = str( int(arr[i][5]) + val )
val += 1
最后,您可以重新输出文件:
open("your_modified_file.tsv", "w").write( "\n".join(arrs) )
我假设您正在使用Python 2.x。
答案 1 :(得分:1)
应更改文件的格式
如何更改格式?
不改变格式,并假设您的文件 TAB 分开(似乎是这种情况):
with open('path/to/input') as infile, open('path/to/output', 'w') as outfile:
for i,line in enumerate(infile):
if not i%20:
splits = line.strip().split()
splits[5] = str(int(splits[5])+1)
line = '\t'.join(splits) + '\n'
outfile.write(line)
答案 2 :(得分:1)
使用GNU awk
gawk -v n=1 '
match($0,/^(.{22})....(.*)/, f) {printf "%s%4d%s\n", f[1], n, f[2]}
NR % 20 == 0 {n++}
{print}
' file
我假设