每20行后在第六列中递增1

时间:2013-10-04 03:26:08

标签: python sed awk

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

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

3 个答案:

答案 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

我假设

  • 不应更改该行的格式
  • 你想要col 6中的计数器,每20行递增一次
  • 没有标题或其他行,与您展示的不同