エンジニア

2018.12.06

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

混ぜるな危険!? ユニケージと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

僕はまだユニケージ初心者なのでより詳細な情報は以下の記事を参照してください。

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で作成したコマンドも使用できました。

一覧に戻る