このサイズの連想配列の場合、Bashは間違ったツールです。使用を検討して言語(PerlやPython、Rubyの、PHP、JS、などなど)を使用すると、通常のbashと一緒にインストールされsqlite3
SQLデータベースを使用することができバッシュのみ環境については
より適しています。 (ただしPOSIXではありません)
まず、csvファイルからデータベースを作成します。 (exp.db
は、この時点では存在してはいけません)があり、この(PerlやPython、Rubyの、GUIツール)を行うには多くの方法があるが、これはsqlite3のcommand line shellで対話的に行うのに十分に簡単です:
$ sqlite3 exp.db
SQLite version 3.19.3 2017-06-27 16:48:08
Enter ".help" for usage hints.
sqlite> create table mapping (id integer primary key, n integer);
sqlite> .separator ","
sqlite> .import /tmp/mapping.csv mapping
sqlite> .quit
あるいは、パイプSQL文:
#!/bin/bash
cd /tmp
[[ -f exp.db ]] && rm exp.db # must be a new db as written
echo 'create table mapping (id integer primary key, n integer);
.separator ","
.import mapping.csv mapping' | sqlite3 exp.db
(注意:書かれたとして、exp.db
が存在していなければならないか、INSERT failed: UNIQUE constraint failed: mapping.id
を取得するあなたはとてもデータベースexp.db
が更新ではなく、csvファイルで作成され、それを書くことができますが、あなたはおそらくしたいと思います。 Python、Perl、Tcl、Rubyなどの言語を使用してください)
いずれの場合も、最初の列を2番目の列にマッピングする索引付きデータベースが作成されます。インポートは、少しの間(198メガバイトの例で15〜20秒)かかりますが、それは、インポートcsvファイルから新しい永続的なデータベースを作成します。
$ ls -l exp.db
-rw-r--r-- 1 dawg wheel 158105600 Nov 19 07:16 exp.db
その後すばやくバッシュからその新しいデータベースを照会することができます
$ time sqlite3 exp.db 'select n from mapping where id=1350044575'
1347465036
real 0m0.004s
user 0m0.001s
sys 0m0.001s
これは、古いiMacでは4ミリ秒かかります。
あなたのクエリのバッシュ変数を使用したい場合は、必要に応じて使用すると、クエリ文字列を連結または構築することができます。
$ q=1350044575
$ sqlite3 exp.db 'select n from mapping where id='"$q"
1347465036
とDBが永続的であることから、あなただけにcsvファイルのファイルの時刻を比較することができますあなたはそれを再作成する必要があるかどうかをテストするためのDBファイル:
if [[ ! -f "$db_file" || "$csv_file" -nt "$db_file" ]]; then
[[ -f "$db_file" ]] && rm "$db_file"
echo "creating $db_file"
# create the db as above...
else
echo "reusing $db_file"
fi
# query the db...
より:
- sqlite tutorial
- sqlite home
bashはこのようなタスクに適していません。適切なプログラミング言語を使用する方が良いでしょう。 – janos
あなたの問題は基本的です。間違ったツールを選択した... – HuStmpHrrr
'sqlite3'または' mysql'がより適しています。 – dawg