the opy book / 6. オプション

Fri Nov 1 08:58:29 JST 2019 (modified: Thu Jan 2 14:57:33 JST 2020)
views: 1679, keywords: この記事は最終更新日が4年以上前のものです。

6.1 -s(string mode)

 -sを指定すると、レコードをフィールドに分割する際に数字への変換が行われません。これは、次のような処理に便利です。

$ echo 100 JPY | opy '[F1+F2]'
   (エラー!!)
   ### -sをつけると100が文字列として解釈される ###
   $ echo 100 JPY | opy -s '[F1+F2]'
   100JPY

 また、-sをつけると数字への変換処理がなくなるので、処理が早く終わります。例を示します。

$ time seq 1 0.1 10000 | opy -s '[F1,"円"]' > /dev/null

   real    0m1.604s
   user    0m1.538s
   sys 0m0.082s
   $ time seq 1 0.1 10000 | opy '[F1,"円"]' > /dev/null

   real    0m2.157s
   user    0m2.066s
   sys 0m0.098s

6.2 -v(シェル変数の取り込み)

 -vを利用すると、bashなどで定義されている変数をopy内に取り込むことができます。例を示します。

$ a=abc
   $ opy -v "b=$a" 'B:[b*2]'
   abcabc

-v "b=$a"で、シェルの変数aの文字列をPythonのbという変数として取り込めます。

 シェルの変数に整数、小数として解釈できる文字列が入っている場合、型変換が起こります。例を示します。

$ a=11
   $ opy -v "b=$a" 'B:[b**2]'
   121
   $ a=3.14
   $ opy -v "c=$a" 'B:[math.cos(c)]'
   -0.9999987317275395

ただし、-sと併用すると、型変換は起こりません。次の例では、123は文字列として解釈されます。

$ a=123
   $ opy -v "a=$a" -s 'B:[a*2]'

 二つ以上の変数を-vで取り込むことも可能です。この場合、変数を取り込む式の前に一つずつ-vを指定します。例を示します。

$ opy -v "a=$a" -v "b=$b" 'B:[a,b]'
   abc 111

6.3 -i, -I, -o(区切り文字の指定)

 レコードを読み込むときの区切り文字は、-iオプションで変更できます。

$ echo 'a,b,c' | opy -i , '[F2]'
   b

空文字を指定すると、文字ごとにフィールド分割されます。

$ echo abc | opy -i '' '[F2]'
   b

 -Iは区切り文字に正規表現を用いるときに使います。例を示します。正規表現[,@]で、「,あるいは@で区切る」という意味になります。

$ echo a,b@c | opy -I '[,@]' '[F1,F2,F3]'
   a b c

 -oは、出力の区切り文字の指定に用います。上の例の出力を=で区切ってみたのが次の例です。

$ echo a,b@c | opy -I '[,@]' -o '=' '[F1,F2,F3]'
   a=b=c

6.4 -c, -C(CSVの読み込み・書き出し)

 -cを使うとCSV(comma separated values)を読み込むことができます。CSVには方言がありますが、opyの場合は内部でcsvモジュールのreaderメソッドを使うので、csvモジュールの解釈に従う様式のものが解釈できるということになります。

 次の例はab,c"という3つの値を有するレコードを入力した例です。

$ echo 'a,"b,","c"""' | opy -c '[F1,F2,F3]'
   a b, c"

 -c-sは併用できます。次の例は-sがあるときとないときの比較です。

$ echo 1,2,3 | opy -s -c '[F1+F2+F3]'
   123
   $ echo 1,2,3 | opy -c '[F1+F2+F3]'
   6

 大文字の-Cオプションを使うと、CSV書き出しができます。

$ echo '1 2 3' | opy -C True
   "1","2","3"
   $ echo '1 "2,3" 3 "' | opy -C True
   "1","""2,3""","3",""""

6.5 -b(バッファモード)

 opyは基本、各行の処理が終わると次の行を読む前に標準出力に出力(フラッシュ)します。-bを使うと、この毎行のフラッシュを無効にできます。次の例は100万までの数字をただ出力して捨てるという処理ですが、-bをつけた方が早く処理が終わります。

$ time seq 1000000 | opy -b '[F1]' > /dev/null

   real    0m11.364s
   user    0m11.348s
   sys 0m0.218s
   $ time seq 1000000 | opy '[F1]' > /dev/null

   real    0m14.039s
   user    0m13.608s
   sys 0m0.627s

さらに-sをつけると、より高速化できます。

$ time seq 1000000 | opy -sb '[F1]' > /dev/null

   real    0m10.519s
   user    0m10.557s
   sys 0m0.161s

 -bをつける場合、前後のコマンドの挙動によって、思い通りの出力が得られないことがあります。 例えば次の例は、日本語環境のMacで10秒ごとにdateの出力を表示するものですが、 -bをつけると出力が10秒ごとに得られません。

$ while sleep 1 ; do date ; done | opy -b '[F5]' | grep 0秒
   (10秒待っても何も出てこない)
   ### -bがないと10秒ごとに出力が得られる ###
   $ while sleep 1 ; do date ; done | opy '[F5]' | grep 0秒
   13時03分50秒
   13時04分00秒
   ・・・

これは、opy -b '[F5]が出力する文字列をバッファに貯めて出力を遅延させるからです。

ノート   このエントリーをはてなブックマークに追加 
 

やり散らかし一覧

記事いろいろ