nano_exit

基礎的なことこそ、簡単な例が必要だと思うのです。

pythonでawkを呼んでファイルを編集する。

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」は一行分の行の内容全部である。したがって、興味のない部分はそのまま書き出しておけば良い。