• 締切済み

Linuxコマンド(gawk)の性能について

UNIXからLinuxへの移植を行っています。 通常Linuxに移植した場合、Linuxの性能上 処理時間が短縮されると聞いていますが、 UNIXのシェルで作成されているプログラムを移植しましたところ、逆に処理時間が遅延してしまいました。 シェルのどの部分で時間がかかっているか調べましたところ、「gawk」コマンドで時間がかかっている模様です。 (gawk実行時間 UNIX:21行/秒、Linux:5行/秒) (gawk -v dat=$key -v rno=$RECNO 'BEGIN{FS=",";OFS=","}{if(dat == $18){$18=rno substr($18,5);print $0} else {print $0}}' $MOTOOBJ > $KEKKAOBJ) 時間短縮を目標に作業を行っていますので、遅延するのであれば 理由を提出しなければなりません。 ご存知の方がおられましたら、ご教授願います。 よろしくお願いいたします。

みんなの回答

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.2

大きな csv みたいだから、物理ディスクとかファイルシステムの違いが大きく影響すると思うよ。 とりあえず出力を >/dev/null にしてみてもう一度時間を比較してみるのはどう?

  • entree
  • ベストアンサー率55% (405/735)
回答No.1

> 通常Linuxに移植した場合、Linuxの性能上 処理時間が短縮されると聞いていますが、 そうとは限りません。同じLinux 上でも bash(デフォルト と ashでは全然処理速度が違います。(ashの方が速い) それは当然ですよね? やっていることは同じでも実装が異なるわけですから。 awkも同じです。Unix(SolarisかHP-UXかAIXかは知りませんが)のawkの実装と gawkの実装は全く別物です。 なので、Unix上で速いコマンド、Linux上で速いコマンドがあるのは当然のことです。 gawkについて言えば、マルチバイトを無効にする(環境変数LANGをCに設定する) ことで、ご提示いただいたプログラムは4倍くらい高速になるようです。 ただし、keyにマルチバイト文字を含む場合、substrが文字単位ではなく、 バイト単位で解釈されます。 Unixのawkの中にはそもそもマルチバイトを扱えない実装もあるでしょうから、 結果としてUnixのawkの方が高速になっているだけかもしれません。

関連するQ&A

  • unix.linuxのシバンについて

    UNIX・ Linux初心者です。 現在シェルについて学習している所です。 そこで質問なのですが、シェルスクリプトの1行目にシバンと呼ばれるものを書きますよね? #!/usr/bin/sh や #!/bin/shといったような。 この二つそれぞれ同じ実行結果を返してくれるんですが、/usrの有無の違いが分からないんです。 /usrを付けている時と付けていない時の違いを教えていただけないでしょうか?回答お願いします。

  • perlからsystemコマンド呼ばれる時のシェルについて

    HP-UX/perl4 で作成したスクリプトを、Linux(Red Hat)/perl5 へ移植するに当たって、system関数の動作が異なり困っています。 HP-UX では ksh をシェルとして使用していたため、perl からのsysytem関数で実行するsystemコマンドも、kshで動作するものを使っていました。Linuxでもログインシェルをkshに設定しました。 ところが、HP-UXで使っていたprintコマンドが使用できず、以下のエラーメッセージが出ます。 sh: print: command not found シェルはkshを指定していても、perlからsystem関数やバッククウォート`` でシステムコマンドを実行するときは、shが使われるようなのです。 perl内の記述は以下のとおりです。 system("print 'a'"); "print"の前に"ksh "をつけたり、"print"を"echo"に変えると、正しく動作します。 移植するperlの本数が多いのと、print以外にもこの問題が起きるかもしれませんので、できれば perl 内からのシステムコマンド実行時にもログインシェルとおなじ ksh で動くようにしたいのですが、どのようにすればよいのでしょうか? よろしくお願いいたします。

  • Linux系の参考、または勉強になる本ありますか?

    もともとは、windowを使ってましたが、別のPCでLinux系のopenSUSEをインストールして 使ってます。 もともと大学で、道具として、使うソフトはxfig, gnuplotとか使っていました。 今は、windowsにも移植されてますが・・。 他にもシェルとかmakefileを作っていじっていましたが、もう10年前のことなので忘れてしまいました(汗。 またLinuxを使いこなしたいと思ってます。 openSUSEでもそういった便利なソフトを使ってみたいと思うのですが、何かソフトや操作等で 参考になる本はありますでしょうか? 今は、そういった本は、本屋では、ubuntu magazine(前はunix magazine), GIMPとかメールソフト等、あと新しくなった操作性など、載ってますが、 本気でLinux系を使いこなし方はありますでしょうか?こういう本がいいとあれば教えてください。 やはり、自分がLinuxが向いてるとか人によって違うものなのでしょうか? やはり、あくまで、研究のための道具をしての域をでないのでしょうか・・・。 たくさん質問してすいません。 アドバイスお願いします。

  • シェルスクリプトでバックグラウンドで実行したコマンドの実行結果を取得するには

    OS redhat linux シェル bornシェル シェルスクリプトでバックグラウンドで複数のコマンドを実行し、 すべてのコマンドが正常に終了したら次の処理へ進むみたいな事をしたいのですが、可能でしょうか? 直列にすればよいのですが、処理時間短縮の為、並列に処理したいのです。 宜しくお願いします。

  • シェルの学習

    私はUNIXを使ったことがないのですが、仕事でシェルを使うことになりました。Linuxで勉強しようと思っているのですが、シェルとは難しいものなのでしょうか。また、どの位の学習時間が必要でしょうか?ちなみにプログラミングはCとJavaのプログラミングの経験はあります。

  • マイクロソフトのバッチ処理について

    マイクロソフトのバッチ処理は、MSDOSのころから連綿として続いている機能で、unixのシェルを適用させたものと思います。 記述されているコマンドを上から順番に進めていくということになると思っていますが、ループ化することはできるのでしょうか。 100個のファイルがあって1つ1つナンバリングされていますが、それを一挙に処理するために同じ処理を100行にわたって書くことを行っています。ただし、ファイル名が違うのでそこは変えていますが。 同じことを100回書くのが苦痛なのでperlのようなもので書き出す工夫はしています。バッチがループで回ってループカウンタとファイル名をうまく合わせると2,3行で済むのではないかと思うのですが。こういうことはできないものなのでしょうか。unix, Linuxにいったん渡してそこでシェルスクリプトで処理することは今回はできません。Windows上限定のことなのですが。よろしくお願いします。

  • UNIX系のコマンドで2つの時刻の差分(秒)を求めるには?

    UNIX系のコマンドで、2つの時刻の間が何秒かを求めたいのですが、どうすればいいでしょうか? 時刻の表記は任意です。 具体的な状況としては、 1.ある時刻にファイルにその時刻を出力する。 2.その数時間後に、1.で作ったファイルの時刻を読み取って、今の時刻との差分を求める。 というものです。1.のファイル作成も2.の操作も自分でやるので、1.での時刻の出力形式は自由に選べます。 UNIXで現在の時刻を1900年?から数えた秒数で出力できたら一発なんですが、そのような形式で出力ってできるのでしょうか? また、それができない場合、どうすればいいか教えていただけると助かります。 OSはsolarisのBシェルを使います。 以上、よろしくお願いします。

  • unixのawkについて

    unixでawkを使ってフルパスからディレクトリとファイル名に分けようと しているのですが、上手くいきません。 例えば ①/aaa/bbb/ccc ②/111/222/333/hoge.txt ③/hoge/foo/bar/dk@0:1 を ①/aaa/bbb と ccc ②/111/222/333 と hoge.txt ③/hoge/foo/bar と dk@0:1 としたいのです。 echo "/111/222/333/hoge.txt" | gawk '{sub(/\/.*$/,"",$0); print}' としてみたのですが、 ディレクトリだけを取り出そうとしたのですが上手くいきません。 よろしくお願いします。 OSは、Solaris、Linuxになります。

  • bashでのunixtime変換について

    bashでのunixtime変換について質問です。 下記のようなunix時間と数値が記載されたテキストがあり、 unix時間を変換する必要がありました。 ※ここではunix時間のみ変換したかった # more unixtime.txt 1387875600 10 13 15 1387879200 27 19 26 1387882800 14 17 19 1387886400 22 16 14 そこで下記のように2行で変換しました。 cat unixtime.txt | awk '{print $1}' >>unix.txt cat unix.txt | awk '{print strftime("%Y-%m-%d %H:%M:%S",$1)}' >>time.txt そこで質問です。 (1)2行で実行したコマンドを1行で実行するにはどのように書けばいいのでしょうか。  ワンライナーでかっこ良く書きたい・・・・です。 (2)unixtime.txtのunix時間を変換して"%Y-%m-%d %H:%M:%S"+数値の形式とするには どのように書けばいいのでしょうか。 お手数ですが皆様のお知恵をおかしいただきたく。 よろしくお願いします。

  • 連想配列で時間短縮したい

    aaa.txt 06011800, 5.3 06012100, 5 06020000, 4.5 06020300, 6.2 … bbb.txt 06011800, 5.1 06012100, 7.5 06020000, 5.1 06020300, 9.3 … という二つのファイルがあります。 以下のプログラムを用いて、 06011800, 5.3, 5.1 06012100, 5, 7.5 06020000, 4.5, 5.1 06020300, 6.2, 9.3 … といった感じでデータを作る事に成功したのですが、どうしてもループに無駄が多く、時間がかかってしまいます。 連想配列などを使えば時間が短縮出来そうなのですが、よくわかりません。 ご教示いただけないでしょうか。 以下、作成したプログラム。 $csvfile1 = $ARGV[0]; $csvfile2 = $ARGV[1]; open(DAT1, $csvfile1) || die $!; while($line=<DAT1>) { chomp($line); @dat = split(/,/,$line); open(DAT2, $csvfile2) || die $!; while($line2=<DAT2>) { chomp($line2); @dat2 = split(/,/,$line2); if($dat[0] == $dat2[0]){ print "$dat[0],$dat[1],$dat2[1]\n"; } } } close(DAT);

    • ベストアンサー
    • Perl