我知道这是非常基本的问题,但我无法解决这个问题。我有如下所示的文本文件:
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>
首先,加载文件并拆分每一行(假设列由制表符分隔):
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 行递增一次的计数器
- 没有与您显示的标题或其他行不同的标题或其他行