Linux(BASH)上での数値定数について

このQ&Aのポイント
  • BASH上でのPSのRSS合計値の算出方法について教えてください。
  • 合計値が9桁以上の場合、awkを使用して整数に変換する方法があるのでしょうか。
  • お知恵をお借りできれば幸いです。
回答を見る
  • ベストアンサー

Linux(BASH)上での数値定数

お世話になります。 BASHじょうにてPSのRSS合計を算出使用と考え、 例として、以下コマンドを実行しました。 --------------------------- $ ps aux | awk '{sum+=$6;} END{print sum;}' 3113748 --------------------------- 合計値が9桁以下等なら良いのですが、 ある程度行くと、例として合計値が以下の様に表示されました。 --------------------------- $ ps aux | awk '{sum+=$6;} END{print sum;}' 5.00383e+09 --------------------------- awkを使用した際の合計値を何とか整数にしたいと考えているのですが 可能なのでしょうか。 恐れ入りますが、知恵をお借り頂けないでしょうか。 よろしくお願いします。

  • un-G
  • お礼率42% (3/7)

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

  • ベストアンサー
  • geshon
  • ベストアンサー率61% (44/72)
回答No.3

awk のスクリプトの先頭に BEGIN{OFMT="%d"} を入れるか、 表示の時に print ではなく、printf "%d",sum のように すれば良いと思います。 OFMT の意味は man awk などで調べてください。 awkが整数値としてどの範囲まで有効かは、ご自分で調べてください。

un-G
質問者

お礼

解答ありがとうございます。 両方とも"%d"なのはなぜだろう。と思ったら、「OFMT」にて指定する内容は printfでの指定フォーマットなのですね。 提示頂いた両方の方法にて今回行いたかった情報に対し 算出できることを確認しました。 今回は急ぎ、perlにて算出したため、今後の選択しや 他で活用したいと考えます。 > awkが整数値としてどの範囲まで有効か 今まで、桁数を気にするほどの内容は無かったのですが、 「awk」に限らず、常に頭に入れておいたほうが良さそうですね。 ありがとうございました。

その他の回答 (2)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

追伸。 awkもpsも「bash」ではありません。

un-G
質問者

お礼

ご返答頂きありがとうございます。 > awk の実装はちょっと調べないとわからないですが、まあ、その程度しか用意されていないのでしょう。 > PythonやRuby、Perl+Bignum等を使って、多倍長や無限長の整数で計算するのはどうでしょう。 別のものならある程度簡単に出来るのでしょうか。 > 別解としては、awkで多倍長演算するプログラムにすることです。 awkのみの場合、一工夫しないと駄目そうですね。 含めて調べようと思います。 > 追伸。awkもpsも「bash」ではありません。 確かに組み込みコマンド…では無いですよね。 質問の仕方が悪かったようです。 急いで書いたら、誤変換だらけで、コメントも頂けないかな?と思ったのですが、 助かりました。 頂いたキーワード元にがんばってみます。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

awk の実装はちょっと調べないとわからないですが、まあ、その程度しか用意されていないのでしょう。 PythonやRuby、Perl+Bignum等を使って、多倍長や無限長の整数で計算するのはどうでしょう。 別解としては、awkで多倍長演算するプログラムにすることです。

un-G
質問者

お礼

解答ありがとうございます。 取り合えず、今回必要な桁数は「Perl」のみで出来そうです。 ※ まったくといってさわったことは無いのですが。 PythonやRubyでの算出方法も今後の課題として試してみたいと思います。 ありがとうございました。

関連するQ&A

  • C言語のプログラミング (基礎)教えてください。

    以下のような問題があります。 プログラムを作ってみたのですが、 コンパイルすると無限ループになったり、 正しく結果が出ません。 どのように直せば良いか教えていただけると助かります。 よろしくお願いします。 整数が入力される度に今までの合計を出力するプログラムを作成しなさい。なお、0 が入力されたら終了するものとする。 ただし、繰り返しの命令は while 文を使用し、条件は常に真 ( 1 ) とし、break 文を使うこと。 ▼実行例 整数:1     合計:1 整数:2     合計:3 整数:3     合計:6 整数:0 ******************************** #include<stdio.h> int main(void) { int n,sum; sum=0; while(1){ printf("¥n整数:"); scanf ("%d", &n); sum=sum+n; printf("¥n    合計:%d", sum); scanf ("%d", &sum);          if(n==0){ break;   } } }

  • プログラミング分からないので教えてください

    【演習1】 コマンド引数で台形の上底、下底、及び高さを指定して実行すると、台形の面積を算出し表示するプログラムを作成せよ。ただし、以下の条件を満たすこと。 条件: (1)コマンド引数が不足していた場合は<実行例(2)>のようにエラーメッセージを表示する。 (2)上底、下底、高さ、及び面積は実数値として処理する。 (3)台形の上底、下底、及び高さを引数として受け取って面積を算出するユーザー関数を作成し使用する。 (4)面積の表示はmain関数で行い、<実行例(1)>のように表示する。 そのとき、上底、下底、高さは小数点以下2桁、面積は小数点以下3桁で表示する。 <実行例(1)> Z:\>ee1001 3.5 4.2 8.37↓ 上底3.50,下底4.20,高さ8.37の台形の面積は32.224 <実行例(2)> Z:\>ee1001 3.5 4.2↓ 引数が足りません。 【演習2】 点数を3つキー入力すると、3つの点数の合計点と平均点を表示するプログラムを作成せよ。ただし、以下の条件を満たすこと。 条件: (1)点数は整数で入力する。。 (2)入力された3つの点数のうち1つでも0未満だった場合は、<実行例(3)>のようにエラーメッセージを表示する。 (3)3つの点数を受け取って、3つの点数の合計点と平均点を算出するユーザー関数を作成し使用する。また、合計点は整数、平均点は実数で算出する。 (4)合計点と平均点の表示はmain関数で行い、<実行例(1)(2)>のように表示する。 そのとき、合計点は全4桁、平均点は全6桁小数点以下1桁で表示する。 <実行例(1)> 点数: 80↓ 点数: 65↓ 点数: 98↓ 合計点 243 平均点 81.0 <例実行(2)> 点数: 80↓ 点数: -1↓ 点数: 98↓ 点数は0以上で入力してください よろしくお願いします

  • c言語超初心者です。2

    #include <stdio.h> int main(void) { int na,nb, nc; int sum; double ave; puts("三つの整数を入力してください."); printf("整数A:"); scanf("%d", &na); printf("整数B:"); scanf("%d", &nb); printf("整数C:"); scanf("%d", &nc); sum=na+nb+nc; ave=(double)sum/3; printf("それらの合計は%5dです。\n", sum); printf("それらの平均は%5.1fです。\n",ave); return(0); } とういうのを作ったんですが、最後のそれらの合計は%5dとやりその5の意味は整数を10進法で少なくても5桁で表示とありますが、例えば1,2,3と入力しても合計は6とでて5桁ででないんですけど。そういう意味ではありませんか?あとave=(double)sum/3;のところをave=sum/3.0としても問題なくできるのですが、どっちでやったほうがいいとかはありますか?もしあったらその理由も教えてください。

  • c言語の勉強をしているのですが、詰まってしまっています。

    複数回整数を入力し、-1以下もしくは101以上の入力で整数の入力を終了、 最後の-1以下もしくは101以上の数値を省いた 合計と平均の算出をしたいのです。 が、現状。 { int sum=0,p=0,n=0; while(0<=p){ printf("点数:"); scanf("%d",&p); if(0<=p){ sum=sum+p; n++; } } printf("%d",sum); printf("%6.2f",(double)sum/n); return 0; } で、101以上の際の処理ができません。 お教えいただける方、よろしければお願いいたします。

  • テキストファイルの行抽出

    linux環境のプログラムについて質問です。 ある特定のファイル(テキストファイル)内のデータで 指定の行を抽出する方法を教えていただきたいと思います。 現在はawkを使用してbashスクリプト内で下記のように head, tailを使用していますが、処理が重いように 感じます。perlまたはawkなどで行抽出の軽い処理は できないでしょうか? (他のunixコマンドでも結構です。) ---------------------------------------- RNUM=`awk 'END{print NR}' $1` #行番号取得 for iwl in `seq 1 $RNUM`;do BASE=`head -n $iwl $1 | tail -n 1` done #iwl ---------------------------------------- Fortran, Cなども使えますが、色々組み合わせて使う上で bash内のスクリプトで行ないたいと思います。

  • エクセルの抽出方法について

    エクセル2000を使用してます。  A  B 1   5 2  12  3   8 4合計25  というような表計算で合計値の"25"を桁ごとにセルに抽出       (例:C1に拾桁"2"D1に壱桁"5”)したいです。        合計値は1桁~6桁くらいまで固定してません。        C1、D1に入る関数は固定し、合計値が算出されると自動的に        各桁セルへ入るというようにしたいです。 良い方法がありますでしょうか、教えて下さい。

  • c言語 for文

    /*指定された個数だけ整数を読み込んで合計値・平均値を算出*/ #include <stdio.h> int main(void) { int i; int sum=0; int num,tmp; printf("整数は何個ですか:"); scanf("%d",&num); for(i=0;i<num;i++) {printf("No.%d:",++i); scanf("%d",&tmp); sum = sum + tmp; } printf("合計値:%d\n",sum); printf("平均値:%.2f\n",(double)sum / num); return(0); } C言語の勉強を始めたばかりのものです。 指定された個数だけ読み込めません 汗 前置と後置をまぜたあたりがよくないのかなと思うのですが。。。 どうしておかしくなるのか教えてください。 内部でどういった処理が行われているのかまだあまりわからない状態です。 ちなみに4と入力した結果は以下です。 整数は何個ですか:4 No.1:4 No.3:3 合計値:7 平均値:1.75

  • awkについて

    度々すみません。awkについて先程教えて頂いたものですが、少し変更しようと思っているのですが上手くいきません。変更していることは、以下の○○○の内容を固定ではなくてコマンドラインから渡したいです。 ウェブで調べたところARGVというのを使うことはわかりました。そこで"○○○"からARGV[0]に変更してコマンド実行時に引数を与えたのですが、「○○○というファイルを開けません」というエラーになってしまいます。実行したのはawk -f awk data.csv ○○○です。なぜ引数をファイル名だと認識してしまうのでしょうか。初歩的で申し訳ありませんが教えて下さい。 BEGIN{ goukei = 0 count = 0 } { #フィールドの8番目の条件が一致する場合のみ9番目を合計 if($8=="○○○"){ goukei += $9 count++ } } END{ if(count!=0){ print "合計は", goukei print "平均は", goukei/count } else{ print "条件に一致するのない” } }

  • awkからcshへの複数値返却

    スペースデリミタのデータファイルをcsh+awkで解析する機能を作っているのですが、shのreadを使った場合のように、複数の値をshell側に返す方法がわかりません。 例)shの場合(本当はva1,val2は1つの変数に設定したいので、あくまで例) ------------------------------------- % less list KIND1 YES NO KIND2 NO YES % less echo_hoge.sh #!/bin/sh while read val1 val2; do ←★このval1 val2に設定する手段がcshで見つからない echo $val1 $val2; done < list ------------------------------------- cshでスペースデリミタでかつ使用不可文字なしのデータファイルを行単位に処理するのは難しいと考え、awkを使って処理しようと考えたのですが、awkだと1つの処理結果しかshell変数に設定できない(ように思える)ため、困っています。 例)csh+awk ------------------------------------------------ set kind1 = `cat list | awk '{ if ( $1 == "KIND1" print $2 $3)}'` set kind2 = `cat list | awk '{ if ( $1 == "KIND2" print $2 $3)}'` ------------------------------------------------ 上記のように2回読まずにうまくshell変数に設定する方法がないか教えてください(sh使用は政治上の理由でNGです)。 よろしくお願いします。

  • Excelで作った表で・・・

     よくある「単価×数量」の表を作りました。 答えに小数点以下になるものが含まれるため、その列に セル書式で小数点以下を四捨五入して整数になるように 設定しました。それぞれの答えはそれで良かったのですが、今度はさらにそれらの合計を求めようと「SUM」を 入力したら表示された整数の合計ではなく、 それぞれのセルある小数点以下の数次を合計して四捨五入してしまいます。  (例)単価×数量=1.2 表示は1    単価×数量=1.3 表示は1        計 3 になってしまう←「2」にしたい       どうしたらいいのでしょうか?教えてください。