• ベストアンサー

UNIXでのテキストファイル処理

UNIX上のテキストファイルの文字列変換処理をやりたいと思っています。 DIELECTRIC IMD9D { THICKNESS=101.00 ER=uuu } ↓ DIELECTRIC IMD9D { THICKNESS=satoh_IMD9D ER=uuu } 101.00→satoh_IMD9Dとなる”IMD9D”は行の2単語目の単語で行によって文字列は変ります。 このような書式の行が数百行あるので,できるだけ簡単に一括変換をやりたいと考えています。 処理方法は,viでもシエルでも簡単にできればO.K.です。(できるだけ標準コマンドでできれほうがうれしいですが..)

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

変換ルールがちょっと不明確な部分があります。 ・単語の区切りは空白 ・単語 単語 { ... という書式 ・satoh_IMD9Dのように置き換えられる対象は = の後の数値が対象? ・置換対象を "satoh_2番目の単語" に置き換える? 上記の前提をしていいのなら sed -e 's/\(^[^ ]*\) \([^ ]*\) { \([^=]*\)=\([0-9.]*\) \(.*\)$/\1 \2 { \3=satoh_\2 \5/' かな?

Kasaoka-Taroh
質問者

お礼

sedでこういった高度な置換をすればいいのですね。大変参考になりました。ありがとうございました。

その他の回答 (2)

  • amru05
  • ベストアンサー率63% (33/52)
回答No.3

viならば以下の様な検索&置換でできるかも。。  %s/IC \(.*\) { \(.*\)=\(.*\) ER/IC \1 { \2=satoh_\1 ER/g ==> 正規表現とそのマッチングした文字を使用する方法を調べれば良いでしょう。  ちなみに上記例では   最初の\(.*\)がIMD9Dにマッチし   次の\(.*\)がTHICKNESSにマッチし  それぞれが \1 \2で置換文字として使用されます。

Kasaoka-Taroh
質問者

お礼

no.2さんのvi版の方法ですね。no.2さんと同様大変参考になりました。ありがとうございます。ためしてみます。

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.1

sedかawk(もちろんperlでもrubyでもできますが)あたりが楽ではないでしょうか。 sedなら /^DIELECTRIC IMD9D/s/THICKNESS=[^ }]*/THICKNESS=satoh_IMD9D/ のような行を、置き換えパターンの数だけ並べればいいでしょう。

関連するQ&A

  • Perlでのテキスト処理について

    Perlでのテキスト処理について質問です。 テキストファイルの中身が下記のようになっています。 【テキスト編集前】 --------------------------------------- test ,abc ,AB ,VI ,SS ,ma ---1行目 test ,abc ,AC ,PI ,VS ,ma ---2行目 test ,abc ,BA ,SS ,VS ,ma ---3行目 test ,abc ,BA ,VI ,VS ,ma ---4行目 test ,cde ,AA ,VI ,SS ,mb ---5行目 test ,cde ,CC ,PE ,VS ,mb ---6行目 test ,cde ,BC ,PI ,SS ,mb ---7行目 test ,cde ,AC ,PI ,SS ,mc ---8行目 --------------------------------------- 2列目(abc/cde)と6列目(ma/mb/mc)が同じ行に対しては 1行にまとめて出力したいと思っています。 この時、1列目、4列目、5列目はマージした形にし (同一文字は一度だけ出力、同一でない文字は/区切りで出力)、 2列目、6列目は同一文字をそのまま出力し、 3列目に関しては、該当する行の先頭行の文字列を 出力したいと思っています。 下記が当方の希望しているPerl実行後の出力結果です。 【テキスト編集後】 --------------------------------------- test ,abc ,AB ,VI/PI/SS ,SS/VS ,ma test ,cde ,AA ,VI/PE/PI ,SS/VS ,mb test ,cde ,AC ,PI ,SS ,mc --------------------------------------- このような編集をPerlで実行したいと思っているのですが、 どのような記述をすれば実行できるのか教えて頂けないでしょうか。 当方、Perlを始めたばかりで基本的なことを 伺っているのかもしれませんが すみませんが、ご了承ください。 宜しくお願いいたします。

  • エクセルファイルの計算の処理について

    エクセルファイルの計算の処理について質問です。よろしくお願いします。 例えば、9000行ほどあるファイルなのですが、2行目と3行目のB列、C列、D列のセルの中身を足して2で割る(平均をとる)計算をし、3行目のA列のセルの中身をそのままにするという処理をし、次に4行目と5行目で処理をするということを最後まで行うことは可能でしょうか? 元のファイルの内容 (行)(列) A B C D  1  2   あ 5 5 5  3   い 3 3 3  4   う 2 2 2  5   え 4 4 4 ...   ↓↓↓↓↓ 処理後のファイルの内容 (行)(列) A B C D  1  2   い 4 4 4  3   え 3 3 3 ... わかりやすい方法があれば教えてください。もし、プログラミングが必要なら、JavaやC言語なら少しだけ知識があります。 ちなみに、ソフトはWindows ExcelではなくOpenOffice3.1を使うことが多いです。 わかりにくい文章で申し訳ありませんがよろしくお願いします。

  • 処理の繰り返しについて教えてください

    A列1行目の値をD列1行目にコピーし、E列でD列の文字列の右から3文字を返す。 そしてD列の下端までコピーの繰り返しD列の下端より1行下がりA列に戻る。 A列※行目の値をD列※行目にコピー・・・・。といった作業をD列の一番下のセル まで繰り返したいです。 さらにこの作業をブック内の左から数えて2個を除いた10個程度あるシートの すべてで反映させたいです。 下の感じで作ってみたのですが、繰り返し処理がイマイチよくわかりません。 ご指導のほどよろしくお願いします。 Cells(1, 1).Copy 'A列1行目の値をD列1行目にコピー(1) Cells(1, 4).PasteSpecial Paste:=xlValues ActiveCell.Offset(0, 1).Select 'E列でD列の文字列の右から3文字を返す(2) ActiveCell.FormulaR1C1 = "=right(RC[-1],3)" j = Cells(1, 4).End(xlDown).Row 'D列の下端を指定して For i = 1 To j Cells(1, 5).Copy 'D列の下端までコピーの繰り返し(3) Cells(i, 5).PasteSpecial Paste:=xlValues Next i ActiveCell.Offset(1, -4).Select 'D列の下端より1行下がりA列に戻る(4) Cells(※, 1).Copy 'A列※行目の値をD列※行目にコピー(6) Cells(※, 4).PasteSpecial Paste:=xlValues       A列          D列         E列 1  ****●▽■(1)    ****●▽■(2)      ●▽■(3) 2                  ****           ●▽■ 3    3                    *****      ●▽■ 4                 *****           ●▽■ 6   ****■▽■(5)    ****■▽■(6) 

  • テキストファイルの処理について

    初心者です。 PHP5を始めて約50時間程度です。 テキストファイルの処理についての質問です。 fgets,file_put_contents,str_replace,array等の関数を使い処理するのだと思います。 構文が組み立てられません。 参考になるサイト等アドバイスいただけると幸いです。 よろしくお願いします。 下記の様な元になるテキストファイルがあります。 1.最初の文字があるまで(=改行だけの行)は削除 2.最初の文字列の最後に”,”を入れ改行をとる 3.次の行と次の次の行は削除 4.次の行は、例:7月4日(土)を7,4,土に 5.次の行は、例:10:00~13:00を10:00,13:00に 6.次の行と次の次の行は削除して改行 7.次の行と次の次の行は削除 8.前述1から7までの繰り返し *最終的には後述のようなテキストファイルになります ----元になるテキストファイル 植物の光合成 理科 3 相田ももこ 7月4日(土) 10:00~13:00 30名 5,000円 鎌倉時代 社会 3 土田正 7月4日(土) 14:00~17:00 30名 5,000円 生物の進化 理科 6 長谷川浩 7月4日(土) 10:00~17:00*会場は大阪です 16名 10,000円 ----元になるテキストファイル以上 ---完成後のファイル 植物の光合成, 理科,7,4,土,10:00,13:00 鎌倉時代,社会,7,4,土,14:00,17:00 生物の進化,理科,7,4,土,10:00,17:00 ---完成後のファイル以上

    • ベストアンサー
    • PHP
  • テキスト内容をバッチ処理で変換する方法をおしえてください 。

    csvの内容変換をしたいのですが、データの量が大変多いためどのような方法で変換すればよいか悩んでおります。 csvのまま開くと桁数の多い数字や、アルファベットの「E」を含んだ数字の列2.36E+256のようになってしまったり、不具合が起こります。文字列にしてみても解決されずでした。 そのため、その部分を「="」「"」で囲みたいと思ってます。 csvをtxt保存し、バッチで変換することはできますか? たとえば、~番目のカンマの後に「="」をいれ、~番目の前に「”」を入れ、末尾に「"」を入れた後次の行も同じくの処理をするというコマンドは可能なのでしょうか? いろいろ調べてみましたが、答えを見つけ出せません。よい方法があれば教えてください。

  • エクセルファイルの一括変換・処理方法について

    エクセルファイルの一括変換・処理方法についてお聞きしたいことがあります。100行3列の数値データを持つエクセルファイルがあるとします。4列目に計算式例えば、D1=A1*B1をD列にフィルする作業を自動的に行い、かつ複数の、同様なデータを持つエクセルファイルにも一括して同一作業を行う方法を、どなたかご教授くださいませんでしょうか?おそらくマクロを使うこととなるかもしれませんが、もしそうでしたらそのマクロについてもお教えいただけるとありがたいです。よろしくお願いいたします

  • ファイルの文字列の処理の質問

    今ファイルに対して文字列の処理をしています。 あるファイルに対して一定の文字列を検索して、その検索したい文字列が なければ、その一行をファイルに出力したいですが、手元にwindowsバージョン のgrep.exe で実現すると考えています。 しかし、検索したいファイルは、文字列が入ってない行があります。 そのため、検索したい文字列が存在しない行は、改行だけの行を結果として 出力されています。改行だけの行を除きたいですが、どうすればいいか? ファイルのsjisです。例えば、内容としては、以下のようになっています。 aiiiiii ballllll fafafa 777777 とするファイルがあります。そのファイルに対して、aという文字が入ってない行を 取りたいですが、実際にgrep -v "a" ファイル名 でやると、777777の行とすべて 改行だけある行が取られてました。 777777だけをとる方法がありますでしょうか?

  • テキストファイルを1行ずつ別のファイルに分割する

    400行ぐらいのテキストファイルを、1行ずつ別のファイルに分割したいと思います。 ファイル名は**001.txtのように、(**は任意の文字列、数字は連番)なってくれれば嬉しいです。 どなたかこのような処理のできる簡単な方法をご存じないでしょうか? よろしくお願いします。

  • エクセルでの連番の処理

    お世話になります。 1行目に入力されたデータをルールに沿って2行目以下にどんどん追加していきたいと思っています。 まずD1、E1のセルに数字を入れます。 例:D1に3、E1に25 を入れてマクロを実行するとD列の2行目以下に3,4,5,6…25と連番で入力出来るようにしたいのです。 この例ではD列は24行目まで入力されています。そこで2行目から24行目までのA,B,C列にはそれぞれ1行目のA,B,C列と同じデータを入力します。なおA,B,C列は数字、文字列どちらもあります。空白の場合もあります。 この状態でA~E列の1行目のデータを変更し、仮にD1を2、E1を15としたとします。ここで再度マクロを実行すればD25に2、そして順に連番が入りD38に15が入るようにします。 同時に25行目から38行目までのA,B,C列にはそれぞれ1行目のA,B,C列と同じデータを入力します。 これの繰り返しです。 つまり2行目以下のD列で空白の行以下にどんどん連番を入れていく具合です。 前提としてD1、E1は整数しか入りません。またE1の数字はD1より大きいです。ただD1,E1に同じ数字が入った場合、その数字の1行分だけが入力されるようにします。 以上の処理が自動化できるマクロはできますか? アドバイス願います。

  • Excelで行番号に応じての処理

    よろしくお願いします。 C列に3行ごとに規則正しくみっちり1000行ほどの文字列があります。 1 品番 2 商品名 3 備考 4 品番 5 商品名 6 備考 7 品番 自動的に2つの処理をしたいのですが、わからなくて困っています。 いずれもC列をD列にコピーするときの処理です。 1) 行番号が3の倍数のときにはコピーせず(空白)、1と2との時はコピー。 ※品番と商品名だけをコピー 2) 品番だけ、フォントを変えたい よろしくお願いします。※Excel2007です

専門家に質問してみよう