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

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

このQ&Aに関連する最新のQ&A

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

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

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

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

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


(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

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

。。

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

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

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



決った文字列

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

このQ&Aに関連する人気のQ&A

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

このQ&Aと関連する良く見られている質問

Qテキストファイル中の文字列を書き換えるスクリプトを書きたい

テキストファイルの文字列を書き換えるスクリプトを考えています。
今、次のところまで出来るようになりました。本当は「こんにちは」の文字列を全て「HELLO」に置換したいのです。現在は一行の中で最初の「こんにちは」は置換されますが、2番目以降が置換されません。同じ行中の2番目以降も置換するには、どうしたら良いでしょうか?

<置換前ファイル:sample.txtの中身>
こんにちはこんにちはこんにちはこんにちは
こんにちは
こんにちは


<置換前ファイル:sample.txtの中身>
HELLOこんにちはこんにちはこんにちは
HELLO
HELLO



<置換スクリプト>
Set fso = CreateObject("Scripting.FileSystemObject")
Set regEx = New RegExp
Set inFile = fso.OpenTextFile("C:\static\sample.txt")
Set outFile = fso.CreateTextFile("C:\static\sample1.txt")

regEx.Pattern = "こんにちは"
repStr = "HELLO"
Do Until inFile.AtEndOfStream
tempLine = inFile.ReadLine
repLine = regEx.Replace(tempLine, repStr)
outFile.WriteLine repLine
Loop

inFile.Close
outFile.Close

テキストファイルの文字列を書き換えるスクリプトを考えています。
今、次のところまで出来るようになりました。本当は「こんにちは」の文字列を全て「HELLO」に置換したいのです。現在は一行の中で最初の「こんにちは」は置換されますが、2番目以降が置換されません。同じ行中の2番目以降も置換するには、どうしたら良いでしょうか?

<置換前ファイル:sample.txtの中身>
こんにちはこんにちはこんにちはこんにちは
こんにちは
こんにちは


<置換前ファイル:sample.txtの中身>
HELLOこんにち...続きを読む

Aベストアンサー

#2の方のようにすればいいと思いますが、
この場合であれば、特に正規表現が必要というわけではないので、RegExp オブジェクトを使う必要は無いと思います。
repLine = Replace(tempLine, "こんにちは", repStr)
で一行全部の置換が行えます

Qシェルスクリプトでファイル内の数値文字列を数値として扱うには

失礼します。
シェルスクリプトでファイル内のテキスト(数値文字列)を取得して、それを使って計算するにはどうすれば良いでしょうか?

str:ファイル内のテキスト(数値文字列)

res=$(( $str + 1 ))

・エラー
")syntax error: invalid arithmetic operator (error token is "


よろしくお願いします。

Aベストアンサー

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをexprに書き換えたところ
$ ./test2.sh
Using expr
09:19:00.302748000
09:19:19.259990000

exprだと19秒ですが、$(( 演算 )) だと10秒程度なので、演算が多くなれば確かにexprは不利ですね。

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをe...続きを読む

Qバッチファイルで、あるスクリプトがエラーになっても、つぎのスクリプトを実行させたい

バッチファイルで、あるスクリプトがエラーになっても、つぎのスクリプトを実行させたいと考えています。
具体的には、
■call.bat■
******************
call 1.bat
call 2.bat
******************


■1.bat■
******************
mkdir test1
******************

■2.bat■
******************
mkdir test2
******************

の3つのバッチファイルで、1.batがエラーになっても
2.batを実行させたいと考えています。
どうしたらいいのでしょうか。

よろしくお願いします。

Aベストアンサー

>1.batが終了しなくても、
>2.batを実行させたいと考えています。

なるほど。簡単そうに出来るのは
start cmd /C 1.bat
start cmd /C 2.bat
ですかね。

Qhp-uxについて教えてください

お願いします。

指数型で出力されているデータを実数型に
変換する方法、コマンドなどありましたら教えてください。

よろしくお願いします。

Aベストアンサー

> 上記、実行した結果以下のようになってしまいます。

あんな簡単なスクリプトが動かなくて、ちょっとドキッとしました。

$1の前は、カンマです。念の為、awk の部分を見やすいように全角で書いておきましょう。

awk ’{printf ”%20.15f”,$1}’

# やっぱり、みずらい…

Qシェルスクリプトで文字列置換

初心者です。

以下のようなシェルスクリプトがあるとき、
------------------------------------
#!/bin/sh

STRING=zbcdcbz

# 変換前
scho ${STRING}

# 文字列変換を実行
# ?????

# 変換後
scho ${STRING}
------------------------------------

変数STRINGの値を、"zbcdcbz"から、"abcdcba"に
変換するには、どうしたらよいでしょうか?

何かご存知の方がいらっしゃったら、回答願えないでしょうか。
よろしくお願い致します。

Aベストアンサー

まず「sedコマンドが使えないかな?」と思いましたが.....相手は変数なんですよねー。

で、強引かつイマイチかっこ悪いですがsedにこだわって.....

・・・・・・・・・・・
# 文字列変換を実行
echo ${STRING} > /tmp/hoge.txt
STRING=`sed 's/z/a/g' /tmp/hoge.txt`

# 変換後
・・・・・・・・・・・

で、どうでしょうか?
今手元に機械がないので実際に試せないのですが、sedをキーワードにお手元の実機でいろいろやってみればもう少しスマートな方法があるかもしれません。

参考URL:http://www.h3.dion.ne.jp/~xosada/unix/normal.html


人気Q&Aランキング

おすすめ情報