2つのファイルに記述されている数値の差を表示する

dfの値の変化だけを見たい場合とか、もっと複雑な書式のテキストデータで数の変化だけを見たい場合、というものが存在する。

試しに書いてみた。

[pyg language=”python”]
#! /usr/bin/python
# encoding: UTF-8

import os,sys
import difflib
import re

def isnum(s):
if len(s)==0: return False
if s[0] in (“+”, “-“):
return s[1:].isdigit()
return s.isdigit()

def main(args):
p=re.compile(“([\+\-]?[0-9]+)”)
f1=p.split(file(args[0]).read())
f2=p.split(file(args[1]).read())
diff=difflib.ndiff(f1, f2, charjunk=lambda f: f.isspace())
d=filter(lambda f: f[0] in ” +-“, diff)
nm,np=[],[]
for i in d:
hdr,s=i[0],i[2:]
if hdr==”-” and isnum(s):
nm.append(int(s))
elif hdr==”+” and isnum(s):
np.append(int(s))
else:
for im, ip in zip(nm, np):
sys.stdout.write(str(ip-im).rjust(len(s)))
if i[2:].isdigit():
sys.stdout.write(“0″.rjust(len(s)))
else:
sys.stdout.write(s)
nm,np=[],[]
for im, ip in zip(nm, np):
sys.stdout.write(str(ip-im))

if __name__==”__main__”:
main(sys.argv[1:])
[/pyg]

例えば、以下のように使う。

zsh# python numdiff.py =(df) =(sleep 5; df)
Filesystem           0K-ブロック    使用   使用可 使用% マウント位置
/dev/vda0                    0    4   -4   0% /
tmpfs                        0         0         0   0% /dev/shm

5秒で/は4KB増えている。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です