備忘目的のメモ程度で残します。
背景
・あるファイルを1行単位で、かつファイル名は連番で分割保存したい
・連番については、表示順が適切になるようにゼロパディングをかけたい
・分割対象のファイルは4000行程度であった
・分割対象内の文字列には「\」が含まれており、これはそのまま残したい ←2020/03/13(Fri) 追記
シェルスクリプトとしてファイルを残すのもなんだか面倒だったので、コマンドだけで完結するように書いてみました。
(結局シェルファイルに書き出す内容と何ら変わっていないような気もしますが…)
実行環境
$ bash --version
GNU bash, バージョン 4.4.20(1)-release (x86_64-pc-linux-gnu)
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"
実行コマンド
count=1 ; load_target="hogehoge.txt" ; cat ${load_target} | while read line ; do echo ${line} > "${load_target}_`printf \"%04d\" ${count}`.txt" ; count=`expr ${count} + 1` ; done
上記では分割した文字列内に「\」が含まれていた場合、それはエスケープとして読み取られて消されてしまう
(json形式の値部分にHTMLタグ情報が入っているデータを扱っていて実際にそうなった…)
消されたくない場合、read
コマンドの-r
オプションを使えば良い模様
count=1 ; load_target="hogehoge.txt" ; cat ${load_target} | while read -r line ; do echo ${line} > "${load_target}_`printf \"%04d\" ${count}`.txt" ; count=`expr ${count} + 1` ; done
出力時の拡張子や0パディングの部分に関しては、もう少し工夫して変数展開や読み込み元ファイルの情報を抜き出しつつやった方が、読み込み元ファイル行数に合わせて潰しが効くし格好良さそうですが、とりあえず上記でも何とかなったので改良は後々できればいいかな程度です。
ワンライナーならもっともっとエレガントな書き方あるよ!!という方は後学のため是非ご意見頂けますと嬉しいです。。。