サクラエディタとExcel使いの強者にであった

SESエンジニアの日常
SESエンジニアの日常

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個の連番ファイルができました。かっこいーです。

コメント

  1. とおりすがり より:

    もうちょっと短く出来ますよ。ゼロパディングはbashの機能だけで出来るしこっちのほうがちょっと速いです。

    for i in {0001..1000}; do cp TEST_FILE_{0000,$i}.csv; done

  2. とおりすがり より:

    もう少し短く出来ました

    seq -f%04g 1000 | xargs -I@ cp TEST_FILE_{0000,@}.csv

    • dipolecats より:

      ありがとうございます。勉強になります。
      本文にも追記させていただきます。

タイトルとURLをコピーしました