スクリプトの書き方-ファイルの読み書き方法

このQ&Aのポイント
  • スクリプトを使用して、ある一定の文字列が出てきた後、別のファイルに特定の文字列が出てくるまでの内容を書き出す方法を教えてください。
  • hp-uxのrunacctスクリプトを使用して、月次ファイルfiscalに書き出される3つのデータを、それぞれ別のファイルに書き出すスクリプトを作成したいです。
  • hp-uxやスクリプトについての知識はほとんどありませんが、ヒントをいただけると助かります。
回答を見る
  • ベストアンサー

スクリプトについて教えてください。

教えてください。お願いします。 ひとつのファイルの中身を読み、ある一定の文字列が出て来てから、また決まった文字列が出てくるまでを別のファイルに書き出す方法(スクリプトの書き方)を教えてください。 hp-uxの中にあるrunacctというスクリプトによってできる月次ファイルfiscalというのがあってそのファイルの中には3つのデータが書き出されます。 どこからどこまでがひとつのデータという事はわかります。 これを一つずつ、3つのファイルに書き出すスクリプト(手動でよいので)をつくりたいのです。 hp-uxについてもスクリプトについても全くというほど知識がないので、 ヒントでも良いので下さい。お願いします。

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

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.5

> 教えていただいたスクリプトを実行したところ > awk: test3:14: (FILENAME=fiscrpt06 FNR=6) fatal: expression for `>' redirection has null string value > というメッセージが出ます。 ああ、しまった。 a-kuma> { a-kuma> gsub( /<tab><tab>*/, " " ); a-kuma> print > out; a-kuma> } を out != "" { gsub( /<tab><tab>*/, " " ); print > out; } としなければ、駄目でしたね m(_ _)m

chibitotoro
質問者

お礼

ありがとうございました。 なんとかなりそうです。 k-kumaさんってすごいんですね。 回答数、すごかった。 ほんと、ありがとうございました。

その他の回答 (4)

  • kokucho81
  • ベストアンサー率61% (157/255)
回答No.4

chibitotoroさんこんにちわ。 私はhp-uxについては触ったことがないので存じ上げませんが、 Perlが使用できるのでしたら、こんな感じでしょうか? ############################ #!/usr/bin/perl $FileNo=1; foreach $line (<>) { if ($line =~ /^\n?$/ || $line =~ /^page\d/) { ; } else { $line =~ s/\t/ /g; print PH $line; } if ($line =~ /^page1/) { # close PH || die ""; $FileNo++; print $str=sprintf("OutPut%05d処理します。\n", $FileNo); open PH, ">".sprintf("OutPut%05d.txt", $FileNo) || die ""; } } ######################## このファイルをkk81.pl とでも保存して、 perl kk81.pl (読みこみファイル名)とすれば、だいたいお望みのとおりの 挙動をすると思うのですが、、、 ご参考になりましたら。

chibitotoro
質問者

補足

ありがとうございます。 私は、perlを使ったことがありません。 実行方法を教えていただけますか? 自分でもしらべてみますが。。。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.3

> ファイルの中身なのですが、 (snip) データ1の固まりの前だけに、決った文字列があって、後は、ページ番号だけが 頼りなんですね。 BEGIN { out = "" } /決った文字列/ { out = "出力ファイル1"; next } /page1/ { if ( out == "出力ファイル1" ) { out = "出力ファイル2"; next } if ( out == "出力ファイル2" ) { out = "出力ファイル3"; next } } /page/ { next } /^[<space><tab>]*$/ { next } { gsub( /<tab><tab>*/, " " ); print > out; } って感じになるかな。項目間のタブをひとつの空白で置換えてます。 > sedコマンドを使って削除しようと試みたのですが おかしいですねぇ。page の p が大文字になっているのは、愛敬としても、 書き方は正しいと思います。

chibitotoro
質問者

補足

何度もありがとうございます。 教えていただいたスクリプトを実行したところ awk: test3:14: (FILENAME=fiscrpt06 FNR=6) fatal: expression for `>' redirection has null string value というメッセージが出ます。どういう意味かわかりましたら教えてください。 test3:スクリプトファイル名です。 fiscrpt06:入力データファイル名です。 お願いします。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

> データの説明をもうちょっとしますと。。。 あるデータの固まりは、空白行で終わる、と考えていいのでしょうか? であれば、こんな感じ。 BEGIN { out = "" } /決った文字列1/ { out = "出力ファイル1"; next } /決った文字列2/ { out = "出力ファイル2"; next } /決った文字列3/ { out = "出力ファイル3"; next } /^$/ { out = "" } out != "" { print > out } > 空白行の削除などは、空白行がみつかったら最初の一行しか消さないのでしょうか? ちょっと質問の意図が分かりません。この回答のスクリプトでは、空白行が出た 時点で、そのデータの固まりを終了とみなして出力を一旦中止します。 つまり、出力ファイルには空白行は出力されません。 > タブをスペースに変換についても同じなのでしょうか? こちらも意図がよくわから無いんですが、入力ファイルのタブを出力ファイルに 出す時点でスペースに変換したい、ということでしょうか? awk のスクリプトで書くと、ちょっと大変かも。行頭のタブだけだったら、簡単 なんですけどね。 タブ→スペース変換のコマンドがある(はず)ので、それを使うのが簡単かも。 例えば、file1 のタブを4桁区切りでスペースに変換して file2 にするには、 こんな感じ。 % expand -4 file1 > file2

chibitotoro
質問者

補足

ほんっとにありがとうございます。 何度も何度も。。。説明もままならず。。。 ファイルの中身なのですが、 page1          ←正確にはこの部分には日付なども書かれている               これも削除したい(1) 決まった文字列 データ1 データ・・・  ← データとデータの横間隔がタブで区切られている :              これをスペースに変換したい(2) : ←数行の空白行 これを削除したい page2 ファイル内で改ページしてるようでpage数が表示               これも削除したい(3) データ1 データ・・・ :  :               ←ここまでがデータ1                 ここまでをファイル1に出力したい page1 データ2 データ・・・ : : : page2 データ2            ←ここまでをファイル2に出力 page1 データ3 データ・・・ ←ここからファイル3へ (1)について sedコマンドを使って削除しようと試みたのですがpage1の行だけで、page2以降が削除されません。sed -e "/Page/d" filename (3)の空白行についてもsedコマンドを試みたのですが最初の空白行しか削除されません sed -e `/^[<space><tab>]*$/d` filename 説明が下手なのでうまく伝わったか不安ですが、 なにか他にアドバイスがありましたらお願いします。 自分なりにも調べ、試してみます。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

課金情報のレポートは見たことが無いのですが、こんな感じのファイルでしょうか? 決った文字列 データ1 データ2 データ3 データ1 データ2 データ3 データ1 データ2 データ3 決った文字列(その2) こんな感じのファイルをデータ1だけのファイル、データ2だけのファイル、を 作りたいということですか? やり方はいろいろ有ると思いますが、awk のスクリプトが一番簡単でしょう。 こんな感じ。 #!/usr/bin/awk -f BEGIN { found = 0 } /決った文字列/ { found = 1 ; next } /決った文字列(その2)/ { exit } found && NF == 3 { print $1 > "出力ファイル1" print $2 > "出力ファイル2" print $3 > "出力ファイル3" } このスクリプトファイルに実行権限をつけて、引数に入力のファイルを指定すれば 三つの出力ファイルが作成されます。

chibitotoro
質問者

補足

ありがとうございます。 データの説明をもうちょっとしますと。。。 決まった文字列1 データ1 : : : 決まった文字列2 データ2 : : : 決まった文字列3 データ3 : : : となっています。 これをデータ毎にファイルを分けたいのです。 教えていただいたスクリプト、試してみます。 もう一つ聞いても良いですか?お願いします。 空白行の削除などは、空白行がみつかったら最初の一行しか消さないのでしょうか?それとも別にファイル内すべての空白行削除方法があるのでしょうか? タブをスペースに変換についても同じなのでしょうか?

関連するQ&A

  • UNIXのシェルスクリプト

    UNIXのシェルスクリプトで以下のようなことをやりたいのですがいい方法を教えて下さい。 ファイルの中にある文字列があります。 たとえば”CURREND_DIR” この文字列をシェルスクリプトでカレントのディレクトリパスに変換したいのですが いい方法が思いつきません。 set dir_data = ‘pwd‘ sed -e ’s/CURRENT_DIR/$dir_data’ ファイル名 でできるかなと思ったのですが、”CURRENT_DIR”が”$dir_data”に置換されてしまいます。 さらにdirパスが”/”で区切られていることも問題のようです。

  • XPのPC上で簡単な動作をするスクリプトをつくりたい

    XPのPC上で簡単な動作をするスクリプトをつくりたいと思っているのですが、 たとえば、 この文字列があったら、このフォルダに移動する。 このフォルダ以下に以下のフォルダを作成する。 ファイルの中身からリストを作成するなど。 プログラミングの知識(VB,JAVA,VBA)はあるので、 そのようなバッチファイル、スクリプトみたいなのを作りたいのですが、どのプログラムがお勧めでしょうか? 自分でしらべたかんじでは、VBスクリプトがよさそうなのですが・・・ おすすめなプログラムあったら教えて下さい。 また、そのプログラムの解説などが掲載されているページが あったら教えて下さい。

  • ファイルのパージについて

    ちょっと教えてほしいんですが・・・ HP-UXでファイルの中に書いているデータを0バイトにしたいのです。 例えば、 testっていうログファイルに100行のデータが書かれている場合、そのtestというログファイルを削除せずに、中身だけを消したいのです。 どなたか、いいやり方を知っている方、教えてください。

  • 手動でログオンスクリプトを動かしたい

    NTドメイン上のログオンスクリプトを手動で動かしたいのですが、方法がわかりません。 WindowsXPでネットワークに接続していない状態でログオンした場合、その後にネットワークに接続してもログオンスクリプトが動かないので、再度ログオンのやり直しで対処したり、ログオンスクリプトと同じ中身のバッチファイルを作って動かしたりしています。 NTドメイン上のログオンスクリプトを手動で動かす方法を教えてください。

  • 外部スクリプトとスタイルシート

    とある質問にあったHPのソースを見たところ外部にJavaScriptとスタイルシートのファイルを置いて そこからリンクしているみたいでした。 そして外部ファイルをローカル(パソコン)にダウンロードして中身を メモ帳で見たのですが↑などの変な記号でぎっしりにつまっていました。 スタイルシートのほうは@もありました(@importなど) 文字化けのように見えるのですがこれは文法(スクリプト)としては正しいのでしょうか? 直接ソースに書いてあるようにスクリプトを見るにはどうしたらいいでしょうか? ちなみにここのHPです http://www.blogger.com/start

    • ベストアンサー
    • HTML
  • シェルスクリプトで

    いくつかのテキストファイルがあって, その中で内容が重複するもの(ファイル名は違うが中身は同じ)ファイルをみつけるシェルスクリプトが書きたいのですが, どのように書けばよいでしょうか. というかそのように書くことは可能でしょうか. ぶしつけですいませんが,回答お願いいたします.

  • テキストファイル内の(から)の取り出し

    テキストファイルの中の”(”から”)”までの中身をとりだしたい のですが言い方法が思いつきません。どのようにすればいいでしょうか? OSはSolarisまたはLinuxです。 ”(”の中は”(”が何重かネストしています。 手段は特に問わないのですが、今後のメンテを考慮すると awkかperlのスクリプトで実現できればありがたいでです。 イメージとしては ファイルAの中 文字列1( (・・) (・・) ) 文字列2( (・・) (・・) ) をA.文字列1、A.文字列2で出力できればと思います。

  • VIVI(エディタ)のスクリプトについて

    OS:WindowsVista Ultimate SP1 viviバージョン:2.0375 Excelバージョン:2003 SP3 仕事でviviエディタを使用しているものです。 宜しくお願いします(viviは全くの初心者です・・・) あるフォルダ内のファイル群からgrepを使用して出た結果をCSVで保存します。 その一連作業を検索文字列だけ変えて数十回ほど繰り返し作業しています。 そこでgrepで使用する検索文字列をExcelVBAで収集し文字列操作で viviのスクリプトを作成してはき出されたスクリプトファイルで一気にgrepを 行うと同時に保存できないかと考えております。 そこで以下の条件を満たしたスクリプトを記述する場合どのように記述するか教えて下さい。  (1)検索文字列、ファイル種別(*.*)、ディレクトリを指定した状態でのgrep   (他はデフォルトです。)  (2)grep終了後、検索文字列で保存(csv形式) ExcelVBAの部分は大体出来たのですがスクリプトが全くわかりません。 サイトで色々調べたのですが、見つからず(分からないだけかも)困っている状態です。 すいませんがgrep-保存する場合のスクリプト内容を教えていただけないでしょうか。 宜しくお願い致します。

  • Apple Script の文字列中に『”』を使う

    Apple Script の文字列のなかに、ダブルクオート「"」を含めるにはどうしたらよいのでしょうか? 例: set TEST_TEXT to ”文字列" の、文字列にダブルクオートを入れたいのです。

    • ベストアンサー
    • Mac
  • 特定ファイル名を抽出し、移動するスクリプト

    質問させていただきます。 スクリプトと同階層にaaaというディレクトリがあります。 そのディレクトリをオープンし、ファイル名の中にbbbbという文字列があるものだけをcccというディレクトリへ移動するスクリプトはどんな感じになるでしょうか? お時間のあるときで結構なのでご教授願います。

    • ベストアンサー
    • PHP