dポイントプレゼントキャンペーン実施中!

HP-UX,UNIX環境です。

あるファイルを⇒a.txtとします。
a.txtには以下のような記述だとします。(行は複数行)
20110322000000 00:00:00 PERFORMANCE all
20110322000100 00:00:00 PERFORMANCE all
20110322000200 00:00:00 PERFORMANCE all
20110322000300 00:00:00 PERFORMANCE all

shでのループ処理は以下のようにしたいです。
(1)2行目の1カラム目から1行目の1カラム目を引き算、
(2)計算結果をファイルにリダイレクト
(3)4行目の1カラム目から3行目の1カラム目を引き算
(4)計算結果をファイルにリダイレクト

※awkを使えば出来そうですが、やり方がわかりません。

お手数ですが、ご回答宜しくお願い致します。

A 回答 (4件)

awk使ってよいなら、こうかな:



NR % 2 == 1 { s = $1 }
NR % 2 == 0 { print $1 - s }
「awkで行ごとの計算について」の回答画像2

この回答への補足

osamuyさん
ありがとうございます。

print $1 -sした結果を偶数行の先頭に付与することも可能ですか??

補足日時:2011/03/29 21:07
    • good
    • 0

なんで「CGI」のところでシェルスクリプトやawkの質問をするのでしょうか。



{
num = $1;
if (getline > 0)
print $1 - num;, $0
}

余計な行はないと仮定しています。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

shとかのカテゴリがなかったので、ここにしてしまいましたが、
その他(プログラミング)とかありましたね。

お礼日時:2011/03/30 10:16

> shでのループ処理は以下のようにしたいです。



2n行目から2n-1行目を減じるという処理でしょうか。
awk使わなくてもシェルスクリプトでもできる処理ではありますが。

$ DATA='20110322000000 00:00:00 PERFORMANCE all'
$ set -- $DATA
$ echo $1
20110322000000

既に指摘されている通り、20110322000000は整数を32ビットとして扱った時に扱える範囲を越えてますので(64ビットで扱うなら問題起こらない)分割して処理する等対処する必要があるかも知れません。

この回答への補足

saijyo_739さん
回答ありがとうございます。

確かに計算のビット数は意識してませんでした。
10桁どうしの引き算になりそうです。

echoで10桁どうしの簡単な引き算をしてみましたが、
ちゃんと表示できるみたいですね

補足日時:2011/03/29 21:10
    • good
    • 0

awkなら、現在の行は組込み変数NRで参照できる。



奇数行目(NR % 2 == 1) : 1カラム目($1)を適当な変数に退避
奇数行目(NR % 2 == 0) : 1カラム目から、奇数行目で退避した値を引いて出力

よって

awk '{ if ( NR %2 == 1) { t = $1 } else { print $1 - t }' < 入力 > 出力

...なんですが、例にある14桁の数字だと、処理系によっては計算精度をオーバーして正常に計算できません。そのような場合は、筆算の要領で分割して計算するか、多倍長や無限桁整数に対応している言語(Ruby,Python等)で同様のプログラムを作るのがいいでしょう。

この回答への補足

kmeeさん
回答ありがとうございます。

print $1 - t した結果を偶数行の先頭に付与する事も可能ですか??

補足日時:2011/03/29 21:06
    • good
    • 0

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