pythonを使って、awkでinput fileを編集しながらプログラムを回したい。
参考サイト様:
テキスト処理にたまに便利なAWK入門 - Qiita
awkで処理結果を元になったファイルに上書きする | 俺的備忘録 〜なんかいろいろ〜
フォーマット文字列内での波括弧のエスケープ - Qiita
from subprocess import call input_file = 'input_file' n_line = 999 replace_string = '"{:}"'.fomrat( 'string' ) cmd = "awk -i inplace '{{ if (NR == {:}) print {:} ; else print $0 }}' {:}".format( n_line, replace_string, input_file ) call( cmd, shell = True ) call( 'path to external program', shell = True )
上で書いたawkに流し込まれるコマンドは、
awk -i inplace '{ if (NR=999) print "string" ; else print $0 }' input_file
となる。
ポイントは以下の通り。
- awkのコマンドでクオーテションが必要なので、文字列表現としてダブルクオーテーションを用いている。
- 「-i inplace」で読み込んだファイルを上書きすることができる。
- pythonで中括弧を書くには、二個重ねて書く。
- NRはawkがファイルを読んでいる最中に更新される行番号変数。上のコマンドでは、NRがn_lineと同じときに行の内容をreplace_stringに置き換えるようにしている。つまりn_line行目を変更する。
- awkで文字列を書き込むには、ダブルクオーテーションが必要なので、「'"string"'」という形で文字列変数を宣言しておく。つまり、「"..."」を含めて文字列にしておく。
- 「$0」は一行分の行の内容全部である。したがって、興味のない部分はそのまま書き出しておけば良い。