0

我知道这是一个非常基本的问题,但我无法解决这个问题。我有如下所示的文本文件:

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 行之后将第 6 列增加 1[包含 1 的列]。文件的格式应该改变。我怎样才能做到这一点?

小补充:我想在 20 行之后增加 1,而不是之前的增量。如果第 5 列以 1 开头,那么在 20 行之后它应该变成 2,这应该持续到 40 行,然后在 41 行它应该再次变成 3,它应该继续到 60,然后它应该按之前的 incr 增加 1,即 3+ 1 =4

4

3 回答 3

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。

于 2013-10-04T03:30:18.980 回答
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)
于 2013-10-04T03:31:00.537 回答
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

我假设

  • 行的格式不应该改变
  • 你想要一个在第 6 列中的计数器,每 20 行递增一次
  • 没有与您显示的标题或其他行不同的标题或其他行
于 2013-10-04T03:48:03.313 回答