LoginSignup
2
2

More than 5 years have passed since last update.

固定長をカンマ区切りに変換して、カラムを並び替えて、カラム指定でゼロパディングを解除する方法(bash)

Posted at

はじめに

以前の記事で「固定長をカンマ区切りに変換する方法(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

これで少しはデータが見やすくなったでしょうか?

ちなみに正規表現で文頭を表す「^」は「キャレット」と読みます。
一年くらい前に「^は何と読むんだ!?」と業務中に聞かれたため覚えました。

おわりに

人に聞かれたことは纏めておく精神で記事にしています。
今後、似たような異なる要望を受けた場合はそれも記事にしていこうと思います。

2
2
0

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
2
2