質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

1859閲覧

固定長文字列ファイルを、指定した桁数ごとに区切りcsvファイル(カンマ区切り)にしたい

yk123456

総合スコア0

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

0クリップ

投稿2023/07/03 12:44

編集2023/07/03 13:08

実現したいこと

複数行ある固定長の文字列ファイル(datファイル)の中身を指定桁数の文字ずつにカンマで区切りたい。
例えば下記のような具合です。

01000101000003219790600140008000600000000
201000101001013219720600250008000700090001
この文字列を3,4,5桁ずつに分けたい。
010,0010,10000,03219790600140008000600000000
201,0001,01001,013219720600250008000700090001

前提

発生している問題・エラーメッセージ

sed -i -e "s/^\(.\{1\}\)\(.\{2\}\)\(.\{2\}\)\(.\{12\}\)\(.\{7\}\)\(.\{1\}\)\(.\{1\}\)\(.\{6\}\)\(.\{4\}\)\(.\{4\}\)\(.\{4\}\)/\1,\2,\3,\4,\5,\6,\7,\8,\9,\10,\11,/g" /tmp/test.dat

上記コマンドで下記の文字列をカンマ区切りにしようとしました。
20100010100000 3219790600140008000600000000
20100010100101 3219720600250008000700090001

結果は下記のようになります。
2,01,00,010100000 , ,3,2,197906,0014,20,21,00000000
2,01,00,010100101 , ,3,2,197206,0025,20,21,00090001

9セクション目までは指定した桁数通りに区切れますが、10セクション以降が「20」「21」という数字に変換されてしまいます。
10セクション以上は区切れないのでしょうか。それともコマンドの記載方法に誤りがあるのでしょうか。

試したこと

調べてみると、正規表現の「後方参照」が影響しているというところまでは導けたのですが、修正コードができておりません。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

tk08🎉を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2023/07/03 13:25 編集

> 10セクション以上は区切れないのでしょうか。 はい、後方参照は \0 から \9 までで、2桁以上の数値には対応していません。その場合は perl を使うと良いかもしれません。 perl -i -pe 's/^(.)(.{2})(.{2})(.{10})(.)(.)(.)(.{6})(.{4})(.{4})(.{4})/$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,/' test.dat
yk123456

2023/07/03 13:49

ありがとうございます! 上記コマンドで実現したい内容が実行できました。 夜分にも関わらず、お力を貸していただきありがとうございました。
yambejp

2023/07/04 00:17

固定長といいながら長さが違う文字列を処理しているみたいですが?
guest

回答1

0

\数字 は 1~9までです。
案1:2回に分ける。

sh

1sed -i 's/^\(.\{36\}\)\(.\{4\}\)\(.\{4\}\)/\1,\2,\3/' /tmp/test.dat 2sed -i 's/^\(.\{1\}\)\(.\{2\}\)\(.\{2\}\)\(.\{12\}\)\(.\{7\}\)\(.\{1\}\)\(.\{1\}\)\(.\{6\}\)\(.\{4\}\)/\1,\2,\3,\4,\5,\6,\7,\8,\9/' /tmp/test.dat

案2:そのための機能のあるawkを使う。ただし-iは使えないので、一度別名ファイルに書いてリネーム。

sh

1awk -v FIELDWIDTHS="1 2 2 12 7 1 1 6 4 4 4" -v OFS="," ' 2{$1=$1;print}' /tmp/test.dat >/tmp/test.dat.out && mv /tmp/test.dat.out /tmp/test.dat

投稿2023/07/03 15:07

otn

総合スコア86295

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問