こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ある操作に対するコマンド文が分りません(UNIX)

UNIXを用いて解析を行い、datファイルを2種類出力し、
その後の計算をこれまでは手作業で行っていたのですが、
煩雑であるためバッチファイルを用いて全自動化したいと考えています。
しかし私はプログラミング初心者で、どのようなコマンドを用い、
どのようにコードを書けばいいのか皆目見当がつきません。
何卒、ご教授ください。

以下に、解析により出力される2つの生データを示します。
【A.datファイル】
flux1:-0.2 -8.83E-067.43E-06
flux1:-0.199499875-9.09E-066.99E-06
flux1:-0.19899975 -8.70E-066.98E-06
flux1:-0.198499625-8.04E-067.23E-06
flux1:-0.1979995 -7.81E-06 7.30E-06
flux1:-0.197499375-8.21E-066.97E-06
          (以下同様に続く)

【B.datファイル】
flux1:-0.2 -1.59E-05-1.59E-05
flux1:-0.199499875-1.57E-05-1.57E-05
flux1:-0.1989997 -1.55E-05-1.55E-05
flux1:-0.198499625-1.53E-05-1.53E-05
flux1:-0.1979995 -1.52E-05-1.52E-05
flux1:-0.197499375-1.50E-05-1.50E-05
          (以下同様に続く)

この2つのファイルに対して行いたい操作が3つあります。
-----------------------------------
(1)1÷(A.datの2列目)
(2)-[(A.datの4列目)÷(B.datの3列目)]
(3)操作(1)、(2)の結果をまとめたC.datファイルの出力
-----------------------------------
これら(1)~(3)の操作をバッチファイルで行い、以下のC.datファイルを自動で出力したいです。

【C.datファイル(最終的に出力したいファイル)】
-5    0.467339354
-5.012534470.445290436
-5.0251319430.449360934
-5.0377928950.470909614
-5.0505178080.481591986
-5.0633071660.465199238
   (以下同様に続く)

どのようにコードを書けばいいのか、皆目見当がつきません…

加えて、もう1つ質問があります。
C.datの一列目の数値は-5から-50まで続くのですが、
ある特定の数値範囲の行のみを抜き出すには、どのようなコマンドを用いればよいのでしょうか?
例えば、一列目の数値が-5.06~-5.02の範囲にある行のみを抜き出し、
-5.0251319430.449360934
-5.0377928950.470909614
-5.0505178080.481591986
というデータだけのdatファイルを出力するにはどうすればよいのでしょうか?
(grepコマンドを用いれば可能ですか?)
こちらも合わせてお答えいただけると非常に助かります。
ご教授よろしくお願い致します。

投稿日時 - 2011-10-24 18:07:32

QNo.7091820

困ってます

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

通知メールでは空白で区切られてますので、どうやら okwave の表示がおかしいみたいですね。

それでメールの方はデリミタに、タブとスペース両方が混ざった状態なんですが、それだと awk の -F オプションを

-F'[\t :]+'
とかいっその事
-F'[[:space:]:]+'

としないと項目の分離が上手くいきません。

投稿日時 - 2011-10-26 19:41:23

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

paste -d: a.txt b.txt | awk -F'[ :]+' '{printf "%.8f %.8f\n",1.0/$2,-$4/$7}' > c.txt

みたいのでいいんですかね?

ただ気になるのが各列の区切りに空白文字が、あったり無かったりすることです。一応ある前提で、こっちで修正したデータ使ってテストしたんですが、答えが全然合いません。perl に置き換えても一緒っぽいけど?

-5.00000000 0.46729560
-5.01253447 0.44522293
-5.02513194 0.45032258
-5.03779289 0.47254902
-5.05051780 0.48026316
-5.06330716 0.46466667

おまけについては
grep '^-5.0[2-5]' c.txt

投稿日時 - 2011-10-25 20:51:04

補足

回答ありがとうございます。
申し訳ありません、質問文の確認ミスです。
正しくは以下のような区切りのデータです。

【A.datファイル】
flux1:-0.2 -8.83E-06 7.43E-06
flux1:-0.199499875 -9.09E-06 6.99E-06
flux1:-0.19899975 -8.70E-06 6.98E-06
flux1:-0.198499625 -8.04E-06 7.23E-06
flux1:-0.1979995 -7.81E-06 7.30E-06
flux1:-0.197499375 -8.21E-06 6.97E-06


【B.datファイル】
flux1:-0.2 -1.59E-05-1.59E-05
flux1:-0.199499875 -1.57E-05-1.57E-05
flux1:-0.19899975 -1.55E-05-1.55E-05
flux1:-0.198499625 -1.53E-05-1.53E-05
flux1:-0.1979995 -1.52E-05-1.52E-05
flux1:-0.197499375 -1.50E-05-1.50E-05


【C.datファイル(最終的に出力したいファイル)】
-5    0.467339354
-5.012534470.445290436
-5.0251319430.449360934
-5.0377928950.470909614
-5.0505178080.481591986
-5.0633071660.465199238

ご指摘いただいた方法を試してみます!

投稿日時 - 2011-10-26 17:44:02

ANo.1

無理にシェルスクリプトで書こうとあがくより, 何らかのプログラム言語を使う方がいいと思うなぁ.

投稿日時 - 2011-10-24 18:28:03

あなたにオススメの質問