まとめ
awk で処理したデータを python の numpy で解析したい、といった場合のために stdout の出力を直接 numpy.loadtxt に突っ込む方法。
やりたいこと
たとえば名前と身長と体重のデータがあるとする。
input.dat
Yamada 160 50
Tanaka 170 60
Sakana 180 70
ここで数値部分だけを抜き出して身長と体重の相関をとりたい、とか思ったとする。Python でもそういう処理はできるけど、ファイルが大きくなると厄介なので awk を使い、数値だけになったデータを numpy.loadtxt で読み出す。つまりこんな感じ。
$ cat input.dat | awk '{print $2, $3}' > tmp.dat
$ python analysis.py tmp.dat
analysis.py
import sys
import numpy as np
data = np.loadtxt(sys.argv[1])
# このあと滅茶苦茶解析した
しかし中間ファイルが出るのが面倒。こういう感じにしたい。
$ python analysis.py input.dat
やること
まず Python 内でシェルコマンドを使うには subprocess を使う。最終的な出力を subprocess.PIPE に出して、それを numpy.loadtxt に入れる。
analysis.py
import sys
import subprocess
import numpy as np
p1 = subprocess.Popen(["cat", sys.argv[1]], stdout=subprocess.PIPE)
p2 = subprocess.Popen(["awk", "{print $2, $3}"], stdin=p1.stdout, stdout=subprocess.PIPE)
data = np.loadtxt( p2.stdout )
# このあと滅茶苦茶解析した
そのほか
上述のスクリプトはシェルコマンドを Python 内に書いたが、awk スクリプトの内容が毎回違うなどの事情で
$ cat input.dat | awk '{print $2, $3}' | python analysis.py
みたいにパイプでつなぎたい場合は fileinput
を使う。
analysis.py
import numpy as np
import fileinput
data = np.loadtxt(fileinput.input())
# このあと滅茶苦茶解析した