
教えてください。お願いします。
ひとつのファイルの中身を読み、ある一定の文字列が出て来てから、また決まった文字列が出てくるまでを別のファイルに書き出す方法(スクリプトの書き方)を教えてください。
hp-uxの中にあるrunacctというスクリプトによってできる月次ファイルfiscalというのがあってそのファイルの中には3つのデータが書き出されます。
どこからどこまでがひとつのデータという事はわかります。
これを一つずつ、3つのファイルに書き出すスクリプト(手動でよいので)をつくりたいのです。
hp-uxについてもスクリプトについても全くというほど知識がないので、
ヒントでも良いので下さい。お願いします。
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
ありがとうございました。
なんとかなりそうです。
k-kumaさんってすごいんですね。
回答数、すごかった。
ほんと、ありがとうございました。
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 (読みこみファイル名)とすれば、だいたいお望みのとおりの
挙動をすると思うのですが、、、
ご参考になりましたら。
この回答への補足
ありがとうございます。
私は、perlを使ったことがありません。
実行方法を教えていただけますか?
自分でもしらべてみますが。。。
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 が大文字になっているのは、愛敬としても、
書き方は正しいと思います。
この回答への補足
何度もありがとうございます。
教えていただいたスクリプトを実行したところ
awk: test3:14: (FILENAME=fiscrpt06 FNR=6) fatal: expression for `>' redirection has null string value
というメッセージが出ます。どういう意味かわかりましたら教えてください。
test3:スクリプトファイル名です。
fiscrpt06:入力データファイル名です。
お願いします。
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
この回答への補足
ほんっとにありがとうございます。
何度も何度も。。。説明もままならず。。。
ファイルの中身なのですが、
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
説明が下手なのでうまく伝わったか不安ですが、
なにか他にアドバイスがありましたらお願いします。
自分なりにも調べ、試してみます。
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"
}
このスクリプトファイルに実行権限をつけて、引数に入力のファイルを指定すれば
三つの出力ファイルが作成されます。
この回答への補足
ありがとうございます。
データの説明をもうちょっとしますと。。。
決まった文字列1
データ1
:
:
:
決まった文字列2
データ2
:
:
:
決まった文字列3
データ3
:
:
:
となっています。
これをデータ毎にファイルを分けたいのです。
教えていただいたスクリプト、試してみます。
もう一つ聞いても良いですか?お願いします。
空白行の削除などは、空白行がみつかったら最初の一行しか消さないのでしょうか?それとも別にファイル内すべての空白行削除方法があるのでしょうか?
タブをスペースに変換についても同じなのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
if関数とは?
-
画像生成AIのプロンプトの作り...
-
プログラミングについて
-
プログラム言語
-
OS入ってる機器のソフト・アプ...
-
著作権法について
-
数学、プログラミング、物理、...
-
自作scratch アニメの商用利用
-
pythonの実行に関する質問
-
MOVEコマンドでサブフォルダー...
-
今のプログラミング言語
-
Geminiフォーム 画像生成で 人...
-
プログラミングに興味があるの...
-
ネットワークフォルダの中身を...
-
vba クリップボードクリアにつ...
-
pip --versionがエラーになる
-
CSVファイルの複数行削除
-
Python... 環境設定 初心者です...
-
AIがプログラムする時代のプロ...
-
趣味がプログラミングだと言っ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラム言語
-
vba クリップボードクリアにつ...
-
プログラミングについて
-
画像生成AIのプロンプトの作り...
-
自作scratch アニメの商用利用
-
今のプログラミング言語
-
CSVファイルの複数行削除
-
Python... 環境設定 初心者です...
-
Python 3.12.2 か一番最新のパ...
-
数学、プログラミング、物理、...
-
パイソンのソースコードをChatG...
-
pythonの実行に関する質問
-
pip --versionがエラーになる
-
Geminiフォーム 画像生成で 人...
-
OS入ってる機器のソフト・アプ...
-
Google ColaboでGUI作成
-
google Colabでmatplotlibの描...
-
Webサイト内に埋め込んだmp4動...
-
初心者powershellのPS1ファイル...
-
VBAでパワーシェルを実行したい...
おすすめ情報