0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【bash】ファイルを1行ずつ連番ファイルに書き出すコマンド【ワンライナー(?)】

Last updated at Posted at 2020-03-12

備忘目的のメモ程度で残します。

背景

・あるファイルを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パディングの部分に関しては、もう少し工夫して変数展開や読み込み元ファイルの情報を抜き出しつつやった方が、読み込み元ファイル行数に合わせて潰しが効くし格好良さそうですが、とりあえず上記でも何とかなったので改良は後々できればいいかな程度です。

ワンライナーならもっともっとエレガントな書き方あるよ!!という方は後学のため是非ご意見頂けますと嬉しいです。。。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?