とにかく行数が増えてくると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でしかできない計算をさせる。計算結果をアップデートできるのだけど、これまたここでアップデートをかけると下手すると丸一日かかっても終わらないので、またテキストで書き出し、本体と合体させる。
ほら誰でもできる・・・わけないか。