はじめに
昔覚えたはずが忘れて無駄な工数を使用してしまったので、
備忘録を兼ねて記事にしました。
なお、タイトルは固定長をカンマ区切りに変換する方法ですが、
同じ方法でタブ区切り等、好きな区切り文字を追加することができます。
前提
文字コード:ASCII
改行コード:LF
とする。
固定長をカンマ区切りに変換
例えばsample.csvのデータを
20170901130059XXX-XXXX-XXXX000000290
20170903130059XXX-XXXX-XXXX000000290
とする。上記を
20170901,130059,XXX-XXXX-XXXX,000000290
20170903,130059,XXX-XXXX-XXXX,000000290
としたい場合、下記コマンドで可能である。
cat sample.csv |gawk 'BEGIN{FIELDWIDTHS="8 6 13 9"}{print $1","$2","$3","$4}' >output.csv
結果をファイル出力したい場合は例のようにリダイレクトすればよい。
FIELDWIDTHSには半角スペース毎に区切りたい文字の「バイト数」を記載する。
上記例の場合は年月日(8バイト)、時分秒(6バイト)、電話番号(13バイト)、金額(9バイト)である。
printには$数字に区切りたい文字が順番に入り、「"」で囲っている場所に
好きな文字(今回だと「,」)を記載するとそれがデリミタ(区切り文字)となる。
例えば「,」を「\t」にすればカンマ区切りではなく、タブ区切りとなる。
cat sample.csv |gawk 'BEGIN{FIELDWIDTHS="8 6 13 9"}{print $1"\t"$2"\t"$3"\t"$4}' >output.csv
cat output.csv
20170901 130059 XXX-XXXX-XXXX 000000290
20170903 130059 XXX-XXXX-XXXX 000000290
固定長のファイルに対して、カンマ等のデリミタを設定すると、
見やすくなったり、加工に使いやすかったりするので便利です。
おわりに
今回は備忘録の意味合いが強いので特には無いですが……
今後別の文字コードや改行コードのファイルを編集することがある場合、
追記していこうと思います。