シェルスクリプトでファイルを読み込んで1000行ごとに文字を挿入する
開発をしていた際に、DBの更新が必要となった際のメモです!
条件や更新内容がそれぞれ違うUPDATE文を40万件流し込みする必要があった際に 実行中ずっとトランザクションをはってしまうと、アプリに支障が出てしまうため 1000行ごとにコミットすることになりました。
よし、とりあえず、1000行ごとに「commit;」って書いとくか!と思って、作業しようと思ったのですが まあ面倒だとおもって、シェルスクリプト作って、やったほうが早いし確実ってことで、急いで作ったものを、忘れないようにメモしておきます。 すぐ忘れるので・・
やりたいこと
・ファイル名を引数で渡して、1行ずつ読み込む
・1000行ごとに「commit;」という行を挿入する
コード
#!/bin/sh cnt=0 filename=$1 while read line do cnt=`expr $cnt + 1` if [ `expr $cnt % 1000` == 0 ]; then echo "commit;" >> "./${filename}.sql" echo $line >> "./${filename}.sql" else echo $line >> "./${filename}.sql" fi done < ${filename} echo 'finish!!'
実行
例えば、「sqlfile.sql」というファイルに文字を挿入していきたいときは、こんな感じで呼びます。
$test.sh sqlfile.sql
結果
同じディレクトリに「sqlfile.sql.sql」というファイルが作られます。(変なファイル名ですみません。。)
さいごに
あまり使う機会はないかもしれないですが、sqlファイルはなくても、テキストファイルでもなんでも代替できるので、もし機会があれば参考にしていただければと思います!
以上!