the opy book / 6. オプション

Fri Nov 1 08:58:29 JST 2019 (modified: Thu Jan 2 14:57:33 JST 2020)
views: 716, keywords:

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

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]が出力する文字列をバッファに貯めて出力を遅延させるからです。







このサイトではGoogle Analyticsやその他ソーシャルボタンのためにCookieを使用しています。もし同意いただけない場合はブラウザでクッキーを無効にして閲覧をお願いします。This site uses cookies for Google AdSense and some social buttons. If you cannot accept our use of cookies, please disable cookies on your browser.