the opy book / 6. オプション
Fri Nov 1 08:58:29 JST 2019 (modified: Thu Jan 2 14:57:33 JST 2020)
views: 1914, keywords: この記事は最終更新日が5年以上前のものです。
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モジュールの解釈に従う様式のものが解釈できるということになります。
次の例はa
、b,
、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]
が出力する文字列をバッファに貯めて出力を遅延させるからです。