質問: 手作業で整形していたら時間がかかるようなファイルを コマンド一行でcsvファイルに変換したいです。 どなたかエレガントなやり方を教えていただけないでしょうか? > > sample1.txt > > > ``` 名前 あ 住所 住所あ 電話 電話あ 名前 い 電話 ※※ 年齢 年齢い 年齢 年齢う 名前 う 住所:住所う 電話 電話う 名前 ほげほげ 住所=住所え 電話 電話え 名前=名前お 電話 電話お 年齢 年齢お 住所 住所お ``` のような > > ・Tab、半角スペース、全角スペースで始まる > > ・ヘッダにしたい情報とデータとして扱いたい情報との間に > > 半角スペース、全角スペース、Tab,=,=,:がある > > ・不規則にデータが保存されている > > > ファイルsample1.txtがあります。 このファイルをresult.csvのようなcsv形式のファイルに整形したいのですが, どなたかエレガントなやり方を教えていただけませんか? > > result.csv > > > ``` 名前,年齢,住所,電話番号 あ,,住所あ,電話あ い,年齢い,,電話い う,年齢う,住所う,電話う 名前え,,住所え,電話え 名前お,年齢お,住所お,電話お ``` 私は以下のようにコマンドを実行しました。 > > $ grep 名前 sample1.txt | cut -f2 -d ' ' | sed -e "s/\$/,/" 2>&1 | tee 名前.txt > > $ grep 年齢 sample1.txt | cut -f2 -d ' ' | sed -e "s/\$/,/" 2>&1 | tee 年齢.txt > > $ grep 住所 sample1.txt | cut -f2 -d ' ' | sed -e "s/\$/,/" 2>&1 | tee 住所.txt > > $ grep 電話 sample1.txt | cut -f2 -d ' ' | sed -e "s/\$/,/" 2>&1 | tee 電話.txt > > $ paste 名前.txt 年齢.txt 住所.txt 電話.txt >kekka.csv > > > その結果、以下のようなcsvファイルkekka.csvファイルができました。 > > 名前, 年齢い, 住所あ, 電話あ, > > い, 年齢 年齢う, 住所:住所う, , > > う, 年齢お, 住所=住所え, 電話う, > > ほげほげ, 住所お, 電話え, > > 名前=名前お, 電話お, > > > 問題点として > > > > ・Tab、半角スペース、全角スペースで始まる > > ・ヘッダにしたい情報とデータとして扱いたい情報との間に > > 半角スペース、全角スペース、Tab,=,=,:がある > > <処理のやり方が原因?> > > ・csvファイルのヘッダ情報がない > > ・pasteした時にTabで勝手にインデントされている > > ・カンマ,の数が合っていない > > > が考えられます。 sample1.txtからresult.csvを作成するにはどのようにすればいいでしょうか? こういったファイルをcsv形式にする機会が多く、最終的に手作業に頼ることになり、 時間がかかり毎回気が滅入っております。 アドバイスいただけましたら幸いです。 よろしくお願いします。 修正 > > result.csv > > > は > > 名前,年齢,住所,電話 > > あ,,住所あ,電話あ > > い,年齢い,,※※ > > う,年齢う,住所う,電話う > > ほげほげ,,住所え,電話え > > 名前お,年齢お,住所お,電話お > > > です 大変失礼いたしました。
回答: 根本的な問題として、レコードを区別する基準が不明瞭のようです。 ``` 名前 ほげほげ 住所=住所え 電話 電話え 名前=名前お 電話 電話お ``` これは1件としますか?2件としますか? 上記のgrepの処理では、名前ー住所その他の対応関係をつけることが全くできないように思います。