やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

TSVをSQLのselectで取得するツールqを使ってみた

 使えた。

インストール

install_q.sh

#!/bin/bash
# https://github.com/harelba/q
cd /tmp/work
wget https://raw.githubusercontent.com/harelba/packages-for-q/master/deb/q-text-as-data_1.7.1-2_all.deb
sudo dpkg -i q-text-as-data_1.7.1-2_all.deb

使ってみる

 TSVを作って全表示してみる。

echo -e 'Id\tName\n0\tA\n1\tB' > a.tsv
q -H -t "select * from a.tsv"
0 A
1   B

 特定のレコードを取得する。

q -H -t "select * from a.tsv where Id=1"     # 0   A
q -H -t "select * from a.tsv where Name='A'" # 1    B

 特定のカラムを取得する。

q -H -t "select Name from a.tsv where Id=1"   # B
q -H -t "select Id from a.tsv where Name='A'" # 0

 結合用テーブルを作成する。

echo -e 'Id\tAddress\n0\tA-Addr\n1\tB-Addr' > b.tsv

 テーブル結合してみる。

q -H -t "select * from a.tsv as a left join b.tsv as b where a.Id=b.Id"

 残念ながら結合キーが重複して出てしまう。

0 A   0   A-Addr
1   B   1   B-Addr

 わざわざselect句で出力項目をすべて指定してやらねばならない。

q -H -t "select a.Id, a.Name, b.Address from a.tsv as a left join b.tsv as b on a.Id=b.Id"
0 A   A-Addr
1   B   B-Addr

 ファイルでなく標準入力からデータを得る。(ファイル結合は不可?)

cat a.tsv | q -H -t "select * from -"

 OK!

  • TSVを使うときは-tオプションを使う(-d '\t', -d $'\t'ではダメ)
  • CSVを使うときは-d,オプションを使う(-d',', -d ','でも可)

情報源

対象環境

  • 2019-03-16
  • Raspbierry pi 3 Model B+
  • Raspbian stretch 9.0 2018-11-13
  • bash 4.4.12
$ uname -a
Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l GNU/Linux