アプリ版:「スタンプのみでお礼する」機能のリリースについて

教えてください。お願いします。
ひとつのファイルの中身を読み、ある一定の文字列が出て来てから、また決まった文字列が出てくるまでを別のファイルに書き出す方法(スクリプトの書き方)を教えてください。

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

A 回答 (5件)

課金情報のレポートは見たことが無いのですが、こんな感じのファイルでしょうか?



決った文字列

データ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




となっています。
これをデータ毎にファイルを分けたいのです。
教えていただいたスクリプト、試してみます。

もう一つ聞いても良いですか?お願いします。
空白行の削除などは、空白行がみつかったら最初の一行しか消さないのでしょうか?それとも別にファイル内すべての空白行削除方法があるのでしょうか?
タブをスペースに変換についても同じなのでしょうか?

補足日時:2001/10/04 11:15
    • good
    • 0

> データの説明をもうちょっとしますと。

。。

あるデータの固まりは、空白行で終わる、と考えていいのでしょうか?
であれば、こんな感じ。

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

説明が下手なのでうまく伝わったか不安ですが、
なにか他にアドバイスがありましたらお願いします。
自分なりにも調べ、試してみます。

補足日時:2001/10/04 14:55
    • good
    • 0

> ファイルの中身なのですが、


(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:入力データファイル名です。

お願いします。

補足日時:2001/10/05 09:29
    • good
    • 0

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を使ったことがありません。
実行方法を教えていただけますか?
自分でもしらべてみますが。。。

補足日時:2001/10/05 09:32
    • good
    • 0

> 教えていただいたスクリプトを実行したところ


> 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
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/10/05 18:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!