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 行まで続き、前のインクリメントによって 1 ずつ増加する必要があります。つまり、3+ 1 = 4

4

3 に答える 3

1

まず、ファイルをロードし、各行を分割します (列がタブで区切られていると仮定します)。

arrs = [ l.rstrip().split("\t") for l in open("your_file.tsv") ]

次に、配列をループし、20 行ごとに 6 列目 (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

私が想定し

  • 行の形式を変更しないでください
  • 20行ごとにインクリメントする列6のカウンターが必要です
  • あなたが示したものとは異なり、ヘッダーやその他の行はありません
于 2013-10-04T03:48:03.313 に答える