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/
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の配列って処理系によっては添え字が整数の場合、処理が最適化されて早くなったりするのかな? 構造体の代わりみたいに使いたかったのだが。
605 名前:デフォルトの名無しさん mailto:sage [2011/05/27(金) 00:57:28.69 .net] name["god"] = "Kaname Madoka" msg["god"] = "Mahoushoujo ha watashi dakede juubun dayo." name["homerun"] = "Akemi Homura" msg["homerun"] = "Madoka ha watashi no yome." でよくね?
606 名前:デフォルトの名無しさん mailto:sage [2011/05/30(月) 21:25:51.88 .net] awkって *どの実装でも* 一度も使ったことがない変数の内容って、スカラなら0か""になってるの? 変数が一度も代入されていないことを判定するために、(x==0 && x=="")って書いて何か問題ない?
607 名前:デフォルトの名無しさん mailto:sage [2011/05/30(月) 21:31:52.21 .net] >>599 評価されるときに変数が存在しなければ作成される。はず 配列の要素なら in で調べられるけど 変数自体となるとどうだろうね
608 名前:デフォルトの名無しさん mailto:sage [2011/05/30(月) 21:32:47.76 .net] >>599 何度も代入した後、最後に 0 or "" を代入した変数と区別できない。
609 名前:デフォルトの名無しさん mailto:sage [2011/05/30(月) 23:19:06.92 .net] >>600-601 ありがとう。区別できないって、どういう状態になるの?0を代入したら0か"0"に評価される。 ああ、""を代入したら0か""に評価されて駄目ってことか!?
610 名前:デフォルトの名無しさん mailto:sage [2011/05/31(火) 00:05:27.97 .net] あれ?試したらどっちを代入しても599の式は0に評価されたよ。区別できないケースってどういう場合?
611 名前:デフォルトの名無しさん mailto:sage [2011/05/31(火) 06:28:27.99 .net] BEGIN { # 初期化直後 (未使用) の変数は数値 (0) と文字列 ("") の両方の型を持つ。 print x == 0, x == ""; # 両方とも真 x = 0; print x == 0, x == ""; # 前者のみ真。 x = ""; print x == 0, x == ""; # 後者のみ真。 # 他の未使用の変数を代入すると "再初期化" できる。 x = y; print x == 0, x == ""; # 両方とも真。 }
612 名前:デフォルトの名無しさん mailto:sage [2011/05/31(火) 22:57:53.71 .net] > 初期化直後 (未使用) の変数は数値 (0) と文字列 ("") の両方の型を持つ。 IEEE Std 1003.1 の awk の EXTENDED DESCRIPTION の Variables and Special Variables に書いてあるね。 uninitialized value というらしい。 POSIXに準拠してるawkならこうなるみたいだけど、オリジナルは知らん。 再初期化するなら$(NF+1)使うほうがいいかもね。未使用の変数を用意しなくていい。 だけど、それが必要な場面が思い浮かばないが。 関係ないけど、abs関数ってないんだね。別に良いけど、πや、 0より大きい最小の浮動小数点数は定義しててほしいなあ。
613 名前:デフォルトの名無しさん mailto:sage [2011/06/02(木) 10:09:14.37 .net] >>605 > 再初期化するなら$(NF+1)使うほうがいいかもね。未使用の変数を用意しなくていい。 フィールド変数は常に文字列型で、 数値型は持たない。
614 名前:デフォルトの名無しさん [2011/06/02(木) 22:47:31.10 .net] πはatan2(0,-1)でいいとして 「0より大きい最小の浮動小数点数」ってどう定義していつ使うの?
615 名前:デフォルトの名無しさん mailto:sage [2011/06/03(金) 13:48:37.95 .net] 「0より大きい最小の浮動小数点数」というのが何を希望しているかによる。 以下の3種類がある。 (1) 最小の正の非正規数 (2) 最小の正の正規数 (3) 1.0に足して丸めた結果が1.0より大きくなる最小の数
616 名前:デフォルトの名無しさん mailto:sage [2011/06/03(金) 23:58:11.26 .net] >>606 あちゃ!そうでした。$で戻るのは文字列だった。 その仕様書読んでると、NFを拡張したとき、元々なかった所はuninitialized valueになるってあったので。 >>607 それでいいんだけど、PIとかで参照できたらもっといい、と思ったのです。 >>608 数値計算のために、CのDBL_EPSILONの代わりになる定数が欲しいなと。 任意の精度で丸められる関数もないですし。
617 名前:デフォルトの名無しさん mailto:sage [2011/06/04(土) 09:41:48.63 .net] DBL_EPSILONが>>608 の(1)〜(3)のどれかわからない? 数値計算の基本なんだが。
618 名前:デフォルトの名無しさん [2011/06/10(金) 21:49:33.34 .net] 変数名など、自前であっても規則を意識している方いますか? awkだと、C風が一般的なのでしょうか? 一番最初がVBAだったので、長い名前と省略が混ざってしまって 自分でイライラしています。 みなさんの、通常の変数はこう、配列はこう、定数はこう、文字型はこう・・・ というものを参考にしたいです。
619 名前:デフォルトの名無しさん mailto:sage [2011/06/10(金) 22:10:28.97 .net] >>611 システムハンガリアンを採用するかどうか悩むほど大きなものをawkで書いたことが無い
620 名前:かあた mailto:sage [2011/06/13(月) 18:37:34.88 .net] 、5なわやあふぉt( ())
621 名前:デフォルトの名無しさん mailto:sage [2011/06/15(水) 21:51:26.93 .net] >>611 遅レスだが、型_内容の説明_名前みたくしてる。名前が一文字だとそのままだけど。 グローバル変数とローカル変数のどっち弄ってるのか分かりやすいように、ローカル変数は必ずlで始めるようにしてる。 d_per_shouhizei = 5.0とかね。
622 名前:デフォルトの名無しさん [2011/06/20(月) 18:37:26.17 .net] gawkでBINMODEを設定すればバイナリーの入出力ができるのはわかるのですが、 入力されたバイナリーを16進ダンプして表示するにはどうしたらよいでしょうか? od等の外部コマンドを使う意外に方法があればお教えください。
623 名前:デフォルトの名無しさん mailto:sage [2011/06/20(月) 19:17:07.50 .net] printf("%02x\n", $1);
624 名前:天使 ◆uL5esZLBSE mailto:sage [2011/07/05(火) 00:15:13.83 .net] 二度と話かけんなよ お前らってどうみてもゴミだよな
625 名前:デフォルトの名無しさん mailto:sage [2011/07/06(水) 14:04:55.24 .net] ゴミんなさい
626 名前:デフォルトの名無しさん mailto:sage [2011/07/14(木) 23:55:15.84 .net] >>595 gawk4.0.0でa[0][0]=1も可能になったじゃないか
627 名前:デフォルトの名無しさん mailto:sage [2011/07/30(土) 19:46:15.81 .net] 超初心者の質問で申し訳ありません。以下のようなデータを aaa 10 bbb 20 ccc 30 aaa 30 bbb 30 aaa 15 ccc 30 ddd 20 以下のようにまとめたいのですが、どうしたらいいでしょうか? aaa 55 bbb 50 ccc 60 ddd 25
628 名前:デフォルトの名無しさん mailto:sage [2011/07/30(土) 19:53:38.97 .net] ddd 20 ではないかと思うがこんな感じかな awk '{a[$1]+=$2} END {for (b in a) {print b " " a[b]}}' | sort
629 名前:デフォルトの名無しさん mailto:sage [2011/07/30(土) 23:15:27.52 .net] Gawk4ならPROCINFO["sorted_in"]の設定で最後のsortが要らなくなる
630 名前:620 mailto:sage [2011/07/30(土) 23:22:20.03 .net] >621 ありがとうございます!うまくいきました。
631 名前:デフォルトの名無しさん mailto:sage [2011/07/31(日) 15:24:48.76 .net] gawkはもう別言語なイメージ。普段mawk使ってると
632 名前:デフォルトの名無しさん mailto:sage [2011/08/16(火) 22:48:21.64 .net] ここって生きてますか?
633 名前:デフォルトの名無しさん mailto:sage [2011/08/18(木) 01:56:26.63 .net] 生きてますん
634 名前:デフォルトの名無しさん mailto:sage [2011/08/19(金) 00:53:44.39 .net] 生きていることを願って質問を。 WIN32のEXE一つで、下のTEST.AWKがマトモに動くAWKを探しています。 これら以外にありますか? hinadori.atnifty.com/~wills/program/gawkm115.zip my.vector.co.jp/servlet/System.FileDownload/download/http/0/376460/pack/win95/util/text/awk/gawk-mbcs-win32-20051223.zip?ds my.vector.co.jp/servlet/System.FileDownload/download/http/0/80308/pack/win95/util/text/awk/mw32r27.lzh?ds Cygwin版も試したのですがダメでした。 TEST.AWK { gsub("[0-9]","x",$0) ; gsub("ソ","ソ",$0) ; gsub("T","T",$0) ; print } TEST.DAT アイウエオカキクケコサシスセソ ココココサフサコココココ ココココサフサココココ ココココサフサコココココ ココココサフサコココココ サフサフサフサフサフサ ココココサフサコココココ ココココサフサココココ ココココサフサコココココ ココココサフサコココココ サフサフサフサフサフサ
635 名前:627 mailto:sage [2011/08/19(金) 01:00:20.60 .net] TEST.DATは、空白が入っています。 専ブラのポップアップをコピペして下さい。
636 名前:デフォルトの名無しさん mailto:sage [2011/08/19(金) 06:26:54.92 .net] ウチに帰ってから調べてみるよ
637 名前:デフォルトの名無しさん mailto:sage [2011/08/19(金) 11:02:41.54 .net] >>627 −628 cygwinのawk(GNU Awk 3.1.8)で動くけど、どうなるはずがどう動かないと言っている? >627のtest.datなら、当然「ソ」だけが変換されるけど。
638 名前:デフォルトの名無しさん mailto:sage [2011/08/19(金) 11:55:06.25 .net] (CygwinならUTF8じゃないとうまく動かないけど)Shift JISで動作させたいってことかな? 事前にTEST.DATをnkf -wに通したら駄目かな。
639 名前:629 mailto:sage [2011/08/19(金) 21:59:57.43 .net] >>627 スクリプトもDATもSJISで試したけど、上記3つのうち、gawk-mbcs-win32-20051223.zipはダメだったよ。 1行目がこんなんなる。 アxxエオカキクxコサxxxソ 手持ちの GNU Awk 3.1.7(windows special Nov 24 2009) で、--ctype=SJISやっても同じ結果になるね。 スクリプト、DATをUTF-8にして、--ctype=UTF8やってリダイレクトしたファイルは正常な結果が出るよ。 リダイレクトしないでコマンドプロンプトに表示させると化けるけど。
640 名前:デフォルトの名無しさん mailto:sage [2011/08/19(金) 23:18:25.14 .net] EUCなら半角カナもうまくやってくれるんだが…
641 名前:デフォルトの名無しさん [2011/08/24(水) 08:07:37.54 .net] gawkはガンガン機能を拡張してるけど、 そろそろOOP対応してくれないかな。 awk++とかあるけど、標準でOOPできれは便利。
642 名前:デフォルトの名無しさん mailto:sage [2011/08/24(水) 22:44:37.24 .net] > OOP ...もはやawkでやる意味が無いw 他にいくらでもある別の言語でいいじゃん
643 名前:デフォルトの名無しさん mailto:sage [2011/08/25(木) 01:14:17.45 .net] awkに在ると便利かもと思うのは参照値くらいかな 配列や関数への参照を値として取り出し格納したり 逆にその値から元の配列にアクセスしたり元の関数を呼んだり出来ると 相当に複雑なデータ構造が表現可能になる、それこそOOPっぽいことも可能だし でもあんまりややこしいことやるならPerlでいいから必須ではないね
644 名前:デフォルトの名無しさん mailto:sage [2011/08/25(木) 02:28:23.99 .net] > 関数を呼んだり 変数の値を関数名として var = "sage"; @var(); ってできるけど、それとは違うのん?
645 名前:デフォルトの名無しさん mailto:sage [2011/08/25(木) 04:07:56.67 .net] およ、もうあるのかw 最近のawkは分からねえ…ってことは、配列への参照を使って入れ子の配列とか既に作れちゃったりするのか?
646 名前:デフォルトの名無しさん mailto:sage [2011/08/25(木) 10:56:54.36 .net] 配列の配列は作れるよ。gawk4なら。
647 名前:デフォルトの名無しさん mailto:sage [2011/08/25(木) 19:51:33.84 .net] (´_ゝ`)フーン
648 名前:デフォルトの名無しさん [2011/08/25(木) 20:52:51.07 .net] class human { property name property sex property age method new(x, y, z) { name = x sex = y age = z } method say() { printf("私は%s。%d歳の%sです。\n",name, age, sex) } } class japanes
649 名前:e : human { property name property sex property age method say() { printf("私は%s。%d歳の%sです。国籍は日本です。\n", name, age, sex) } } BEGIN { alice = human.new("アリス", "女", 11) taro = japanese.new("太郎", "男", 15) yuka = japanese.new("由佳", "女", 18) alice.say() taro.say() yuka.say() } [] [ここ壊れてます]
650 名前:641 [2011/08/25(木) 20:58:10.41 .net] >>635 code.google.com/p/lawker/source/browse/fridge/lib/bash/awk%2B%2B/ これを使えばこの程度のOOPはどうにかできる。 本当にこの程度でいいからOOPに対応してほしい。 使う人はほとんどいないと思うが、全くできないのも困る。
651 名前:デフォルトの名無しさん mailto:sage [2011/08/25(木) 22:07:53.46 .net] それは最早awkである必要が全く無い
652 名前:デフォルトの名無しさん mailto:sage [2011/08/26(金) 06:00:04.19 .net] function Human(self,name,sex,age) { self["property___name"] = name self["property___sex"] = sex self["property___age"] = age self["method___say"] = "Human___say" } function Human___say(self) { printf "私は%s。%d歳の%sです。\n", self["property___name"], self["property___age"], self["property___sex"] } function Japanese(self,name,sex,age) { Human(self,name,sex,age) self["method___say"] = "Japanese___say" } function Japanese___say(self) { printf "私は%s。%d歳の%sです。国籍は日本です。\n", self["property___name"], self["property___age"], self["property___gender"] } function methodcall(obj,methodname, m) { m = obj["method___" methodname] @m(obj) } BEGIN { Human(alice, "アリス", "女", 11) Japanese(taro, "太郎", "男", 15) Japanese(yuka, "由佳", "女", 18) methodcall(alice,"say") methodcall(taro,"say") methodcall(yuka,"say") }