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/
660 名前:デフォルトの名無しさん mailto:sage [2011/09/17(土) 15:34:39.29 .net] cygwin以外でgawk4.0をwindowsで使おうと思ったら、バイナリはどこで入手できもうすかね?
661 名前:デフォルトの名無しさん mailto:sage [2011/09/17(土) 16:28:58.78 .net] cygwin で駄目な理由が分からないから教えられない。
662 名前:デフォルトの名無しさん mailto:sage [2011/09/18(日) 08:02:36.95 .net] >>652 つwww.klabaster.com/progs/gawk32.zip
663 名前:デフォルトの名無しさん mailto:sage [2011/09/19(月) 13:00:55.06 .net] >654 さんくすこ >653 awkの実行形式だけ入手すれば良いようにしたいのさ。
664 名前:デフォルトの名無しさん mailto:sage [2011/09/19(月) 14:01:43.39 .net] バイナリ互換のWindowsなのに、cygwinてexeをもってくだけじゃ使えないの?
665 名前:デフォルトの名無しさん mailto:sage [2011/09/19(月) 16:07:37.39 .net] 物によっては使えたような気がする。 cygwin1.dllだっけ?にパスが通ってれば大体使えたような気がする。
666 名前:デフォルトの名無しさん mailto:sage [2011/09/19(月) 17:00:12.76 .net] 結構沢山のdllが要るよ コマンドによるけど
667 名前:デフォルトの名無しさん mailto:sage [2011/10/24(月) 01:55:49.24 .net] 教えてください。英語得意な人 www.gnu.org/s/gawk/manual/gawk.html#Array-Sorting-Functions の asort(), asorti()で使うユーザー定義の比較関数について 3番目の引数とPROCINFO["sorted_in"]に設定するのと違うのか同じなのか? それと www.gnu.org/s/gawk/manual/gawk.html#String-Functions に書いてある3番目の引数の説明("descending"とか)が両立してんの?
668 名前:デフォルトの名無しさん mailto:sage [2011/10/24(月) 11:34:13.18 .net] www.gnu.org/s/gawk/manual/gawk.html#Array-Sorting-Functions As with PROCINFO["sorted_in"], this argument may be the name of a user-defined function, .... www.gnu.org/s/gawk/manual/gawk.html#String-Functions The third argument can also be a user-defined function name .... 第三引数の値と同名の関数が定義済みならそれを利用するとか、 そういう方法で区別してるんじゃないの
669 名前:デフォルトの名無しさん mailto:sage [2011/10/24(月) 13:33:04.59 .net] >>659 比較関数の与え方はPROCINFO["sorted_in"]の場合と同じってことだろ。 自分で定義した関数の名前でもいいし、11.2.1.2に書いてあるようにすでに用意 されている@〜を使ってもいい。
670 名前:デフォルトの名無しさん mailto:sage [2011/11/14(月) 21:59:05.28 .net] 個人的には、GAWKにはあと、Cで書いた関数の呼び出しというか GAWKで呼ぶ関数をCで書ける機能が欲しいと思ってるんだけど、 ここ見る限り世間的にはあんまり需要ないんかねぇ。 まぁ、それやるくらいならGAWK自体に変更を加えて再コンパイルしろってことかもしれないけど。
671 名前:デフォルトの名無しさん mailto:sage [2011/11/15(火) 01:44:31.01 .net] PとかR使え言われると思う。
672 名前:デフォルトの名無しさん mailto:sage [2011/11/15(火) 01:58:32.43 .net] >>662 ttp://www.gnu.org/s/gawk/manual/html_node/Dynamic-Extensions.html じゃダメ?将来的にさらに拡張される可能性はあるみたいだけど
673 名前:デフォルトの名無しさん mailto:sage [2011/12/09(金) 00:35:09.18 .net] 最近awkcardを知って座右に置いてるのだが、日本語版って存在するのだろうか。
674 名前:デフォルトの名無しさん [2011/12/22(木) 16:57:35.32 .net] ttp://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_271 ここに書いてある通りにしても日本語に翻訳されません どうしてですか? 環境は LinuxMint12 、 GNU Awk 3.1.8 です
675 名前:デフォルトの名無しさん mailto:sage [2011/12/22(木) 18:01:49.60 .net] >>666 その通りにやったと言うのなら、何故poファイルを提示しないのかね、ダミアン君。
676 名前:デフォルトの名無しさん mailto:sage [2011/12/22(木) 18:07:45.38 .net] >>667 poは作成しましたし、moも所定のディレクトリにあります。 poは自分で編集しても、そのサイトの内容をコピペしてもダメでした。 $ cat gettext.po #: gettext.awk:10 msgid "********** Count Prime Number **********" msgstr "========== 素数を数える ==========" #: gettext.awk:14 msgid "2 is a prime number." msgstr "2 は素数です。" #: gettext.awk:24 msgid "%d is a prime number.\n" "" msgstr "%d は素数です。\n" $ ls ja_JP/LC_MESSAGES/ gettext.mo
677 名前:デフォルトの名無しさん mailto:sage [2011/12/22(木) 18:10:02.43 .net] 結果はこの通りです。 $ LC_ALL=ja_JP gawk -f gettext.awk 10 ********** Count Prime Number ********** 2 is a prime number. 3 is a prime number. 5 is a prime number. 7 is a prime number.
678 名前:デフォルトの名無しさん mailto:sage [2012/01/12(木) 13:56:36.33 .net] ずいぶんawkから離れていて久しぶりに使ったら nawkに日本語のバグがあることにしばらく気づかなかった substr()でutf-8のテキストを切り出すとおかしな値になる gawkでは直っている
679 名前:デフォルトの名無しさん mailto:sage [2012/01/12(木) 19:50:49.28 .net] そもそもUTF-8に対応してたっけ
680 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 00:28:07.37 .net] ttp://blog.livedoor.jp/corbie/archives/cat_94960.html 残念ながら、シフトJIS、UTF-8両方で正常に動作しそうなWindows版gawkは候補の中にありませんでした。
681 名前:デフォルトの名無しさん mailto:sage [2012/01/13(金) 07:52:50.95 .net] Linuxでは普通に動くが…
682 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 21:07:39.93 .net] ファイル名が"*.txt"の一覧を取得するとき、"\.txt"でマッチさせると、任意の一文字.(ドット)と解釈されてしまうんですが、いい方法無いでしょうか?
683 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 22:04:14.36 .net] GNU Awk 3.1.7だとドットにマッチしたけどそもそもawkの話? 具体的にコマンドがほしいな
684 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 22:08:23.01 .net] 昭和の頃覚えたアセンブラとC言語 これがあったから いまだに自分が損な業界で飯を食ってる
685 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 22:36:10.83 .net] >>676 そこからjavaに行ってスマホアプリ開発ならもう一花咲いたかもしれませんねw
686 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 23:09:38.43 .net] 馬鹿には無理
687 名前:674 mailto:sage [2012/04/30(月) 18:07:43.22 .net] >>675 ls | awk '{ if( match($0,"\.txt") > 0) print $0 }' ↑会社のサーバ上でこんな感じのことやろうとしてたんですが、 「gawk: 警告: エスケープシーケンス `\.' は `.' と同等に扱われます」 とメッセージが出力され、ドットが任意の一文字?と解釈されて困っていましたが、 自己解決しました。(自宅のLinuxPCで動作確認しました。GAWK3.1.7及び4.0.1) "\.txt"では無くて、".txt"で良かったんですね。 お騒がせしました。 もしかしたら、会社のサーバ(RHEL)のGAWKが古くて解決できてないかもしれませんが。
688 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 20:27:16.48 .net] >>679 match() の第二引数に文字列を与えた場合は事前に正規表現への型変換が行われるが、 その際にエスケープが外れて /.txt/ と同等になってしまう、 ということかと。 つまり "\\.txt" とするか、 正規表現の /\.txt/ を与えればよい。 The GNU Awk User's Guide にもこの現象についての説明はあるが、 ~ !~ 演算子についてしか触れられていない。 ttp://www.kt.rim.or.jp/~kbk/gawk-30/gawk_5.html#SEC32
689 名前:デフォルトの名無しさん mailto:sage [2012/05/24(木) 00:27:31.74 .net] gawk4.0.2付属の原版ではmatchの説明にもその辺触れられてるね。 www.gnu.org/software/gawk/manual/html_node/String-Functions.html#String-Functions 誰かこのバージョン日本語化してないかな。
690 名前:デフォルトの名無しさん mailto:sage [2012/07/12(木) 02:26:40.35 .net] FIFOな感じの先入れ先出しのバッファには何使えばいい? というか、 Arrayで、たとえばA[3] からA[8]までのデータをA[1]からA[6]に動かすには何が一番早い? できれば配列は1つしか使いたくないのだが、無理だろうか…
691 名前:デフォルトの名無しさん mailto:sage [2012/07/12(木) 09:23:22.92 .net] 速さを求めるなら毎度全要素ずらすより、読み出し位置と書き込み位置の添字持って 管理した方がたいてい速い
692 名前:デフォルトの名無しさん mailto:sage [2012/07/12(木) 10:14:32.78 .net] awkには連想配列しかないしな
693 名前:デフォルトの名無しさん mailto:sage [2012/07/14(土) 14:35:06.22 .net] リングバッファで何とかなるならリングバッファかな
694 名前:デフォルトの名無しさん mailto:sage [2012/07/14(土) 22:27:17.73 .net] >>682 BEGIN{ QMAX=3 QTopPos=0;QTailPos=0;QNum=0; deQ(); enQ("1");deQ(); enQ("a");enQ("b");enQ("c");enQ("x");deQ();deQ();deQ();deQ(); } function enQ(PushVal){ if (QNum+1 > QMAX){print "おなかいっぱい"; return;} nextPos = (QTopPos+1) % QMAX; queue[QTopPos] = PushVal; QTopPos=nextPosQNum++; } function deQ(){ if (QNum < 1){print "からっぽ"; return} QNum--; TailVal=queue[QTailPos] QTailPos = (QTailPos +1) % QMAX; print TailVal; return TailVal; }
695 名前:686 mailto:sage [2012/07/14(土) 22:54:06.64 .net] ↑の結果はこんな感じ。 >からっぽ >1 >おなかいっぱい >a >b >c >からっぽ >>685 の書いているリングバッファ実装です。 enqueue,dequeue回数が多いならリングバッファで良いと思う。 大抵の場合はQMAXに大きな値を設定すれば事足りるハズだけど 上限が決定できない等の事情があればdelete arrayを使った単純な配列管理かな。 ただ添え字が数値上限を超えない様な工夫は必要だね。
696 名前:デフォルトの名無しさん mailto:sage [2012/07/15(日) 21:09:36.15 .net] リングでも上限を定めると入力ストリームの上限が不明な場合まずいことになるので、現在は A=入力Array,C一時保管,i,k,n,p k=1;C[0]=0; for(i=1;i<=A[0];i++){n=0;while(k<i && A[k++]=C[n+=1]);if(n){ delete C[C[0]+1];C[0]-=n;p=0;while(C[p+=1]=C[n+=1]);}p=1; while(match(substr(A[i],p),re)){p+=RSTART-1;n=substr(A[i],p,RLENGTH); if(k<i){A[k++]=n;}else{C[C[0]+=1]=n;};p+=RLENGTH;}};n=1; while(A[k++]=C[n]){delete C[n++];};A[0]+=C[0]-1;C[0]=0; を使っている。 re=regexpとして、Array Aに一致するデータがあれぼそれを取得、結果をArray Aに出力、A[0]に合計が記載。 これ以上(コードサイズ、ある程度の速度、メモリの使用量を極力少なく)という条件で最適化できるだろうか… だれか頼む。 入力と出力先が同じでも、別でも作動するコードなら尚のこと良いのだが…
697 名前:デフォルトの名無しさん mailto:sage [2012/07/17(火) 00:02:18.87 .net] これはひどい デバッグも拡張も無理じゃね
698 名前:デフォルトの名無しさん mailto:sage [2012/07/17(火) 22:03:00.62 .net] 基本的に一度作って後は必要に応じてコピペだがらな。他には function grep( o, re, p, B, this, a ){ B[0]=0;if(o~"-v"){while((getline v < p)>0){if(!match(v,re))B[B[0]+=1]=v;}return B[0];}; if(o~"-o"){while((getline v < p)>0){a=v;while(match(a,re)){B[B[0]+=1]=substr(a,RSTART,RLENGTH); a=substr(a,RSTART+RLENGTH);}};return B[0];};while((getline v < p)>0){if(match(v,re))B[B[0]+=1]=v;}return B[0]; } なんかも良く使う。grep("-o","pattern","/var/log",data);みたいな感じで。前のはagrep("-v",pattern,B,C)の一部分。 日ごろのメンテでちょっとした手作業じゃめんどいの組むときに、ほぼ数分で組みあがるのが楽なんだよ。 サブプロセスとしてgrep呼び出すのがコストかかる時とか、perlが破損した状況でのリカバリースクリプトとして組んだのが元だけど。 カーネルさえ生きていれば後はawkバイナリ流し込めば使え、shが半分死んでいてもなんとか動くし。
699 名前:686 mailto:sage [2012/07/21(土) 23:12:03.74 .net] >>688 BEGIN{ QMAX=9007199254740991 QTopPos=QTailPos=QNum=0; hitTop=0; A[++z]="hoge"; A[++z]="1 2 3 4 5"; A[++z]="fuga"; A[0]=z; for(i=1;i<=A[0];i++){ p=1; while(match(substr(A[i],p),/[0-9]+/)){ p+=RSTART-1; enQ(substr(A[i],p,RLENGTH)); p+=RLENGTH; } if(QNum>0){ while(QNum && hitTop<i)A[++hitTop]=deQ(); }else{ delete A[i]; } }; if(QNum>0) while(QNum)A[++A[0]]=deQ(); for(z=1;z<=A[0];z++)print "A[" z "]:" A[z]; }
700 名前:686 mailto:sage [2012/07/21(土) 23:44:24.03 .net] 691の続き ちなみに、A[1]〜A[A[0]]をgrepして結果はA[1]〜A[?]に戻すスクリプトね。 複数件マッチする事があるので未処理行を上書きしないようにキュー使ってる。 function enQ(PushVal){ if (QNum+1 > QMAX){print "Queue Overflow"; exit;} nextPos = (QTopPos+1) % QMAX; QBody[QTopPos]=PushVal; QTopPos=nextPos QNum++; } function deQ(){ if (QNum<1){print "Illigal dequeue"; exit;} QNum--; TailVal=QBody[QTailPos]; delete QBody[QTailPos]; QTailPos=(QTailPos +1) % QMAX; return TailVal; } リングバッファの上限超えたら終了させてるけど>>688 の実装も上限超えたらバグるし許して。 計ってないけどループがない分早い筈。コードサイズはお察し。 メモリはA[]にデータ抱えてる時点でアウトな感じだけどA[]を適宜消すようにしといた。 出力先を別にしたいならA[]にdeQ()せず別変数にすればおk。 これで良い?
701 名前:688 mailto:sage [2012/07/22(日) 09:36:17.43 .net] >QMAX=9007199254740991 ワロタwww 俺のも確かにwhile(C[p+=1]=C[n+=1]);の部分で保持してるのすべて消費分だけ上に移動させてるのが無駄なので そのループが無い分は確かに早いはず。 あと、恥ずかしながら尋ねたいのですが、俺>>688 の実装で上限超えたらバグるをkwsk なんか見落としてたのか今更ながら心配になってきた。 昔作ったやつなんで、結構な頻度使ってきたのだが今までバグに気づかなかった しかしデータをメモリ上に展開するからどうしても上限が出てくるな… awkで10GBぐらいの扱う時はgetlineでなんとかなるけど、やはりメモリマップやポインタが使えたら便利だよなぁ パッチ作ったら需要あるかな?
702 名前:デフォルトの名無しさん mailto:sage [2012/07/22(日) 11:41:46.83 .net] >>693 691、ちょっと訂正。無駄にキュー使う分、元スクリプトから劣化してた。 > p+=RSTART-1; >- enQ(substr(A[i],p,RLENGTH)); >+ if(hitTop+1<i){ >+ A[++hitTop]=substr(A[i],p,RLENGTH) >+ }else{ >+ enQ(substr(A[i],p,RLENGTH)); >+ } > p+=RLENGTH; あと、良く考えたら出力先を別にするなら、そもそもキュー不要。 バグってのは687で数値上限云々と書いたとおり、 ”C[0]+=1”がawkの整数の精度誤差なし演算可能上限を考慮していないだけ。 どのawkも多分そうだと思うけど、手元の環境下での実行結果↓ C:\>gawk --version GNU Awk 3.1.7(windows special Nov 24 2009) C:\>gawk "BEGIN{print 9007199254740990+1}" nul 9007199254740991 C:\>gawk "BEGIN{print 9007199254740991+1}" nul 9007199254740992 C:\>gawk "BEGIN{print 9007199254740992+1}" nul 9007199254740992 実際は(hddやメモリが先に死ぬので) 一行でこれだけ正規表現がhitする事は事実上無いし、 仮に発生しても検索結果が潰れるだけで、気付かない筈。
703 名前:688 mailto:sage [2012/07/22(日) 13:39:49.16 .net] >9007199254740992 理論上、8192ペタバイトの同じデータ[aaa...]でregexp="."とすれば、発生するな… IEEE 754の52bit制限だから、これ以上のでかい数字扱うならbig numbert対応のライブラリか, "bc -q" |& で動かすか、xgawk、dnawkあたり使うべきだなぁ 昔誰かがbignumのawkスクリプト書いて放流していた覚えがあるのだが、 ググッても見つからん。手元にあるのはビット演算のやつだけだわ いつかそれだけのデータをメモリ上に保持できるマシンを扱ってみたいものだ…
704 名前:デフォルトの名無しさん mailto:sage [2012/08/03(金) 02:35:23.75 .net] awkってabsとかacosなどの基本的な算術関数が用意されてないんですね 今後も実装されることはないんでしょうか? パイプでサクッとつないでワンラインで処理するのに重宝してたんですが・・・ 代わりとなると、何使うのがよろしいですか? できればperlは使いたくないです(どうしても好きになれない
705 名前:デフォルトの名無しさん mailto:sage [2012/08/03(金) 06:48:38.25 .net] absは自分で書けばいいし、acos(x)はatan2(x, √(1.0 - x*x))と書けるから、 どちらも基本的ではないと判断して組み込みじゃないんだと思うけど。 PythonかRubyでいいんじゃない? ワンライナー向きではないけど。
706 名前:デフォルトの名無しさん mailto:sage [2012/08/03(金) 07:37:24.41 .net] >>696 ライブラリ(?)を拾って来ては?
707 名前:デフォルトの名無しさん mailto:sage [2012/08/03(金) 11:48:03.19 .net] >>696 必要な関数値を計算するだけのプログラムをCで作っておいたら?
708 名前:デフォルトの名無しさん [2012/08/03(金) 20:21:59.43 .net] 昔それでベクトル演算して遊んだな
709 名前:デフォルトの名無しさん mailto:sage [2012/08/04(土) 09:23:47.83 .net] Rubyはそこそこワンライナーも書ける感じがする、awkやPerlほどじゃないけどね Pythonは流石にコード起こさないと辛いことが多いが
710 名前:デフォルトの名無しさん mailto:sage [2012/08/04(土) 10:27:49.07 .net] awkでmatlabみたいなベクトル演算できるようにしてほしい
711 名前:デフォルトの名無しさん mailto:sage [2012/08/04(土) 16:48:36.10 .net] awkでクラスを使えるようにしてほしい
712 名前:デフォルトの名無しさん mailto:sage [2012/08/04(土) 17:06:19.06 .net] awkで全ての魔法少女を救ってほしい
713 名前:デフォルトの名無しさん mailto:sage [2012/08/04(土) 17:08:30.07 .net] awkさんは魔女
714 名前:本田 mailto:sage [2012/08/05(日) 07:21:28.03 .net] Awk++ awk.info/?doc/dsl/awkplusplus.html OO in AWK++ The awk++ language provides object oriented programming for AWK that includes: classes class properties (persistent object variables) methods inheritance, including multiple inheritance lawker.googlecode.com/svn/fridge/lib/bash/awk++/version21/awkpp21.zip
715 名前:デフォルトの名無しさん mailto:sage [2012/08/05(日) 09:56:26.63 .net] デバッグ大変過ぎて死ぬる $ cat witch.awkpp class Witch { var spell method new() { spell = "mahalic mahalita" } method perform() { print spell } } class Samantha : Witch { method perform() { print "twitch" } } BEGIN { # wife = Witch.new() エラー要因行 wife = Samantha.new() wife.perform() } $ gawk -f awkpp -r witch.awkpp gawk: -:10: () エラー要因行 gawk: -:10: ^ syntax error gawk: -:10: () エラー要因行 gawk: -:10: ^ 表現の char '?' は不正です。
716 名前:デフォルトの名無しさん mailto:sage [2012/08/22(水) 00:09:49.86 .net] size: 656 byte, supports -o -v option. Array A and B can be the same (NEW) function xagrep( o, re, A, B, this, a, i,k ){ k=0;B[0]=A[0];if(o~"-v"){for(i=1;i<=A[0];i++){if(!match(A[i],re)) B[k+=1]=A[i];}B[0]=k;return k}; if(o~"-o"){B[B[0]+1]=0;for(i=1;i<=A[0];i++){a=A[i];if(i==k){i=i-B[B[0]+1]+1;B[B[0]+1]=k;k=B[0]+2; while(i<=B[B[0]+1]){B[i++]=B[k];delete B[k++];}i=B[B[0]+1];k=i;B[B[0]+1]=0;}while(match(a,re)){ if(i>k){B[k+=1]=substr(a,RSTART,RLENGTH);}else{B[B[0]+1+(B[B[0]+1]+=1)]=substr(a,RSTART,RLENGTH); k++}a=substr(a,RSTART+RLENGTH)}}if(i<k){i=k-i;k=B[0]+1;B[0]=i+B[B[0]+1];while(i<B[0])B[i+=1]=B[k+=1]; while(i<k)delete B[i+=1];}return B[0]}for(i=1;i<=A[0];i++){if(match(A[i],re))B[k+=1]=A[i];}B[0]=k;return k; } これ以上削れるところ無いかな? 高速化+サイズ優先で、変数はできるだけ使う数を少なくとの条件で
717 名前:デフォルトの名無しさん mailto:sage [2012/08/22(水) 09:51:11.01 .net] >>708 その3つの条件の優先度がわからんな。 結構同じ部分式があるので変数に入れた方が変数は増えるけど短くなるし 場合によっては速度も速いとかありそうだけどどうなん? 例えばB[0]は特別な用途っぽいけどxとか1文字変数にしてreturnの直前に 書き戻した方が文字数は稼げる。 あと細かいがhoge+=1より++hogeの方が1文字短いとか、いらない「;」が 残ってるとか詰めが甘いところがまだあるね。
718 名前:デフォルトの名無しさん mailto:sage [2012/09/30(日) 22:45:00.64 .net] 以下のようなデータの処理について質問いいでしょうか。 $1に経過時間(時刻)、$2に「速度」があれば$3の数値は速度を、$2$3に 「up a」「down a」などとあればその時刻での行動を示します。 このデータからup、downの場所を求めたいと思います。 つまり、下の例で移動開始からの距離3でup a、距離3.5でup b、という具合です。 経過時間と速度から場所を計算するだけですが。速度を変更するタイミング・ 回数は不定、速度データと行動データはともに経過時間順に記録されています。 速度変更をどう扱えばいいのか、ちょっと頭が回りません。 ---元データ例--- 0 速度 10 50 速度 20 200 速度 25 30 up a 35 up b 40 down a 40 down b 50 up a 70 down a 200 up c 250 down c ---処理後--- 3 up a 3.5 up b 4 down a 4 down b 5 up a 6 down a 12.5 up c 14.5 down c
719 名前:デフォルトの名無しさん mailto:sage [2012/10/01(月) 11:28:30.42 .net] 疑問を提示。 $1が常に時刻で$2が速度のときの$3が速度なら、 30 up aのときに30 * 10
720 名前:で300 up aになるんじゃないだろうか。 同じように、70 down aのときに50 * 10 + (70 - 50) * 20で900 down aになるんじゃないだろうか。 $3が速度(単位時間当たりの移動量)ではなく単位移動量当たりの所要時間なのであれば、 30 up aで30 / 10 = 3、70 down aで50 / 10 + (70 - 50) / 20 = 6になるんだけどね。 [] [ここ壊れてます]
721 名前:デフォルトの名無しさん mailto:sage [2012/10/01(月) 13:21:34.21 .net] 実装してみた。速度が途中に出てきてもいいようにposを毎回計算するから効率悪いけど。 -- BEGIN { sCount = 0; } $2 == "speed" { sTime[sCount] = $1; sSpeed[sCount] = $3; ++sCount; next; } { pos = 0; for (ic = 1; ic < sCount; ++ic) { if (sTime[ic] > $1) break; pos += (sTime[ic] - sTime[ic - 1]) / sSpeed[ic - 1]; } pos += ($1 - sTime[ic - 1]) / sSpeed[ic - 1]; print pos, $2, $3; }
722 名前:デフォルトの名無しさん mailto:sage [2012/10/01(月) 20:30:33.48 .net] >>711 すみません、前者ですね。なんだろう、恥ずかしい。 >>712 なので、アクション部の / を * に変えればよさそうです。 お二方、ありがとうございます。
723 名前:デフォルトの名無しさん mailto:sage [2012/12/13(木) 11:40:43.98 .net] awkにかわる同等のものあります?
724 名前:デフォルトの名無しさん mailto:sage [2012/12/13(木) 13:08:08.26 .net] python
725 名前:デフォルトの名無しさん mailto:sage [2012/12/13(木) 13:13:55.85 .net] >>715 awkみたいに使い勝手いいのかな?
726 名前:デフォルトの名無しさん mailto:sage [2012/12/13(木) 13:18:24.65 .net] 良いですよ
727 名前:デフォルトの名無しさん mailto:sage [2012/12/13(木) 13:24:31.23 .net] >>717 ありがとす。勉強してみます
728 名前:デフォルトの名無しさん mailto:sage [2012/12/13(木) 14:45:25.45 .net] はい
729 名前:デフォルトの名無しさん mailto:sage [2013/02/06(水) 03:49:18.86 .net] “任意の記号”を含んだシェル変数をawkに渡すことは可能ですか?たとえば [user@localhost ~]$ var='hoge' [user@localhost ~]$ echo "hoge" | awk -v var="$var" ' $0 ~ var {print var} END {print var} ' hoge hoge ここで、varに$を含ませると [user@localhost ~]$ var='hoge$fuga' [user@localhost ~]$ echo "hoge" | awk -v var="$var" ' $0 ~ var {print var} END {print var} ' hoge$fuga とうまくマッチしませんでした。var自体は渡されているはずですが、何が原因でしょうか?
730 名前:デフォルトの名無しさん mailto:sage [2013/02/06(水) 11:23:41.42 .net] >>720 いちぎょうめのひだりがわの var は、ひょうかのさいに せいきひょうげんへのかたへんかんがおこなわれる。 $0 ~ /hoge$fuga/ {print "hoge$fuga"} END {print "hoge$fuga"} めたもじとなってしまうものは、じぜんあるいはこーどのなかで えすけーぷするひつようがある。
731 名前:デフォルトの名無しさん mailto:sage [2013/02/06(水) 11:29:22.31 .net] ~(チルダ)の右辺は正規表現として解釈されるから、"hoge" ~ /hoge$fuga/ でマッチするわけがない。 逆に寧ろ、"hoge$fuga" ~ /hoge/ ならマッチする。
732 名前:デフォルトの名無しさん mailto:sage [2013/02/06(水) 11:33:09.61 .net] >>720 >721も>722もどちらも原因。やりたいことをよく整理しよう。
733 名前:720 mailto:sage [2013/02/06(水) 15:09:21.72 .net] すいません、echo "hoge"ではなくecho "$var"でした。 ただ、結果は>>720 と同じです。 要は入力ファイル内の「メタ文字込みの任意の文字列」を、別の「メタ文字と改行込みの任意の文字列」で置換する、 というのをメタ文字のエスケープ等の面倒な処理をせずにサクッとやりたいのですが、できますか?
734 名前:デフォルトの名無しさん mailto:sage [2013/02/07(木) 05:01:43.19 .net] ムリ 予め「メタ文字と言っても $ しか出てこない」とか判ってるなら大したこと無いけど 一般化すればするほど面倒になる
735 名前:720 mailto:sage [2013/02/07(木) 22:14:56.21 .net] >>725 やはりそうですか。 今までこういった処理はsedでしこしこエスケープしてやってたんですが、いい加減面倒になったので、 たとえばfgrepみたいに正規表現をオフにして処理する方法はないかと探しているんですが、 awkでは無理ですか・・・。
736 名前:デフォルトの名無しさん mailto:sage [2013/02/08(金) 11:20:14.98 .net] >>726 単に一致なら正規表現なんか使わずに比較すればいいじゃん。 fgrepで事が足りるのならawkからfgrepを起動すればいいじゃん。
737 名前:デフォルトの名無しさん mailto:sage [2013/02/08(金) 19:27:47.04 .net] >>726 fgrepなら index()関数じゃないの?
738 名前:720 mailto:sage [2013/02/09(土) 15:32:27.55 .net] >>727 >単に一致なら正規表現なんか使わずに比較すればいいじゃん。 意味が分からないんですが、awk上の話ですよね? >>728 index()の引数は文字列だから、これをうまく使えば目的の処理ができる・・・のかな? でもなんかawkでごちょごちょやるより、メタ文字をエスケープする前処理をかますなり 何なりしたほうが素直な気がしてきた・・・。たとえばこんな感じで $ var='hoge$fuga' $ var2=$( echo "$var" | sed 's/\$/\\\\$/g' ) ←エスケープ処理 $ echo "$var" | awk -v var="$var2" ' $0 ~ var {print var} END {print var} ' hoge\$fuga hoge\$fuga
739 名前:デフォルトの名無しさん [2013/02/09(土) 17:49:52.25 .net] /bin/shでごちょごちょやるのが好みなら、awkもfgrepも使わず、case文でやりゃいいんじゃないの。
740 名前:デフォルトの名無しさん mailto:sage [2013/02/09(土) 21:34:09.39 .net] >>729 文字列の比較は等号でできるって認識はないの?
741 名前:デフォルトの名無しさん mailto:sage [2013/02/10(日) 14:31:49.57 .net] >729 いや、その方法でも結局 ' はエスケープが必要でしょ。 ダイレクトにシェル変数に入れる方法か、 ファイルなどに吐き出しておく方法の方が安定。 まぁそれでも改行とか制御文字入れられるともにょる場合があるけどな。
742 名前:デフォルトの名無しさん mailto:sage [2013/02/11(月) 20:15:01.17 .net] そこまでめんどくさくなったらperlとかrubyとか使った方が楽だぞw
743 名前:デフォルトの名無しさん mailto:sage [2013/02/11(月) 22:46:25.57 .net] 何で gawk -f とか使わずワンライナーに拘るのかねぇ
744 名前:デフォルトの名無しさん mailto:sage [2013/02/12(火) 22:00:38.07 .net] >>732 中韓ファイルを作るのは情弱の仕事(ドヤ顔 >>734 ワンライナーディスってんの?
745 名前:デフォルトの名無しさん [2013/03/11(月) 10:05:12.56 .net] # # text converter ( Mac to MS-DOS on Windos/MS-DOS machine) # convert CR to CR+LF # BEGIN{ RS = "\r" } { print }
746 名前:デフォルトの名無しさん [2013/03/15(金) 08:05:25.28 .net] # # Line(行数)を数える # END { FNR }
747 名前:デフォルトの名無しさん [2013/03/20(水) 19:07:17.00 .net] # text to html converter # usage: awk -f txt2htm.awk infile1.txt > outfile2.html BEGIN{ print("<html>"); print("<head>") print("<titile> My favorite URLs </titile>") print("</head>"); print("<h1> </h1>"); print("<body>"); } /^[:space:]*http/ { print "<A HREF=\""$1"\">"$1"</A><BR>"} END{ print("</body>") print("</html>") }
748 名前:UNIX(LF) to DOS(CR+LF) conversion [2013/03/21(木) 21:15:00.86 .net] awk 1 infile1 > outfile2.txt
749 名前:デフォルトの名無しさん mailto:sage [2013/03/21(木) 22:10:08.07 .net] # awk -f add.awk BEGIN { s1 = "323524855" s2 = "4972560" reverse(a2, s2) size = reverse(a1, s1) # s1 > s2 carry = 0 for(k = 1; k <= size; k++) { # s1 > s2 d = a1[k] + a2[k] + carry if(d >= 10) { e[k] = d - 10 carry = 1 } else { e[k] = d carry = 0 } } if(carry == 1) { e[k] = 1 size = k } g = produce_string(e, size) printf("%s + %s = %s\n", s1, s2, g) printf("%f\n", s1 + s2) exit }
750 名前:デフォルトの名無しさん mailto:sage [2013/03/21(木) 22:11:11.39 .net] # >>740 のつづき function reverse(a, s, k, i) { k = 1; size = length(s) for(i = size; i >= 1; i--) { a[k++] = substr(s, i, 1) } return size } function produce_string(a, size, i) { g = "" for(i = size; i >= 1; i--) { g = g a[i] } return g }
751 名前:デフォルトの名無しさん mailto:sage [2013/03/21(木) 22:12:57.08 .net] function produce_string(a, size, g, i) {
752 名前:grepをawkで [2013/03/22(金) 13:32:02.74 .net] # usage: awk -f grep.awk char1 file1 file2 BEGIN{ pattern = ARGV[1] ARGV[1] = "" } $0 ~ pattern {print($0" File name=" FILENAME)}
753 名前:デフォルトの名無しさん mailto:sage [2013/11/30(土) 12:16:25.95 .net] $ echo 10 20 30 | awk '{for(i=0;i<4;)print _$++i}' 10 20 30 _$++iでも$++iでもどちらでもいけるのですが、アンダースコアが付いて何故大丈夫なのでしょうか?
754 名前:デフォルトの名無しさん mailto:sage [2013/11/30(土) 16:04:55.55 .net] すいません、わかりました 空の変数_と$++iの結果が一緒になってただけなんですね
755 名前:デフォルトの名無しさん mailto:sage [2013/11/30(土) 20:37:58.81 .net] 単に式を並べると文字列連結になる、の罠か
756 名前:デフォルトの名無しさん mailto:sage [2014/04/02(水) 00:10:13.15 ID:T3/5Epfc.net] 保守 てか半年近く書き込みが無かったか
757 名前:デフォルトの名無しさん mailto:sage [2014/04/19(土) 13:45:38.45 ID:Db2IzPol.net] とあるgawkスクリプトの先頭で {last_hoge=hoge; hoge=$ 3} ってやってるんだけど、 hoge=$ 3はhoge=$3の間違い? それともこういう記法がある?
758 名前:デフォルトの名無しさん mailto:sage [2014/04/19(土) 14:56:08.53 ID:A73fEYrr.net] >>748 $ は演算子だから、a=b+1をa = b + 1と書くようなものかな。
759 名前:デフォルトの名無しさん mailto:sage [2014/04/19(土) 21:10:32.64 ID:Db2IzPol.net] ええー 演算子だったのかあ。衝撃の事実
760 名前:デフォルトの名無しさん mailto:sage [2014/04/20(日) 12:36:45.70 ID:SQaIR8ej.net] 演算子だから、変数でもいいよ。