混ぜるな危険!? ユニケージとxonshの融合

はじめに
こんにちは清水です!
この記事は、Xonsh Advent Calendar 2018 – Qiitaの6日目の記事です。
ユニケージとは
個人的な解釈ですがawk
で頑張らずともユニケージコマンド
を使用することで比較的楽にshell芸ができます。
一例ですがこんなことができます。
cat test.txt
shimizu nagano python
kondo kanagawa java
saito kanagawa python
maeda tokyo c
kojima aichi ruby
このファイルの2列目の値だけ欲しい。
awkで書くとこんな感じ。
cat test.txt | awk '{print $2}'
ユニケージコマンド(self)を使用するとこのようにかけます。
cat test.txt | self 2
僕はまだユニケージ初心者なのでより詳細な情報は以下の記事を参照してください。
- OSS版のリポジトリ
- ハンズラボが採用しているユニケージという謎テクノロジーについて 第1回
- ハンズラボが採用しているユニケージという謎テクノロジーについて 第2回
- ハンズラボが採用しているユニケージという謎テクノロジーについて 第3回
- ハンズラボが採用しているユニケージという謎テクノロジーについて 第4回
xonshとは
Pythonで作られたクロスプラットフォームのUnixライクなシェル言語とコマンドプロンプトです。
Pythonの対話モードとUnixコマンドが合体したみたいなものです。
個人的にshellなるべく書きたくないマンなのでPythonで書けるのは衝撃でした。
pipで入ります。使用するときはターミナルでxonsh
と打つと起動します。
pip install xonsh
例
$ files = $(ls).split()
$ print(files)
['Applications', 'CRM', 'Desktop', 'Documents', 'Downloads', 'Library', 'Movies', 'Music', 'Pictures', 'Public', 'Users', 'go', 'iCloud', 'Drive(アーカイブ)', 'path', 'pict', 'test.txt']
ライブラリも使用できます
$ import pandas as pd
$ df = pd.read_csv('test.csv')
$ df
id name from
0 1 shimizu nagano
1 2 kondo kanagawa
2 3 saito kanagawa NaN
3 4 maeda tokyo
4 5 kojima aichi
詳しくはこのアドベントカレンダーのリーダーである@vaaaaanquishの記事をご覧ください。
今回紹介すること
今回は謎技術ユニケージとxonshを組み合わせた「ひょっとしたら、これ使えるかもしれない(笑)」的なものを紹介していきます。
selfとのコラボ
先ほど使用したself
コマンド。このコマンドはawk '{print $1 $3}'
のように出力したいフィールドを指定することでそのフィールドを表示します。
$ cat test.txt
shimizu nagano python
kondo kanagawa java
saito kanagawa python
maeda tokyo c
kojima aichi ruby
$ cat test.txt | self 1 3
shimizu python
kondo java
saito python
maeda c
kojima ruby
xonshと組み合わせる
lang = $(cat test.txt | self 3).split()
print(lang)
['python', 'java', 'python', 'c', 'ruby']
いつ使うかよくわかりませんが、まぁ便利そう(pandas使ってもいいんですけどね)
殺人的なワンライナーも書けます。
$ user = {i.split()[0]: i.split()[1] for i in $(cat test.txt | self 1 3).split('\n')[:-1]} $ user
{'kojima': 'ruby',
'kondo': 'java',
'maeda': 'c',
'saito': 'python',
'shimizu': 'python'}
mdateとのコラボ
こののコマンドは開始日から終了日を全てスペース区切りで表示します。mdate -e <開始日(yyyymmdd)> <終了日(yyyymmdd)>
# 2018年の12月の日付を全て出す
$ mdate -e 20181201 20181231
20181201 20181202 20181203 20181204 20181205 20181206 20181207 20181208 20181209 20181210 20181211 20181212 20181213 20181214 20181215 20181216 20181217 20181218 20181219 20181220 20181221 20181222 20181223 20181224 20181225 20181226 20181227 20181228 20181229 20181230 20181231
xonshと組み合わせる
$ date_list = $(mdate -e 20181201 20181231).split()
$ print(date_list)
['20181201', '20181202', '20181203', '20181204', '20181205', '20181206', '20181207', '20181208', '20181209', '20181210', '20181211', '20181212', '20181213', '20181214', '20181215', '20181216', '20181217', '20181218', '20181219', '20181220', '20181221', '20181222', '20181223', '20181224', '20181225', '20181226', '20181227', '20181228', '20181229', '20181230', '20181231']
split
関数がいい感じにスペース区切り文字列を分割してくれるので20181201から20181231までのリストを生成できます。これは割と使えるのでなないかと個人的に思っています
dayslashとのコラボ
説明するよりも見た方が早いです。
$ echo 20181206 | dayslash yyyy/mm/dd 1
2018/12/06
いい感じに/
を入れてくれます。 1はフィールド指定です。
xonshと組み合わせる
$ slash_date = []
$ for date in date_list:
....... slash_date.append($(echo @(date) | dayslash yyyy/mm/dd 1))
$ print(slash_date)
['2018/12/01\n', '2018/12/02\n', '2018/12/03\n', '2018/12/04\n', '2018/12/05\n', '2018/12/06\n', '2018/12/07\n', '2018/12/08\n', '2018/12/09\n', '2018/12/10\n', '2018/12/11\n', '2018/12/12\n', '2018/12/13\n', '2018/12/14\n', '2018/12/15\n', '2018/12/16\n', '2018/12/17\n', '2018/12/18\n', '2018/12/19\n', '2018/12/20\n', '2018/12/21\n', '2018/12/22\n', '2018/12/23\n', '2018/12/24\n', '2018/12/25\n', '2018/12/26\n', '2018/12/27\n', '2018/12/28\n', '2018/12/29\n', '2018/12/30\n', '2018/12/31\n']
date_list
から受け取ったdateをdayslashで/
を入れてslash_date
に格納します。\n
が入ってしまうのは勘弁。
Jupyter Notebookで使用する
いつものようにJupyter Notebook
を使用して新規ファイルを作成しようとしたら,Xonsh
が入っていることに気付く。
どうやらpip install xonsh
するだけでJupyter
のカーネルに追加されるそうです。
ユニケージコマンドは果たして使用できるのか?
実行できた!どうやらローカルのコマンドも使用できるようです。
ちなみにGoで作成したコマンドも使用できました。