SESエンジニアになって2つ目の現場で出会った若きチームリーダが、サクラエディタとExcelが大好きな人っだったお話。
サクラエディタとExcelで大抵のことはできる?
エンジニアの日常でよくありそうな場面、皆さんならどうします?
このテストデータを100個にしといて。よろしく。
やりたいことは、手元にある1つのデータ「TEST_FILE_0000.csv」をコピーして、ファイル名を「TEST_FILE_0001.csv」「TEST_FILE_0002.csv」と変えていきたい、ということですね。
若きリーダーは、サクラエディタとExcelの2つを駆使して、ゼロパディングされた番号(0000)を含んだテストファイルのコピーコマンドを100個作りだしたのです。
こんな感じ、
cp TEST_FILE_0000.csv TEST_FILE_0001.csv
cp TEST_FILE_0000.csv TEST_FILE_0002.csv
cp TEST_FILE_0000.csv TEST_FILE_0003.csv
// 中略
cp TEST_FILE_0000.csv TEST_FILE_0100.csv
Excelのフィル機能を使えば連番を作り出すことは簡単ですし、サクラエディタには矩形選択/挿入ができる素晴らしい機能がありますので、それらを使って100個のコマンドラインを作り出すことができます。
しかも若きリーダはショートカットキーの魔術師でしたので、1分程度で100個のコマンドラインを作り上げました。シェルスクリプトなど使わずとも100個くらいなら1分程度で作れちゃうんですね。素晴らしいです。
連番を含むファイル名をコピーするシェルスクリプト
もしも、こんなことを言われたら
このテストデータを1,000個にしといて。よろしく。
ここまできたら、もうExcelの範疇を超えてますよね。個人的には、300行以上あるExcelシートをみると気分が落ち込みます。(ほんとやめて欲しい。。。。)
ここまできたらシェルスクリプトを使いましょう。簡単なコードで書けちゃいますし。1万回のコピーだろうが100万回のコピーだろうが、たった5行のコードでできちゃいます。
$ for i in {1..10} // 変数iを1から10まで繰り返す
> do // doからdoneまでを10回繰り返す
> num=`printf %04d $i` // 変数iを0埋め4桁で表示した文字列を変数numに代入
> cp TEST_FILE_0000.csv TEST_FILE_${num}.csv //元ファイルをコピーする
> done
-rw-r--r-- 1 dipolecats admin 0B 6 5 08:07 TEST_FILE_0000.csv
-rw-r--r-- 1 dipolecats admin 0B 6 5 08:11 TEST_FILE_0001.csv
-rw-r--r-- 1 dipolecats admin 0B 6 5 08:11 TEST_FILE_0002.csv
-rw-r--r-- 1 dipolecats admin 0B 6 5 08:11 TEST_FILE_0003.csv
-rw-r--r-- 1 dipolecats admin 0B 6 5 08:11 TEST_FILE_0004.csv
-rw-r--r-- 1 dipolecats admin 0B 6 5 08:11 TEST_FILE_0005.csv
-rw-r--r-- 1 dipolecats admin 0B 6 5 08:11 TEST_FILE_0006.csv
-rw-r--r-- 1 dipolecats admin 0B 6 5 08:11 TEST_FILE_0007.csv
-rw-r--r-- 1 dipolecats admin 0B 6 5 08:11 TEST_FILE_0008.csv
-rw-r--r-- 1 dipolecats admin 0B 6 5 08:11 TEST_FILE_0009.csv
-rw-r--r-- 1 dipolecats admin 0B 6 5 08:11 TEST_FILE_0010.csv
3行目「num=`printf %04d $i`」の「`」はバッククォーテーションです。シングルクォーテーションではないので気をつけてください。
1行にまとめて書くこともできます。これできたら、ちょっとかっこいーですよね。
for i in {1..10}; do num=`printf %04d $i`; cp TEST_FILE_0000.csv TEST_FILE_${num}.csv; done
ゼロパディングはbashだけでもっと短くかけるよ
ありがたく、この記事をみてくれた方からコメントをいただきました。ありがとうございます。
こうゆう交流嬉しいですね。
ゼロパディングはbashの機能だけで出来るよ
seq -f%04g 1000 | xargs -I@ cp TEST_FILE_{0000,@}.csv
-rw-r--r-- 1 dipolecats admin 0B 6 6 07:01 TEST_FILE_0000.csv
-rw-r--r-- 1 dipolecats admin 0B 6 6 07:02 TEST_FILE_0001.csv
// 中略
-rw-r--r-- 1 dipolecats admin 0B 6 6 07:02 TEST_FILE_1000.csv
これで1000個の連番ファイルができました。かっこいーです。
コメント
もうちょっと短く出来ますよ。ゼロパディングはbashの機能だけで出来るしこっちのほうがちょっと速いです。
for i in {0001..1000}; do cp TEST_FILE_{0000,$i}.csv; done
もう少し短く出来ました
seq -f%04g 1000 | xargs -I@ cp TEST_FILE_{0000,@}.csv
ありがとうございます。勉強になります。
本文にも追記させていただきます。