過去の日記

2014-02-03 [長年日記]

Python ワンライナー [Python]

を最近仕事で使っているのでメモ。

まずは部品としてcat相当で。

python -c 'import sys; any(sys.stdout.write(l) for l in sys.stdin)'

sys.stdout.write は None を返すのでジェネレータを最後まで評価してもらうのにanyを使ってる。
追記:Python3 だと 改行を落としてprint関数。


cut 相当。

python -c 'import sys; any(sys.stdout.write("{}\t{}\n".format(d[2], d[0])) for d in (l.rstrip("\n").split("\t") for l in sys.stdin))'

末尾改行落とす→タブでsplit→変数dで受ける→3番目、1番目の項目だけをタブ区切りで書き込む。
rstripじゃなくてd[:-1]でいいし、format関数を使うのも全くの趣味。

スクリプト自体は'でくくり、リテラルは"でくくってる。Pythonは'も"も同じ意味なのが地味に嬉しい。


奇数行だけを取り出す。

python -c 'import sys; any(sys.stdout.write(l) for idx, l in enumerate(sys.stdin) if idx % 2 == 0)'

もちろんsedを使った方がよさそうなんだけど。


Twitterからくるjsonからidを取り出していく。

python -c 'import sys, json; any(sys.stdout.write("{}\n".format(j["id"])) for j in (json.loads(l.rstrip("\n")) for l in sys.stdin))'

カジュアルにはjqを使ってたのだけど、64bit整数を扱えなかったりする*1ので、こんな感じのスクリプトに至っている。
存在するかどうか不明なフィールドは get メソッドを使う。

*1 JSON仕様的には正しい。