-PR-
解決済み

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

  • すぐに回答を!
  • 質問No.145428
  • 閲覧数138
  • ありがとう数2
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 58% (31/53)

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

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

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

  • 回答No.5
レベル14

ベストアンサー率 50% (1122/2211)

> 教えていただいたスクリプトを実行したところ
> 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

お礼率 58% (31/53)

ありがとうございました。
なんとかなりそうです。
k-kumaさんってすごいんですね。
回答数、すごかった。
ほんと、ありがとうございました。
投稿日時 - 2001-10-05 18:15:35
-PR-
-PR-

その他の回答 (全4件)

  • 回答No.1
レベル14

ベストアンサー率 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"
}

このスクリプトファイルに実行権限をつけて、引数に入力のファイルを指定すれば
三つの出力ファイルが作成されます。
補足コメント
chibitotoro

お礼率 58% (31/53)

ありがとうございます。
データの説明をもうちょっとしますと。。。

決まった文字列1
データ1




決まった文字列2
データ2




決まった文字列3
データ3




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

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


  • 回答No.2
レベル14

ベストアンサー率 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
補足コメント
chibitotoro

お礼率 58% (31/53)

ほんっとにありがとうございます。
何度も何度も。。。説明もままならず。。。

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

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:44
  • 回答No.3
レベル14

ベストアンサー率 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 が大文字になっているのは、愛敬としても、
書き方は正しいと思います。
補足コメント
chibitotoro

お礼率 58% (31/53)

何度もありがとうございます。
教えていただいたスクリプトを実行したところ
awk: test3:14: (FILENAME=fiscrpt06 FNR=6) fatal: expression for `>' redirection has null string value

というメッセージが出ます。どういう意味かわかりましたら教えてください。
test3:スクリプトファイル名です。
fiscrpt06:入力データファイル名です。

お願いします。
投稿日時 - 2001-10-05 09:29:14
  • 回答No.4
レベル11

ベストアンサー率 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 (読みこみファイル名)とすれば、だいたいお望みのとおりの
挙動をすると思うのですが、、、

ご参考になりましたら。
補足コメント
chibitotoro

お礼率 58% (31/53)

ありがとうございます。
私は、perlを使ったことがありません。
実行方法を教えていただけますか?
自分でもしらべてみますが。。。
投稿日時 - 2001-10-05 09:32:25
このQ&Aのテーマ
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


専門家があなたの悩みに回答!

-PR-

ピックアップ

-PR-
ページ先頭へ