教えてください。お願いします。
ひとつのファイルの中身を読み、ある一定の文字列が出て来てから、また決まった文字列が出てくるまでを別のファイルに書き出す方法(スクリプトの書き方)を教えてください。
hp-uxの中にあるrunacctというスクリプトによってできる月次ファイルfiscalというのがあってそのファイルの中には3つのデータが書き出されます。
どこからどこまでがひとつのデータという事はわかります。
これを一つずつ、3つのファイルに書き出すスクリプト(手動でよいので)をつくりたいのです。
hp-uxについてもスクリプトについても全くというほど知識がないので、
ヒントでも良いので下さい。お願いします。
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
:
:
:
となっています。
これをデータ毎にファイルを分けたいのです。
教えていただいたスクリプト、試してみます。
もう一つ聞いても良いですか?お願いします。
空白行の削除などは、空白行がみつかったら最初の一行しか消さないのでしょうか?それとも別にファイル内すべての空白行削除方法があるのでしょうか?
タブをスペースに変換についても同じなのでしょうか?
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.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.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.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さんってすごいんですね。
回答数、すごかった。
ほんと、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
- Visual Basic(VBA) 複数ファイルのデータの統合について 12 2022/05/14 12:03
- Visual Basic(VBA) 複数ブックの統合について Excel VBA 1 2022/05/13 09:48
- 画像編集・動画編集・音楽編集 inkscapeで作成した図の保存の仕方とその保存したファイルの編集の仕方 1 2022/09/22 09:33
- その他(プログラミング・Web制作) awkのtoupper() 1 2022/10/21 20:39
- その他(プログラミング・Web制作) bashのgrepで複数の検索、かつスクリプト内で改行する方法を教えてください。 1 2022/10/06 20:09
- Visual Basic(VBA) Excelのマクロについて教えてください。 作業フォルダ内に2つのファイルがあります。 このファイル 2 2023/07/09 13:40
- PDF PDFに精通した方に質問。JPEGファイル群を一つのPDFファイルにするときの容量変化について 6 2023/07/23 19:06
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラム言語について。
-
C#とC++について。
-
CLispのloop内の挙動について
-
interface 2021年5月号 P46
-
VBA 電話番号の正規表現について
-
VBAでパワーシェルを実行したい...
-
vba クリップボードクリアにつ...
-
ImageMagickでgif画像の一部が...
-
Windowsのアプリ開発ってなんの...
-
プログラミングのPythonのnoteb...
-
pythonで複数画像からgifを作る...
-
ExcelVBAでFormulaR1C1を列範囲...
-
初心者powershellのPS1ファイル...
-
Google ColaboでGUI作成
-
小学1年生の子です。塾に行かせ...
-
そのまま使っただけなのに・・...
-
プログラマーと学歴の関係性に...
-
Pythonでgif画像が上手く作れない
-
windowsでテキストファイルの各...
-
プログラミング、アーキテクチ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミング
-
小学1年生の子です。塾に行かせ...
-
vba クリップボードクリアにつ...
-
プログラマーと学歴の関係性に...
-
Webサイト内に埋め込んだmp4動...
-
正規表現で複数マッチ条件で悩...
-
windowsでテキストファイルの各...
-
楽しくて最高のプログラミング...
-
プログラミング ソースコード
-
Pythonって何を意識した言語な...
-
プログラミングを教えたいです...
-
pythonで複数画像からgifを作る...
-
pythonにてseleniumを使うも、...
-
Pythonでgif画像が上手く作れない
-
Google ColaboでGUI作成
-
テキストファイルのファイル名...
-
プログラミング、アーキテクチ...
-
そのまま使っただけなのに・・...
-
このURLで広告を出しているのは...
-
chatGPTで次々と質問をしていく...
おすすめ情報