Pythonで表の0埋め

ある解析値の時間変化を出して、それぞれをpasteコマンドやjoinコマンドを使ってつなげることがよくあります。しかし、その時間スケールがそれぞれの結果で合わないとき、たとえば、一方は1000行までしかないのにもう一方は2000行まである時があります。そこで1001~2000分を削ってしまいたくないときはjoinコマンドの-aを使えば損失なく結合できますね。だた、そうやっていくつかの列を結合しても、graceでプロットしようとすると読み込んでくれません。graceを使う場合は各列の行数が同じでないといけないようです。(言い換えると、各行の列数が同じでないといけないということ。)

そこで、空白を0で埋めるというpythonスクリプトを書きました。

例えば、

1 32
2 16
3 8
4 4
5 2
1 15
2 10
3 5

この2つのデータをjoin -a 1 data1.txt data2.txtした後に、穴が空いた所を0で埋めてくれます。

1 32 15
2 16 10
3 8 15
4 4 0
5 2 0

こんな感じ。

実際にはこういう風に使います。

join -a 1 [data1] [data1] > [input]
python fillzero.py [input] [maxcolumn]

で、pythonスクリプト

#!/usr/bin/bash
# -*- coding:utf-8 -*-

import sys 
import os

if __name__ == "__main__":
  argvs = sys.argv
  argvc = len(argvs)
  if argvc != 3:
    print "python fillzero.py [input] [maxcolumn]"
    exit()
  else:
    if not(os.path.exists(argvs[1])):
      print "file NOT exists"
    else:
      filename = argvs[1]
      maxcol = int(argvs[2])
      #print "file: " + filename

      f = open(filename, 'r')
      for line in f:
        if line.strip() != "": 
          if line[0] != "@" and line[0] != "#":
            col = line.split()
            if len(col) > maxcol:
              print "Over column (" + str(len(col)) + " > " + str(maxcol) + " )"
              print "string: " + line
              exit()
            elif len(col) < maxcol:
              print line[:-1],
              for i in range(maxcol - len(col)):
                print " 0",
              print ""
            else: 
              print line,
          else: # comment line
            print line,
      f.close()