Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
10
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@woadachi

固定長をカンマ区切りに変換する方法(bash)

はじめに

昔覚えたはずが忘れて無駄な工数を使用してしまったので、
備忘録を兼ねて記事にしました。

なお、タイトルは固定長をカンマ区切りに変換する方法ですが、
同じ方法でタブ区切り等、好きな区切り文字を追加することができます。

前提

文字コード: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

固定長のファイルに対して、カンマ等のデリミタを設定すると、
見やすくなったり、加工に使いやすかったりするので便利です。

おわりに

今回は備忘録の意味合いが強いので特には無いですが……
今後別の文字コードや改行コードのファイルを編集することがある場合、
追記していこうと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
10
Help us understand the problem. What are the problem?