kuroの覚え書き

96の個人的覚え書き

tableへのデータアップデートを考える

とにかく行数が増えてくるとsqlのupdateのスピードがかなり負担になってくる。なのでテキスト処理だけで大方のカラム整形をやって、一部分だけsql文でなんとかする方法を考えた。特に、今後私の手を離れた後にメンテナンスが容易なように、スクリプトでちょいちょいと作業できるようにしておかないと。

#!/bin/sh

#ls /target/multiannovar/filtered/files > list.txt
#list.txtを引数として
# $ sh ./input_files.sh list.txt
#input1.txt(1-264のカラムを含む中間産物、ちゃんと処理できているか確認の為にとっておく)
#input2.txt(1-268のカラムを含むこのスクリプトの最終産物、sqliteにインポートする)
#tableの構成は元のデータ264カラム、その後ろにゲノムポジション等書式を整形したカラム、BAMファイル等の所在を示すカラム、最後がID

mkdir -p ./temp

filename=$1
for line in `cat ${filename}`
do
fname="${line##*/}"
#mitimpact24を除く
cut -f 1-87 $line > ./temp/output1.txt
cut -f 163-339 $line > ./temp/output2.txt
paste ./temp/output1.txt ./temp/output2.txt > ./temp/output3.txt
#ファイルからヘッダ行を除く
sed -e '1d' ./temp/output3.txt > ./temp/"$fname".temp.txt
done
#すべてのファイルを結合
cat ./temp/*.temp.txt > input1.txt

#念のため不要な部分を排除
cut -f 1-264 input1.txt > ./temp/output4.txt
#BAM_file等の情報を付与するためのサブデータベースを作成のためSampleName_phenotypeのカラムを切り出し
cut -f 1 input1.txt > samp.txt
#pos columnを作成
cut -f 2 input1.txt > ./temp/output5.txt #chr
cut -f 3 input1.txt > ./temp/output6.txt #start
paste -d : ./temp/output5.txt ./temp/output6.txt > ./temp/pos.txt #pos
#ucsc_start, ucsc_end, ucsc_posを作成
awk '{sum=$1-1; print sum}' ./temp/output6.txt > ./temp/ucsc_start.txt
awk '{sum=$1+99; print sum}' ./temp/output6.txt > ./temp/ucsc_end.txt
paste -d : ./temp/output5.txt ./temp/ucsc_start.txt > ./temp/output7.txt
paste -d - ./temp/output7.txt ./temp/ucsc_end.txt > ./temp/ucsc_pos.txt
#パーツをつなぎ直し
paste ./temp/output4.txt ./temp/pos.txt ./temp/ucsc_start.txt ./temp/ucsc_end.txt ./temp/ucsc_pos.txt> input2.txt

rm -r ./temp

こんな感じでテキスト処理のみで行える編集をまずはやってしまう。
次にBAMファイル等の所在を入れるためにsqliteのデータインポートでデータベースに追加するのだが、本ちゃんのデータベースでアップデートをかけると途方もない時間がかかるのでこの段階で生成したsamp.txtを使って作業用のダミーデータベースで行う。
参照するSampleName_phenotypeのカラムと、書き込みたいBAM_fileのカラムのみを持ったテーブルを定義しておき、そこにインポートする。

$ sqlite3 test.db
> .separator "\t"
> .import samp.txt temp
> .quit
$ python3 bam_update.py

できたデータベースに対しpythonスクリプトで順次カラムをアップデートする。importもpythonからできるようにしたいので、方法を調べる必用がある。
アップデートスクリプトbam_update.pyは

import sqlite3

dbpath = './test.db'

connection = sqlite3.connect(dbpath)

#connection.isolation_level = None

cursor = connection.cursor()

# UPDATE
cursor.execute('UPDATE temp set Bam_file = "path/to/target/BAM/file0001" where Samplename_phenotype like "%0001%"')
cursor.execute('UPDATE temp set Bam_file = "path/to/target/BAM/file0002" where Samplename_phenotype like "%0002%"')
.......

connection.commit()

connection.close()

こんなスクリプトで書き込む。
出来上がったデータベースから必要な部分を一旦テキストに書き出す。

$ sqlite3 test.db
> .mode tabs
> .output output_bam.txt
> SELECT BAM_file FROM temp;

先程できていたinput2.txtと合体

paste input2.txt output_bam.txt > input3.txt

今度は本ちゃんのデータベースにインポートで追加。

$ sqlite3 flask.data
> .separator "\t"
> .import input3.txt exome
> .mode tabs
> .output output_count
> SELECT..............;
> .output output_main.txt

ここでSQLでしかできない計算をさせる。計算結果をアップデートできるのだけど、これまたここでアップデートをかけると下手すると丸一日かかっても終わらないので、またテキストで書き出し、本体と合体させる。



ほら誰でもできる・・・わけないか。