1 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 23:55:42 .net] 腐っても鯛? 騏も老いては駑馬に劣る? 三人の碩学が生み出したスクリプト言語AWKについて語るスレ ◆ 前スレ awkについて語るスレ pc10.2ch.net/test/read.cgi/tech/1023556171/ ◆ 関係スレ シェルスクリプト相談室 pc10.2ch.net/test/read.cgi/tech/1112553783/ AWKでCGI pc10.2ch.net/test/read.cgi/php/1171804314/ 【sed】シェルスクリプト総合@LINUX Part2【awk】 pc10.2ch.net/test/read.cgi/linux/1154578200/ ◆ 参考 The AWK Programming Language (Brian Kernighan): ttp://cm.bell-labs.com/cm/cs/awkbook/index.html GAWK (GNU Projedt): ttp://www.gnu.org/software/gawk/
504 名前:デフォルトの名無しさん mailto:sage [2011/01/29(土) 10:56:30 .net] 環境を選ばないサーバ管理だったら、sh,grep,sed,tr,cut,paste,sort,uniqあたりで。 nawkとgawkの仕様差が結構あるので、awkは使いにくい。
505 名前:デフォルトの名無しさん mailto:sage [2011/01/29(土) 13:15:51 .net] こういう話題の時にSolarisとかHP-UXは出るのにAIXは出ないイメージ
506 名前:デフォルトの名無しさん mailto:sage [2011/01/29(土) 13:40:55 .net] 日本男児ならHI-UX、特にHI-UX/WE2だろ。常識やね
507 名前:デフォルトの名無しさん mailto:sage [2011/01/29(土) 14:15:09 .net] うむ
508 名前:デフォルトの名無しさん mailto:sage [2011/01/29(土) 16:56:12 .net] いやここはedスクリプトで
509 名前:デフォルトの名無しさん mailto:sage [2011/01/29(土) 18:47:15 .net] Solarisは、/usr/bin/awk /usr/bin/nawk /usr/xpg4/bin/awk 3つ別々なのが入ってた気がするな。 で、一番まともなのが3番目なので、よそから持ってきたスクリプトは、先頭の#!を 書き換えないといけないという、カオスな状態じゃなかっただろうか。
510 名前:デフォルトの名無しさん mailto:sage [2011/01/29(土) 19:23:53 .net] >>503 自分アカウントのパスは真っ先に /usr/xpg4/bin/を持ってきてたわ。
511 名前:デフォルトの名無しさん mailto:sage [2011/01/29(土) 19:25:17 .net] スクリプトを組む時はだいたい nawk を使う 他人のスクリプトを丸パクリする機会が無いのでカオスは感じた事が無い
512 名前:デフォルトの名無しさん mailto:sage [2011/01/29(土) 19:32:53 .net] >>505 話の流れが>>497 >>498 なので、可搬性が問題なんだよ。
513 名前:デフォルトの名無しさん mailto:sage [2011/01/29(土) 19:39:08 .net] ウチは RHEL と Solaris だけ考えれば良いから、awk で問題がある時は Perl か Python で済ますわ
514 名前:デフォルトの名無しさん mailto:sage [2011/01/30(日) 05:43:19 .net] #!/usr/bin/env [gn]*awk だろ常考
515 名前:デフォルトの名無しさん mailto:sage [2011/02/01(火) 10:39:45 .net] shebang行に /usr/bin/env 書くのってあんま良いと思えないんだよなあ 複数の引数の扱いとか、環境変数をそこまで信用して良いものなのかとか あと /usr/bin/ に env があることは本当に保証できるのかとか /bin/sh を書いたほうが良いんじゃないかって思ってしまう
516 名前:デフォルトの名無しさん mailto:sage [2011/02/01(火) 11:45:20 .net] この話題も定番だな。前スレの558-564でもやってたぞ。とりあえず結論だけを引用しとくわ。 >調べてみたら#!にインタープリタの引数を2つ以上与えたときの >挙動はOSによって違うようだった。 > >FreeBSD4.2: 2つ以上あっても渡る(/usrbin/env gawk -f foo) >Linux(2.6.8): 空白を含めて1つの引数として渡る(/usr/bin/env "gawk -f" foo) >Soraris(5.8): 2つめ以降の引数は無視(/usr/bin/env gawk foo) > >結局/usr/bin/env使った書き方はgawkのインストール位置の差を >吸収しようとしてるんだろうが、動作はOSによっててんでばらばら >なのであまりお勧めできないということだろうか。
517 名前:デフォルトの名無しさん mailto:sage [2011/02/02(水) 00:12:39 .net] ruby 界隈でも流行ってるな 意味も判らず「おまじない」と称して使ってるうちに 都市伝説化していくんだな
518 名前:デフォルトの名無しさん mailto:sage [2011/02/03(木) 22:33:59 .net] なぜ gawk には tr が無いのだ tr("A-Z","A-Z")とかしたいぞ
519 名前:デフォルトの名無しさん mailto:sage [2011/02/04(金) 03:31:02 .net] つ Python
520 名前:デフォルトの名無しさん [2011/02/04(金) 09:10:06 .net] >>512 BEGIN { hankaku="0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z " zenkaku="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" } { for (i=0; i<length(hankaku); i+=2) { gsub(substr(hankaku,i+1,1),substr(zenkaku,i+1,2)) } }
521 名前:デフォルトの名無しさん mailto:sage [2011/02/04(金) 09:20:39 .net] それだとtr('ab', 'ba')がうまくいかないんだよなぁ。
522 名前:デフォルトの名無しさん [2011/02/04(金) 09:54:40 .net] 同じ事じゃん
523 名前:デフォルトの名無しさん mailto:sage [2011/02/04(金) 19:22:21 .net] 汎用的に1つ作っとけばいいじゃん
524 名前:デフォルトの名無しさん mailto:sage [2011/02/05(土) 20:23:34 .net] >514みたいなベタ打ちじゃなくて A-Zあ-ん こういう表記で置換する方法ある?
525 名前:デフォルトの名無しさん mailto:sage [2011/02/05(土) 20:37:26 .net] >>518 tr 使えば?
526 名前:デフォルトの名無しさん mailto:sage [2011/02/06(日) 03:05:39 .net] tr コマンドって環境によってマルチバイトの扱いが違わね?ウチの場合 Ubuntu10.04に入ってるtr(GNU coreutils)7.4はどうやら2文字扱いにしちゃうらしいが MacOSX10.5に入ってるtr(バージョン判らんがman見るとBSD系ぽい)は1文字扱いにしてくれた
527 名前:デフォルトの名無しさん mailto:sage [2011/02/06(日) 05:00:06 .net] UNICODE = 文字数 mbcs = バイト数
528 名前:デフォルトの名無しさん mailto:sage [2011/02/07(月) 08:10:44 .net] んーと、どゆこと? gnome-terminalはユニコード設定のはずなんだが… 他にやらなきゃいけないことがあるってこと?
529 名前:デフォルトの名無しさん [2011/02/09(水) 23:11:37 .net] awk++使ってる人いる? awk.info/?doc/dsl/awkplusplus.html
530 名前:デフォルトの名無しさん mailto:sage [2011/02/10(木) 14:20:51 .net] 最近、awkの存在を知りました。 いろんな言語を触っては挫折・・・触っては挫折・・・を繰り返していました。 awkは何となくマスター出来そうな気がします。 これから頑張ります!! 256倍の本を今は読んでおります。
531 名前:デフォルトの名無しさん mailto:sage [2011/02/16(水) 02:02:44 .net] gawkでフィールドをソートして表示したいんだが {split($0, a);asort(a);for(i=1;i<NF;i++){printf("%s%s", a[i], FS);}printf("%s\n", a[NF]);} よりもスマートな方法ある? $1〜$NFが入った特殊配列みたいなのがあったらうれしいのだが。
532 名前:デフォルトの名無しさん mailto:sage [2011/02/16(水) 07:22:58 .net] >>525 $iとか書けるし代入もできるから $1〜を保存しなくていいのなら、後半は for(i=1;i<=NF;i++){$i=a[i]} print と書けばちょっと短くなるな。
533 名前:デフォルトの名無しさん mailto:sage [2011/02/16(水) 12:11:40 .net] >>526 なるほど、そうできるのか。ありがとう。
534 名前:デフォルトの名無しさん mailto:sage [2011/02/17(木) 01:07:36 .net] www.kt.rim.or.jp/~kbk/gawk-3.1/ に置いてあった win32用gawkがいつの間にか公開停止になっていた。 wn32のgensubが使
535 名前:ヲて日本語が扱えて、 かつexeのみで稼動するのでインストール不要なのが便利で 公私にわたって愛用していたので、非常に悲しい・・・ [] [ここ壊れてます]
536 名前:デフォルトの名無しさん mailto:sage [2011/02/17(木) 02:14:57 .net] www.vector.co.jp/soft/win95/util/se376460.html ↑とは違うの?
537 名前:デフォルトの名無しさん mailto:sage [2011/02/18(金) 11:30:36 .net] それは少し古い. gawk-mbcs-win32-20090920.zip が手元にあるので必要なら再配布するが?
538 名前:528 mailto:sage [2011/02/19(土) 01:36:10 .net] >>530 もし私に言ってくれているのであれば、 exeのみだけど2009/11/24版が手元にあるので、 これを使い続けようと思う。ありがとう。
539 名前:デフォルトの名無しさん mailto:sage [2011/02/19(土) 08:18:59 .net] 俺の手元に、gawk-mbcs-win32-20091124.zip があった。 欲しい人がいて、かつ再配布に問題無いという事がわかればどっかにうpするが。 しかしなんで配布やめちゃったんだろね。 どこからか拝借したコードとかのライセンス問題なのかな?
540 名前:デフォルトの名無しさん [2011/02/19(土) 22:51:02.65 .net] AWK++によるオブジェクト指向入門 ja.wikibooks.org/wiki/AWK%2B%2B%E3%81%AB%E3%82%88%E3%82%8B%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E5%85%A5%E9%96%80 awk++は面白そうだけど、現実にはawkでOOをやる人はほとんどいないだろう。 そもそもawk使いはOOを理解できない高齢者がほとんどだし。 でも、gawkがデフォルトでOOに対応すればawkでオブジェクト指向する人も増えるかもね。
541 名前:デフォルトの名無しさん mailto:sage [2011/02/19(土) 23:05:51.24 .net] >>533 デフォでインストールされるawkでできる範囲のことしかやらないよ
542 名前:デフォルトの名無しさん mailto:sage [2011/02/20(日) 00:59:51.51 .net] 同感。>デフォでできる範囲 長めのスクリプトを書いた事があったのでOOあると便利と思うけど わざわざインストールするならperl、ruby、pythonがあるしなぁ
543 名前:デフォルトの名無しさん mailto:sage [2011/02/22(火) 10:31:51.00 .net] awkで書かれたawk++ってないの?
544 名前:デフォルトの名無しさん mailto:sage [2011/03/02(水) 23:14:41.35 .net] gawkで平仮名・カタカナの部分を抜き出したいと思ってます。 例えば「awkについて語るスレ」だったら "について" "るスレ" を変数に入れたいのですが、いい方法ありますでしょうか?
545 名前:537 mailto:sage [2011/03/02(水) 23:17:39.07 .net] 「について」と「るスレ」はそれぞれ別の変数に入れたいと思っています
546 名前:デフォルトの名無しさん mailto:sage [2011/03/02(水) 23:27:45.29 .net] アルファベット以外の部分だったら、アルファベットをFSに指定してwhileで回せばいいけど、 漢字も抜くのは難しいな。 それに、事実上変数は無限に生成するって事か。
547 名前:デフォルトの名無しさん mailto:sage [2011/03/02(水) 23:58:57.50 .net] matchの第2引数に/[あ-んア-ン]+/を持ってくるとか?
548 名前:デフォルトの名無しさん [2011/03/03(木) 13:28:46.50 .net] $0,$1...$NFを壊してもいいんだったら、私ならこうします。 gsubの検索文字鉄には正規表現を使用することができるから、 ひらがなとカタカナ以外の文字をスペースに置き換える。 gsub(/[^ーぁ-んァ-ン]/," ") ひらがなとカタカナ以外の文字は半角スペース2つに置き換わる。 あとはNFを見て表示したいように処理する。 注意すべきは、Windows版の新しいバージョンのものでは、 正規表現として、ひらがなを ぁ-ん で、カタカナを ァ-ン で 指定できないものがあります。 たしかマルチバイト拡張で壊された。
549 名前:537 mailto:sage [2011/03/03(木) 14:28:35.14 .net] >541 まだ試してませんが、欲する文字以外を消してゴニョゴニョすればいけそうです。 >539-540さんもありがとうございました。
550 名前:デフォルトの名無しさん [2011/03/03(木) 19:41:21.36 .net] BEGIN { str = "デンコ漢字ばんざい元気abcdeだから" c = split(str, a, "[^ーァ-ンぁ-ん]") for (i = c; i>=1; i--) { if ( a[i] !~ /^$/ ) { print a[i] } } }
551 名前:デフォルトの名無しさん mailto:sage [2011/03/03(木) 19:44:47.65 .net] ボケかました 4行目は普通に for ( i = 1; i <=c; i++) { でOK。
552 名前:デフォルトの名無しさん mailto:sage [2011/03/03(木) 22:55:52.84 .net] cを残さなくとも for (i in a){if (a[i]) print a[i]} で間に合うような。
553 名前:デフォルトの名無しさん mailto:sage [2011/03/04(金) 01:04:03.52 .net] for-inだと順序が保障されないんじゃなかったっけ?
554 名前:デフォルトの名無しさん [2011/03/04(金) 08:34:52.75 .net] for ( i = 1; i in a ; i++) って書き方もできるよ
555 名前:デフォルトの名無しさん [2011/03/07(月) 14:14:11.11 .net] a1 a1 a1 a2 a2 a3 b1 b1 b1 b1 c1 d1 d2 d2 .... のように、フィールド数がバラバラで、フィールドが一致する場合もあれば 一致しないデータがあるのですが、重複を a1 a2 a3 b1 c1 d1 d2 のようにまとめあげるにはどうしたらよいでしょうか? さすがにググってコピペという訳にもいかず。。。
556 名前:デフォルトの名無しさん mailto:sage [2011/03/07(月) 14:31:25.16 .net] >>548 いろいろやり方はあると思うが awk '{j=0;delete a;for(i=1;i<=NF;i++){if(!a[$i]++){$(++j)=$i}}NF=j;print}'
557 名前:デフォルトの名無しさん [2011/03/07(月) 14:53:42.21 .net] ありがとうございます。 それぞれ、4つ重複データのあったものは3つに、2つのものは1つにと減ったのですが それ以上減ってません。同じコマンドを繰り返しかけてみたのですが、変化はなかったです。 a1 a1 a1 a1 b1 b1 b1 ...の部分が a1 a1 a1 b1 b1 にはなったという意味です。 もう少しおつきあいいただけないでしょうか。。。
558 名前:デフォルトの名無しさん mailto:sage [2011/03/07(月) 15:06:41.15 .net] 手元では一つになるけどなぁ。原理はわかるだろうからあとはがんばれ。 行ごとにフィールドの添字についてループするのと連想配列で出現チェックがキモ。 % cat hoge.txt a1 a1 a1 a2 a2 a3 b1 b1 b1 b1 c1 d1 d2 d2 % awk '{j=0;delete a;for(i=1;i<=NF;i++){if(!a[$i]++){$(++j)=$i}}NF=j;print}' hoge.txt a1 a2 a3 b1 c1 d1 d2
559 名前:デフォルトの名無しさん [2011/03/07(月) 15:14:33.26 .net] 0610005C13Rik 0610005C13Rik 0610005C13Rik 0610007C21Rik 0610007C21Rik 0610007C21Rik 0610007C21Rik 0610007C21Rik こういう感じの文字列なんですが a1とかb1で例えても大丈夫だったですか?
560 名前:デフォルトの名無しさん mailto:sage [2011/03/07(月) 15:38:11.62 .net] 空白で区切られた文字列ならなんでもいいが、そのレベルの質問が 出るようじゃもうすこし基礎を勉強しないとだめかもなぁ。
561 名前:デフォルトの名無しさん mailto:sage [2011/03/07(月) 15:50:13.69 .net] シングルクオーテーション使用のサンプルで問題ないと言う事は〜 UNIX環境なのかな〜
562 名前:デフォルトの名無しさん [2011/03/07(月) 15:58:11.87 .net] Mac OSXのターミナルを使ってます。 >>551 はそのままうまく動きました。 いま昇順で手動で作業してますが、まだzを抜けることができません。 もう手がつりそうです
563 名前:デフォルトの名無しさん mailto:sage [2011/03/07(月) 16:04:33.75 .net] 一行野郎を分解してスクリプトに組み直して弄れば動作確認出来ると思う
564 名前:デフォルトの名無しさん [2011/03/07(月) 16:21:10.50 .net] いまwまできました。もうだめです。 一応、ファイルをおいてみます。。。 www5.puny.jp/uploader/download/1299482386.zip パスは1234です。
565 名前:デフォルトの名無しさん mailto:sage [2011/03/07(月) 17:18:15.93 .net] まだやってるのか〜 ファイルの ^M が問題みたいだから CRLFのファイル形式に変換して上の一行野郎で問題ないみたいだったよ。
566 名前:デフォルトの名無しさん [2011/04/19(火) 03:07:46.46 .net] #複数行の入力中、先の行の11カラム目にOUTが含まれているかつ次の行の11カラム目にINが含まれている2行が揃った時、2行を出力 $11~/OUT/{ prev=$0; } $11~/IN/{ if(prev!=""){ print prev; print; } prev=""; }
567 名前:デフォルトの名無しさん [2011/04/19(火) 15:55:50.78 .net] # 7.awk NR >= 2{ if($0 ~ /^>'=+/){ if($0 ~ /~$/){ print "A"; }else{ print "NAA"; } }else if($0 ~ /^>\^(Q=)+/){ if($0 ~ /~~$/){ print "B"; }else{ print "NAB"; } }else{ print "NAC"; } } 7.txt 3 >'======#======~ >^Q=Q=Q=Q=Q=Q=Q=Q=~~ >'===#====~ NAA NBB NAA となる。何で? A B A となってほしいのに・・・gawk 3.1.7です・・
568 名前:デフォルトの名無しさん mailto:sage [2011/04/19(火) 16:30:51.01 .net] 俺の手元のgawk 3.1.7では期待通りの結果になるなあ。 行末がらみだと改行コードが違ってたり見えない空白が 入ってたりというのがよくあるので確認してみ。
569 名前:デフォルトの名無しさん mailto:sage [2011/04/19(火) 16:32:43.45 .net] >>560 あと /^>'=+/ ってキャプチャとかしてるわけじゃないから+は無駄じゃないか。
570 名前:デフォルトの名無しさん [2011/04/19(火) 16:45:20.75 .net] >>561 ありがとうございました。改行コードをunix形式にしたら出来ました。 今後ともよろしくお願い致します。
571 名前:デフォルトの名無しさん [2011/04/19(火) 17:00:39.34 .net] >>559 INがあるときにしかprevがクリアされていないから、OUTが出現した以降に 複数行が経過してもINが出現するとprintされるスクリプトになっているよ。
572 名前:559 mailto:sage [2011/04/20(水) 01:08:11.06 .net] okwave.jp/qa/q6672025.html とかの入力をイメージしてたもので... $11~/OUT/{ prev=$0; } $11~/IN/{ if(prev!=""){ print prev; print; } } $11!~/OUT/{ prev=""; }
573 名前:デフォルトの名無しさん [2011/05/01(日) 16:22:39.39 .net] okwave.jp/qa/q6660984.html #2列目の項目がdisk1〜4まで不足部分が埋まるようにし、不足していた部分の1列目には前の時間、3列目には0で埋めたい BEGIN{ dt=prevDt="00:00:00"; } NF>=3{ dt=$1; tgt=$2; n=$3; } NF==2{ tgt=$1; n=$2; } { gapDisp(prevTgt,tgt); disp(dt,tgt,n); prevDt=dt; prevTgt=tgt; } END{ gapDisp(tgt,"disk1"); } function disp(dt,tgt,n){ print dt, tgt, n; } function gapDisp(disk,endDisk, cnt) { for(cnt=add(getNo(disk)); cnt!=getNo(endDisk); cnt=add(cnt)) disp(prevDt, sprintf("disk%d", cnt), 0); } function add(cnt){ return ((++cnt>4)?(1):(cnt)); } function getNo(disk){ sub(/disk/,"",disk); return disk; }
574 名前:デフォルトの名無しさん mailto:sage [2011/05/01(日) 19:40:09.87 .net] BEGIN { reset() } NF == 2 { $3 = $2; $2 = $1; $1 = last_t } { last_t = $1 } { if ($2 < last_disk) { p(); reset() } last_disk = $2 } { n[$2] = $3 } { for(i in n) { if (i >= $2) { t[i] = $1 } } } END { p() } function p() { for (i = 1; i <= 4; i++) { d = "disk" i print t[d], d, n[d] } } function reset() { for (i = 1; i <= 4; i++) { d = "disk" i t[d] = t["disk4"] n[d] = 0 } }
575 名前:デフォルトの名無しさん [2011/05/03(火) 14:58:05.53 .net] 間違ってるよ しかも長くて美しくないよ
576 名前:デフォルトの名無しさん mailto:sage [2011/05/03(火) 15:13:19.32 .net] okwave.jp/qa/q6711117.html ...こんな感じかねぇ? awk -f sum.awk データ | sort ----- sum.awk ----- $1!~/商店名/{ tbl[$1 "," $2]+=$3; } END{ for(key in tbl){ split(key, item, /,/); print item[1], item[2], tbl[key]; } } -----
577 名前:デフォルトの名無しさん mailto:sage [2011/05/03(火) 15:33:28.80 .net] >>566 NF==3 { disp(); for(i=1;i<=4;i++) { disk_time[i]=$1 disk_val[i]=0 } disk_val[substr($2, 5, 1)]=$3 } NF==2 { disk_val[substr($1, 5, 1)]=$2 } END{ disp() } function disp() { for(i=1;i<=4;i++) { if(i in disk_time) printf("%s disk%d %s\n", disk_time[i], i, disk_val[i]) } }
578 名前:デフォルトの名無しさん mailto:sage [2011/05/03(火) 16:12:56.67 .net] BEGIN { # 先頭がいきなり "disk2 15" のみで始まったりしなければ # この初期化は不要。 a = "00:00:00"; } NF == 3 { if (NR > 1) put(); a = $1; b[$2] = $3; } NF == 2 { b[$1] = $2; } END { put(); } function put( i) { for (i = 1; i <= 4; i++) { print a, "disk" i, b["disk" i] + 0; b["disk" i] = 0; } }
579 名前:デフォルトの名無しさん mailto:sage [2011/05/03(火) 16:20:05.55 .net] >>569 awkの配列ってどれくらい確保可能なの? 先にsortしたらどうかな? sort データ | awk -f sum.awk ----- sum.awk ----- $1!~/商店名/{ if(store==$1 && item==$2) val+=$3; else{ disp(); store=$1; item=$2; val=$3; } } END{ disp(); } function disp(){ if(store!="" || item!="") print store, item, val; } -----
580 名前: 忍法帖【Lv=40,xxxPT】 【東電 76.6 %】 株価【E】 mailto:sage [2011/05/04(水) 17:32:38.53 .net] ヘックション
581 名前:デフォルトの名無しさん mailto:sage [2011/05/06(金) 00:54:22.24 .net] $ uname -sr CYGWIN_NT-6.1 1.7.9(0.237/5/3) $ awk --version GNU Awk 3.1.8 この環境で、 awk 'BEGIN {for(i=j=1;i<50;++i) {print j; j*=10}}' これ実行すると、jが23桁超えたあたりから、おかしくなるんだけど。 awkの整数って上限あるの?(ウチだけか?)
582 名前:デフォルトの名無しさん mailto:sage [2011/05/06(金) 01:09:59.27 .net] long double辺りの精度しかないよ。
583 名前:デフォルトの名無しさん [2011/05/06(金) 09:18:39.10 .net] >>574 おれのPCでは普通に 1 から 1e+048 まで表示されますが。。。
584 名前: 忍法帖【Lv=25,xxxPT】 mailto:sage [2011/05/06(金) 09:54:18.77 .net] ideone.com/QpAMD
585 名前:デフォルトの名無しさん mailto:sage [2011/05/06(金) 11:30:10.09 .net] >>576 本当ですか!よろしければ環境を教えてください。 >>577 ありがとう。ここawkも張れたんだ。結果が長すぎて困ってたのよ。 正にこんな結果になる。 POSIXで保障されてる精度は>>575 ってこと? てことは、awkは内部では、全ての数がdouble扱いなの?
586 名前:デフォルトの名無しさん [2011/05/06(金) 14:20:04.87 .net] >>578 576です。WindowsXP + GNU Awk 3.0.6 + multi-byte extension 1.15 です。
587 名前:デフォルトの名無しさん mailto:sage [2011/05/06(金) 18:58:28.81 .net] >>579 ありがとう。 あまり違いがないな。Win7は関係ないだろうし。 multi-byte extensionがその辺りも弄っているのか… そういえば、1e+048みたいな指数で表示されるの? 出力のとき丸めるから、ちゃんと計算できてるように見えるのかな。
588 名前:デフォルトの名無しさん mailto:sage [2011/05/06(金) 23:07:48.20 .net] awkでは数値はすべてdoubleで扱います。 ですからその精度である53bit分、大体15桁ちょっとを超えると正確な値を保持できません。 23桁あたりまで正しく表示できてるってのはよくわかりませんが、 3.0.6にしても出力時の書式指定が違うだけで内部的には同じように不正確な値に なってしまってると思います。
589 名前:デフォルトの名無しさん mailto:sage [2011/05/07(土) 01:38:55.53 .net] だから、実質long doubleの精度になっているんだってば。
590 名前:デフォルトの名無しさん mailto:sage [2011/05/07(土) 11:11:15.94 .net] >>582 「実質」というのはどういう意味? #define AWKNUM double ってのがあるし、long double にしても仮数部は64bitだから23桁には足りないよ? x87のレベルで拡張精度になってても、表示やらなんやらするところで倍精度に 丸められちゃうと思うんだけど。
591 名前:デフォルトの名無しさん mailto:sage [2011/05/07(土) 13:09:06.68 .net] codepad.org/4GaxJcGp 完全に一致。どう見ても double です。本当にありがとうございました
592 名前:デフォルトの名無しさん mailto:sage [2011/05/07(土) 21:19:09.46 .net] >>581 あう、そうなのかー。ありがとうございます。困ったなぁ。 10進で実数扱えとまでは言わないけど、整数は欲しい。 数をいろんな型で扱える処理系なんてないか。
593 名前:デフォルトの名無しさん mailto:sage [2011/05/07(土) 23:01:38.63 .net] >>583 あー、long doubleと言ったのが拙かったね。10の冪の場合は実質doubleを大きく越えた精度になっていると言いたかった。 10は2と5の積だから、10倍を繰り返すときに仮数部は5倍ずつにしかならない。 IEEEのdoubleの精度だと5の22乗で53ビットを使い果たすので、そこまでは誤差が生じない。 言い換えれば、10の場合は53ビット+22ビット、即ち75ビット分精度があるように見える。 まぁ、>584を10倍じゃなくて5倍にして、doubleをlong longにして%.fを%llxにしてビット数を数えてみればわかるでしょ。
594 名前:デフォルトの名無しさん mailto:sage [2011/05/09(月) 21:13:05.37 .net] gawkのユーザガイドに、他の処理系では、標準エラーを使うため、 print "Serious error detected!" | "cat 1>&2" という方法しかないとあります。 gawkは/dev/stderrを特別に扱うため、 print "Serious error detected!" > "/dev/stderr" と書くのが適切とあります。 これには、どのような違いがあるのでしょうか? /dev/stderrがあるOSなら、catのプロセスが生成される他は、違いはないのでしょうか? 環境や処理系を問わず動作させたいなら、上の書き方の方がよいのか、気になっています。 よろしくお願いします。
595 名前:デフォルトの名無しさん mailto:sage [2011/05/10(火) 00:17:11.81 .net] 他の処理系って、他のawkって事だよ。 /dev/stderrがあるOSって事ぢゃなくて、 gawkは特殊なファイル名として/dev/stderrとか使えるよ、って事だよ。 なので他のOSでも gawk だったらprintとかの出力先ファイル名として /dev/stderr 使えるって話だね。 /dev/stderrとかをサポートしていないgawk以外のawkでも動作させるなら パイプと"cat 1>&2"を使う方法しかない。が、Win系はcatだと...
596 名前:デフォルトの名無しさん mailto:sage [2011/05/10(火) 09:20:21.36 .net] そこまでのことをするならPerl/Ruby/Python等のちゃんとした スクリプト言語で書いた方がいいんじゃないかな。こういう どうでもいいところで悩まなくて済むよ。 awkはawkで手軽に書ける範囲なら他の追随を許さないと思うが その枠をはみ出ようとすると途端に大変になる。そこが楽しいと いうのなら無理には止めないけどw
597 名前:デフォルトの名無しさん mailto:sage [2011/05/10(火) 14:35:51.09 .net] >>589 そう、それが楽しいんだ
598 名前:デフォルトの名無しさん mailto:sage [2011/05/11(水) 00:36:20.77 .net] >>588 ありがとうございます。 catがない環境だと、どうしようもないですね… >>589 コンマ区切りのデータを、シェルスクリプトで処理していたので、 それをawkに移植していました。一番手軽だったのです。 ちなみに、2時間半以上かかっていた処理が、1分以内に短縮されました。 ワラタ。 ワラタ…
599 名前:デフォルトの名無しさん mailto:sage [2011/05/11(水) 10:19:43.16 .net] Cで書き直したら数秒で実行完了の予感w
600 名前:デフォルトの名無しさん mailto:sage [2011/05/11(水) 12:14:45.46 .net] つーてもawkとかその他のスクリプトでサクッと書けるような文字列処理を C言語とかではあんまり書きたくならんと思うぞw
601 名前:デフォルトの名無しさん mailto:sage [2011/05/24(火) 10:19:27.54 .net] なりません
602 名前:デフォルトの名無しさん mailto:sage [2011/05/25(水) 20:17:22.02 .net] あぁああぁぁぁ〜〜〜無理だったか、、無理なのかー!a[0][0] = 1 → syntax error
603 名前:デフォルトの名無しさん mailto:sage [2011/05/25(水) 21:58:46.38 .net] >>595 gawkの場合インデックスをSUBSEP(=\034がデフォルト)を挟んでシリアライズしたインデックスで多次元配列を表現する a[0,0] = 1; ならOKのはず。このときのインデックスは"0\0340"だから、a["0\0340"] == 1。
604 名前:デフォルトの名無しさん mailto:sage [2011/05/26(木) 18:46:04.99 .net] >>596 ありがとう。始めからそれを意識して書いてたらよかったんだけどね。 god["name"] = "Kaname Madoka" god["msg"] = "Mahoushoujo ha watashi dakede juubun dayo." homerun["name"] = "Akemi Homura" homerun["msg"] = "Madoka ha watashi no yome." こんな風に書いていたのを、 puella_magi["god"] = god puella_magi["homerun"] = homerun みたいにまとめようとしたら、あばばばば awkの配列って処理系によっては添え字が整数の場合、処理が最適化されて早くなったりするのかな? 構造体の代わりみたいに使いたかったのだが。