Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

はじめに

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

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

前提

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

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

おわりに

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

woadachi
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした