シェルスクリプトと前処理 Part 2

シェルコマンドを用いたデータの取得

公開日: 2020-12-25

概要  
目的 シェルコマンドを用いたデータの取得
実行環境 Ubuntu 20.04
参考 Data Science at the Command Line

1. このノートのスコープ

  • Obtain data from the Internet
  • Query databases
  • Connect to Web APIs
  • Decompress files
  • Convert Microsoft Excel spreadsheets into usable data

利用するデータの準備

docker imageを立ち上げた後、home directory直下にレポジトリーから関連レポジトリーをgit cloneします。

1
2
3
4
5
6
$ git clone --no-checkout https://github.com/jeroenjanssens/data-science-at-the-command-line
$ cd ./data-science-at-the-command-line
$ git config core.sparsecheckout true
$ echo book/1e/data/ch03/data/ > .git/info/sparse-checkout
$ echo book/1e/data/.data/ >> .git/info/sparse-checkout
$ git read-tree -m -u HEAD

2. Decompressing Files

バイトサイズが大きいファイルを取扱う際、ファイルを圧縮(ディレクトリの場合はアーカイブ)するケースが多いです。そうすることで、記憶領域の節約やfile transfer速度の向上が見込めます。同じ値を繰り返し保有しているファイル(例:the words in a text file や the keys in a JSON file)は圧縮に適しているとされます。圧縮でよく使用される拡張子はtar.gz, .zip, や .rarです。

ファイルの圧縮・展開コマンド

Linuxではよく使われるファイルの圧縮形式として4種類あります。

拡張子 圧縮コマンド 展開コマンド
.zip zip unzip
.gz gzip gunzip
.bz2 bzip2 bunzip2
.xz xz unxz

zipコマンド

zipはWindows環境で特にポピュラーな圧縮形式で、複数のファイルを圧縮して1つのファイルにすることができます。圧縮スピードや展開スピード、圧縮率はgzipに負けます。

Syntaxとオプション

1
$ zip [option] [圧縮後のファイル名] [ファイル名]
オプション 説明
-r 指定したディレクトリを再帰的に圧縮する
-x ファイル名 アーカイブに含めないファイルを指定する
-e 暗号化したアーカイブを作成し展開時に必要なパスワードを設定する
-j ディレクトリ名なしで格納する

解凍先のディレクトリを指定する場合は、下記のようにします。

1
$ unzip hoge.zip -d foo

gzipコマンド

複数のファイルをまとめるという“アーカイブ機能”はなく、1つ1つのファイルに対して機能します。gzipコマンドで圧縮されたファイルには、元のファイル名に拡張子「.gz」が追加されます。

Syntaxとオプション

1
$ gzip [option] [ファイル名]
オプション 説明
-1~-9 圧縮レベル(「-1」が低圧縮率で高速、「-9」は高圧縮率だが低速)
-c 結果をファイルではなく標準出力へ出力する(主にパイプで別コマンドに渡す際に使用)
-d ファイルを展開する(gunzipのデフォルト)
-f すでに圧縮ファイルが存在しても上書きする
-k 圧縮後にもとのファイルを削除しない(圧縮前/伸張前のファイルを残す)
-r ディレクトリを再帰的に処理する
-t 圧縮ファイルをテストする

bzip2コマンド

gzip/gunzipコマンド同様、1つ1つのファイルに対して機能します。複数のファイルをまとめたい場合は、tarコマンドと組み合わせる手法が一般的です。拡張子には.bz2を使用します。gzipより新しく、圧縮率も高い形式です。ただし、xzコマンドのほうが圧縮率は高い。

Syntaxとオプション

1
$ bzip2 [option] [ファイル名]
オプション 説明
-1~-9 圧縮レベル(「-1」が低圧縮率で高速、「-9」は高圧縮率だが低速)
-c 結果をファイルではなく標準出力へ出力する(主にパイプで別コマンドに渡す際に使用)
-d ファイルを展開する(bunzip2のデフォルト)
-f すでに圧縮ファイルが存在しても上書きする
-k 圧縮後にもとのファイルを削除しない(圧縮前/伸張前のファイルを残す)
-t 圧縮ファイルをテストする

xzコマンド

gzipコマンド、gunzipコマンド同様、1つ1つのファイルに対して機能します。複数のファイルをまとめたい場合は、tarコマンドと組み合わせる手法が一般的です。

Syntaxとオプション

1
$ xz [option] [ファイル名]
オプション 説明
-0~-9 圧縮レベル(「-0」が低圧縮率で高速、「-9」は高圧縮率だが低速)
-c 結果をファイルではなく標準出力へ出力する(主にパイプで別コマンドに渡す際に使用)
-d ファイルを展開する(unxzのデフォルト)
-f すでに圧縮ファイルが存在しても上書きする
-k 圧縮後にもとのファイルを削除しない(圧縮前/伸張前のファイルを残す)
-t 圧縮ファイルをテストする
-l 圧縮ファイル内のファイル一覧を表示する

アーカイブの作成と展開

ディレクトリを圧縮する場合は、予め複数のファイルを一つのファイルにまとめたアーカイブを作成し、そのアーカイブファイルを圧縮します。アーカイブの管理にはtarコマンドを使います。

Syntaxとオプション

1
$ tar [option] [ファイル名] [ディレクトリ]
オプション 説明
-c アーカイブを作成する
-x アーカイブを展開する
-t アーカイブ内をリスト表示する
-f ファイル名 アーカイブファイルを指定する
-z gzipを利用して圧縮/展開する
-j bzip2を利用して圧縮/展開する
-J xzを利用して圧縮/展開する
-v 処理したファイル名などの詳細情報を表示する
-r アーカイブの最後にファイルを追加する
-C ディレクトリ処理を開始する前に指定したディレクトリに移動する

圧縮アーカイブの作成をします。

1
$ tar -zcf test_gzip.tar.gz data-science-at-the-command-line/

圧縮ファイルの中身のファイル一覧を表示したい場合は

1
$ tar -ztf test_gzip.tar.gz

3. Converting Microsoft Excel Spreadsheets

前提条件:csvkitのインストール

最新版は1.0.5だが、Python経由のインストール環境を整備するのがめんどくさいのでapt package manager経由でインストールする。

1
2
3
4
5
6
7
8
9
10
$ apt-cache policy csvkit
csvkit:
  Installed: 1.0.2-2
  Candidate: 1.0.2-2
  Version table:
 *** 1.0.2-2 500
        500 http://jp.archive.ubuntu.com/ubuntu focal/universe amd64 Packages
        500 http://jp.archive.ubuntu.com/ubuntu focal/universe i386 Packages
        100 /var/lib/dpkg/status
$ sudo apt install csvkit

xlsxファイルをcsvファイルに変換する

imdb-250.xlsximdb-250.csvに変換します。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ cd
$ in2csv /home/dst/data-science-at-the-command-line/book/1e/data/ch03/data/imdb-250.xlsx > imdb-250.csv
$ head imdb-250.csv | xsv table
Title,title trim,Year,Rank,Rank (desc),Rating,New in 2011 from 2010?,2010 rank,Rank Difference,j
Sherlock Jr. (1924),SherlockJr.(1924),1924,221,30,8,True,,,
The Passion of Joan of Arc (1928),ThePassionofJoanofArc(1928),1928,212,39,8,True,,,
His Girl Friday (1940),HisGirlFriday(1940),1940,250,1,8,True,,,
Tokyo Story (1953),TokyoStory(1953),1953,248,3,8,True,,,
The Man Who Shot Liberty Valance (1962),TheManWhoShotLibertyValance(1962),1962,237,14,8,True,,,
Persona (1966),Persona(1966),1966,200,51,8,True,,,
Stalker (1979),Stalker(1979),1979,243,8,8,True,,,
Fanny and Alexander (1982),FannyandAlexander(1982),1982,210,41,8,True,,,
Beauty and the Beast (1991),BeautyandtheBeast(1991),1991,249,2,8,True,,,

カラムを絞って表示させます。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ head imdb-250.csv | xsv select Title,Year,Rating | csvlook
| Title                                   |  Year | Rating |
| --------------------------------------- | ----- | ------ |
| Sherlock Jr. (1924)                     | 1,924 |      8 |
| The Passion of Joan of Arc (1928)       | 1,928 |      8 |
| His Girl Friday (1940)                  | 1,940 |      8 |
| Tokyo Story (1953)                      | 1,953 |      8 |
| The Man Who Shot Liberty Valance (1962) | 1,962 |      8 |
| Persona (1966)                          | 1,966 |      8 |
| Stalker (1979)                          | 1,979 |      8 |
| Fanny and Alexander (1982)              | 1,982 |      8 |
| Beauty and the Beast (1991)             | 1,991 |      8 |

4. Querying Relational Databases

relational databasesをコマンドラインから簡単に操作可能とすつ関数の一つにsql2csvがあります。これはPython SQLAlchemy packageをベースとしており、MySQL, Oracle, PostgreSQL, SQLite, Microsoft SQL Server, and Sybaseといった様々なデータベースに対応することができます。一例は以下:

1
$ sql2csv --db 'sqlite:////home/dst/data-science-at-the-command-line/book/1e/data/ch03/data/iris.db' --query 'SELECT * FROM iris WHERE sepal_length > 7.5'

sql2csvのSyntax

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
usage: sql2csv [-h] [-v] [-l] [-V] [--db CONNECTION_STRING] [--query QUERY]
               [-e ENCODING] [-H]
               [FILE]

Execute an SQL query on a database and output the result to a CSV file.

positional arguments:
  FILE                  The file to use as SQL query. If both FILE and QUERY
                        are omitted, query will be read from STDIN.

optional arguments:
  -h, --help            show this help message and exit
  -v, --verbose         Print detailed tracebacks when errors occur.
  -l, --linenumbers     Insert a column of line numbers at the front of the
                        output. Useful when piping to grep or as a simple
                        primary key.
  -V, --version         Display version information and exit.
  --db CONNECTION_STRING
                        An sqlalchemy connection string to connect to a
                        database.
  --query QUERY         The SQL query to execute. If specified, it overrides
                        FILE and STDIN.
  -e ENCODING, --encoding ENCODING
                        Specify the encoding of the input query file.
  -H, --no-header-row   Do not output column names.

Examples

DBからQUERYでデータを呼び出し、csvに出力する。

1
2
3
4
5
6
7
8
9
$ sql2csv --db 'sqlite:////home/dst/data-science-at-the-command-line/book/1e/data/ch03/data/iris.db' --query 'SELECT * FROM iris WHERE sepal_length > 7.5' >> test.csv
$ cat test.csv 
sepal_length,sepal_width,petal_length,petal_width,species
7.6,3.0,6.6,2.1,Iris-virginica
7.7,3.8,6.7,2.2,Iris-virginica
7.7,2.6,6.9,2.3,Iris-virginica
7.7,2.8,6.7,2.0,Iris-virginica
7.9,3.8,6.4,2.0,Iris-virginica
7.7,3.0,6.1,2.3,Iris-virginica

5. Downloading from the Internet

インターネット経由でデータを取得する際、curlコマンドを使うケースが多いです。例えば、

1
2
3
4
5
6
7
8
9
$ curl -s http://www.gutenberg.org/files/76/76-0.txt | head -n 10

The Project Gutenberg EBook of Adventures of Huckleberry Finn, Complete
by Mark Twain (Samuel Clemens)

This eBook is for the use of anyone anywhere at no cost and with almost
no restrictions whatsoever. You may copy it, give it away or re-use
it under the terms of the Project Gutenberg License included with this
eBook or online at www.gutenberg.net

curlコマンドの主なオプション

短いオプション 長いオプション 意味  
-O –remote-name 転送元と同じ名前で保存する(「-O」または「-o」を指定しない場合は標準出力)  
-o –output ファイル名 保存するファイル名(「-O」または「-o」を指定しない場合は標準出力)  
  –create-dirs 「-o」でディレクトリを指定した際、そのディレクトリがない場合は作成する  
-# –progress-bar 進行状況を「#」文字で表示する  
-f –fail 失敗してもエラーメッセージを表示しない  
-s –silent 実行中のメッセージを表示しない  
-4 –ipv4 IPv4だけを使う  
-6 –ipv6 IPv6だけを使う  
-A –user-agent “Webブラウザ” 実行時のWebブラウザ名を指定する  
-e –referer URL リンク元のURLを指定する
-b –cookie “名前=値” 実行時のクッキーを指定する  
anyauth 複数の認証方法を試す(個別に「–basic」「–digest」「–ntlm」「–negotiate」を指定可)  
-C –continue-at バイト数 転送の続きから行う際に、何バイト目から再開するか指定する(「-C -」で自動計算)  
-d –data “データ” データをPOSTしたのと同じように送る  
-F –form “名前=値” 指定した内容をフォームから入力したのと同じように送る  
  –data-urlencode “データ” データをURLエンコードして送る  

実行進捗状況の表示と-s

curlは実行状況と完了予定時間をデフォルトで表示します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ curl http://www.gutenberg.org/files/76/76-0.txt | head -n 10
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
The Project Gutenberg EBook of Adventures of Huckleberry Finn, Complete
by Mark Twain (Samuel Clemens)

This eBook is for the use of anyone anywhere at no cost and with almost
no restrictions whatsoever. You may copy it, give it away or re-use
it under the terms of the Project Gutenberg License included with this
eBook or online at www.gutenberg.org

Title: Adventures of Huckleberry Finn, Complete
  6  601k    6 41870    0     0  30968      0  0:00:19  0:00:01  0:00:18 30968
curl: (23) Failed writing body (2554 != 16384)

curl出力結果をファイルに保存する

リダイレクトを用いる場合とオプションで指定する場合の2つがあります。リダイレクトを用いる場合は、

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ curl -s http://www.gutenberg.org/files/76/76-0.txt > finn.txt
$ less finn.txt
The Project Gutenberg EBook of Adventures of Huckleberry Finn, Complete
by Mark Twain (Samuel Clemens)

This eBook is for the use of anyone anywhere at no cost and with almost
no restrictions whatsoever. You may copy it, give it away or re-use
it under the terms of the Project Gutenberg License included with this
eBook or online at www.gutenberg.org

Title: Adventures of Huckleberry Finn, Complete

Author: Mark Twain (Samuel Clemens)

Release Date: August 20, 2006 [EBook #76]
Last Updated: February 23, 2018
Language: English
(略)

オプションで指定する場合でかつディクトリ作成を同時に実行したい場合は以下、

1
$ curl -s http://www.gutenberg.org/files/76/76-0.txt -o /data/finn.txt --create-dirs 

curlコマンドを用いたレクチャーノートのインストール

wgetで実行する方法もありますが今回はcurlを用います。MITのEconometrics course 14-382のpdf形式のレクチャーノートをダウンロードします。

レクチャーノートのURLは

1
https://ocw.mit.edu/courses/economics/14-382-econometrics-spring-2017/lecture-notes/MIT14_382S17_lec<数字>.pdf

という形式になっています。これをlecturenote_<数字>.pdfという形式でダウンロードする場合は以下のようなコマンドになります。

1
2
$ curl -o lecturenote_#1.pdf "https://ocw.mit.edu/courses/economics/14-382-econometrics-spring-2017/lecture-notes/MIT14_382S17_lec[1-20].pdf"
$ find ./*.pdf -size -40k | xargs rm

最後のfind ./*.pdf -size -40k | xargs rmはゴミファイルを削除するためのコマンドです。

APPENDIX: パイプ

Linuxでは、パイプ, |を用いることで、コマンドの出力先を別コマンドへつなぐことができます。

1
% コマンド1 | コマンド2

一例として,ファイルの数を数えたいときは

1
% ls | wc -l

APPENDIX: リダイレクト

コマンドの実行結果をファイルに保存したいときに用いるのがリダイレクトです。

書式 説明
コマンドA > コマンドB コマンドAの実行結果をコマンドBで処理する
コマンド > ファイル コマンドの実行結果をファイルに保存する
コマンド >> ファイル コマンドの実行結果をファイルに追記する(ファイル末尾に追加する)
コマンド &> ファイル コマンドの実行結果とエラー表示をファイルに保存する


Share Buttons
Share on:

Feature Tags
Leave a Comment
(注意:GitHub Accountが必要となります)