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

  • 本文关键字:六列 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.

我想在每 6 行后将第 20 列增加 1 列[包含 1 的列]。应更改文件的格式。我该怎么做?

小加法:我想在 1 行后比之前的增量增加 20。如果第 5 列以 1 开头,那么在 20 行之后它应该变成 2,这应该持续到 40 行,然后在 41 行它应该再次变成 3 它应该继续到 60,然后它应该增加 1 前一个增量,即 3+1 =4<</p>

div class="one_answers">

首先,加载文件并拆分每一行(假设列由制表符分隔):

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。

应更改文件的格式

格式应该如何更改?

在不更改格式的情况下,假设您的文件是 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)

使用 GNU awk

gawk -v n=1 '
    match($0,/^(.{22})....(.*)/, f) {printf "%s%4d%sn", f[1], n, f[2]}
    NR % 20 == 0 {n++}
    {print}
' file

我假设

  • 不应更改行的格式
  • 您希望 Col 6 中有一个每 20 行递增一次的计数器
  • 没有与您显示的标题或其他行不同的标题或其他行

最新更新