目的
何らかの作業対象のテキストやファイルがあり、指定した行ごとに任意の文字列を挿入したい場合を想定。
具体的にはSQLでの指定行でのCOMMIT。
恐らく各RDBMSのCLIでは便利な機能があると思いますが、機械的に実行してしまいたい時に利用します。
注意
本来はある一連の作業がすべて終わった場合に明示的にCOMMITすべきであり、意図しない変更の場合のROLLBACKが大変になるリスクがあります。
単純INSERTであっても、変更を元に戻せる安全なUPDATE文やDELETE文を用意しておいた方が良いです。
shellの動作について
改行コード込みの特定文字列をshell実行時引数で指定したかったのですが、今回はコードに直書き(ハードコーティング)しています。
スクリプト
説明用の桁数揃えシーケンスファイルの作成
#!/usr/bin/env bash# 4桁の数字を0埋めで0001 - 1500まで出力seq-f"%04g" 1500 > TARGET.txt
insert_break
#!/usr/bin/env bash# 使用方法:# TARGET.txtに200行ごとに文字列「COMMIT;\n」を挿入# sh insert_break.sh TARGET.txt 200temp_file=$(mktemp)basename_excluding_ext=`echo${1} | sed's/\.[^\.]*$//'`edited_txt=${basename_excluding_ext}.edited.txt
cat${1} | awk'{print $0} NR%'${2}'==0 {printf "COMMIT;\r\n"}'>${temp_file}# 作業後のファイル名を変更するmv${temp_file}${edited_txt}# 指定ファイルの行数が指定行数で割り切れない場合、最終行に同一の文字列を挿入するif[$((`wc-l${1} | awk'{print $1}'`%${2}))!= 0 ];then
sed-i-e'$ a COMMIT;'${edited_txt}fi
使用例
# 200行ごとに特定文字列(例 COMMIT;\n)の挿入
sh insert_break.sh TARGET.txt 200
# 200行付近cat TARGET.edited.txt | head-n 204 | tail-n 10
# 最終行付近tail TARGET.edited.txt
参考URL
n行ごとに改行を挿入するシェルスクリプト
bashで四則演算(+-×÷)や割り算のあまり(剰余)を求めるような簡単な計算をする | 俺的備忘録 〜なんかいろいろ〜
bashの変数展開によるファイル名や拡張子の取得 - Qiita