- ベストアンサー
スクリプトの書き方-ファイルの読み書き方法
- スクリプトを使用して、ある一定の文字列が出てきた後、別のファイルに特定の文字列が出てくるまでの内容を書き出す方法を教えてください。
- hp-uxのrunacctスクリプトを使用して、月次ファイルfiscalに書き出される3つのデータを、それぞれ別のファイルに書き出すスクリプトを作成したいです。
- hp-uxやスクリプトについての知識はほとんどありませんが、ヒントをいただけると助かります。
- みんなの回答 (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
その他の回答 (4)
- kokucho81
- ベストアンサー率61% (157/255)
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 (読みこみファイル名)とすれば、だいたいお望みのとおりの 挙動をすると思うのですが、、、 ご参考になりましたら。
補足
ありがとうございます。 私は、perlを使ったことがありません。 実行方法を教えていただけますか? 自分でもしらべてみますが。。。
- a-kuma
- ベストアンサー率50% (1122/2211)
> ファイルの中身なのですが、 (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 が大文字になっているのは、愛敬としても、 書き方は正しいと思います。
補足
何度もありがとうございます。 教えていただいたスクリプトを実行したところ awk: test3:14: (FILENAME=fiscrpt06 FNR=6) fatal: expression for `>' redirection has null string value というメッセージが出ます。どういう意味かわかりましたら教えてください。 test3:スクリプトファイル名です。 fiscrpt06:入力データファイル名です。 お願いします。
- a-kuma
- ベストアンサー率50% (1122/2211)
> データの説明をもうちょっとしますと。。。 あるデータの固まりは、空白行で終わる、と考えていいのでしょうか? であれば、こんな感じ。 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
補足
ほんっとにありがとうございます。 何度も何度も。。。説明もままならず。。。 ファイルの中身なのですが、 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)
課金情報のレポートは見たことが無いのですが、こんな感じのファイルでしょうか? 決った文字列 データ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" } このスクリプトファイルに実行権限をつけて、引数に入力のファイルを指定すれば 三つの出力ファイルが作成されます。
補足
ありがとうございます。 データの説明をもうちょっとしますと。。。 決まった文字列1 データ1 : : : 決まった文字列2 データ2 : : : 決まった文字列3 データ3 : : : となっています。 これをデータ毎にファイルを分けたいのです。 教えていただいたスクリプト、試してみます。 もう一つ聞いても良いですか?お願いします。 空白行の削除などは、空白行がみつかったら最初の一行しか消さないのでしょうか?それとも別にファイル内すべての空白行削除方法があるのでしょうか? タブをスペースに変換についても同じなのでしょうか?
お礼
ありがとうございました。 なんとかなりそうです。 k-kumaさんってすごいんですね。 回答数、すごかった。 ほんと、ありがとうございました。