はじめに
以前の記事で「固定長をカンマ区切りに変換する方法(bash)」を
紹介させていただきましたが、記事投稿後、業務中に下記要望を受けました。
「やり方わかりませんが今すぐこのファイルを変換して
こんなレイアウトのファイルを作りたいです!」
・固定長をカンマ区切りに変換する
・カラムを並び替える
・ゼロパディングされている特定のカラムはゼロパディングを解除したい。
・ゼロパディングされている特定のカラムはゼロパディングを解除したくない。
良い機会だと思いましたので、忘れないようにqiitaに
方法をまとめようと思います。
前提
文字コード:ASCII
改行コード:LF
とする。
対処方法
一つずつコマンドを実行しても対応可能ですが、
ワンライナーでも対応可能ですので、ワンライナーで記載。
(一つのコマンドでもできそうな気がしましたが、
思いつきませんでしたのでとりあえず下記で)
例えばtest.csvのデータを
00013005920170901XXX-XXXX-XXXX000000290
とする。上記を
20170901,000130059,XXX-XXXX-XXXX,290
としたい場合、下記コマンドで可能である。
gawk 'BEGIN{FIELDWIDTHS="9 8 13 9"}{print $2","$1","$3","$4}' test.csv|awk -F, '{gsub("^0*","",$4);print $1","$2","$3","$4}' >output.csv
前回の記事で説明した部分は割愛。
パイプで連携する前側の「print」の\$数字でカラム(厳密には\$数字に割り当てられている
文字列ですが)を並び替えています。
パイプで連携する前では
20170901,000130059,XXX-XXXX-XXXX,000000290
という結果になっています。
この結果をパイプで後続のコマンド「awk」に引き渡しています。
「-F,」でデリミタをカンマ指定し、
gsubコマンドで「第四カラムにおいて、先頭が0から始まり任意の数連続する0という
文字列」を「(空)」に置換しています。
カラム指定ですので、指定したカラム以外(例えば第二カラムの「000130059」)は
ゼロパディングを解除しません。
gawk 'BEGIN{FIELDWIDTHS="9 8 13 9"}{print $2","$1","$3","$4}' test.csv|awk -F, '{gsub("^0*","",$4);print $1","$2","$3","$4}' >output.csv
cat output.csv
20170901,000130059,XXX-XXXX-XXXX,290
これで少しはデータが見やすくなったでしょうか?
ちなみに正規表現で文頭を表す「^」は「キャレット」と読みます。
一年くらい前に「^は何と読むんだ!?」と業務中に聞かれたため覚えました。
おわりに
人に聞かれたことは纏めておく精神で記事にしています。
今後、似たような異なる要望を受けた場合はそれも記事にしていこうと思います。