[過去ログ]
awkについて語るスレ $2 (1002レス)
awkについて語るスレ $2 http://mevius.5ch.net/test/read.cgi/tech/1172242542/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
リロード規制
です。10分ほどで解除するので、
他のブラウザ
へ避難してください。
688: デフォルトの名無しさん [sage] 2012/07/15(日) 21:09:36 リングでも上限を定めると入力ストリームの上限が不明な場合まずいことになるので、現在は 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]に合計が記載。 これ以上(コードサイズ、ある程度の速度、メモリの使用量を極力少なく)という条件で最適化できるだろうか… だれか頼む。 入力と出力先が同じでも、別でも作動するコードなら尚のこと良いのだが… http://mevius.5ch.net/test/read.cgi/tech/1172242542/688
691: 686 [sage] 2012/07/21(土) 23:12:03 >>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]; } http://mevius.5ch.net/test/read.cgi/tech/1172242542/691
692: 686 [sage] 2012/07/21(土) 23:44:24 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。 これで良い? http://mevius.5ch.net/test/read.cgi/tech/1172242542/692
693: 688 [sage] 2012/07/22(日) 09:36:17 >QMAX=9007199254740991 ワロタwww 俺のも確かにwhile(C[p+=1]=C[n+=1]);の部分で保持してるのすべて消費分だけ上に移動させてるのが無駄なので そのループが無い分は確かに早いはず。 あと、恥ずかしながら尋ねたいのですが、俺>>688の実装で上限超えたらバグるをkwsk なんか見落としてたのか今更ながら心配になってきた。 昔作ったやつなんで、結構な頻度使ってきたのだが今までバグに気づかなかった しかしデータをメモリ上に展開するからどうしても上限が出てくるな… awkで10GBぐらいの扱う時はgetlineでなんとかなるけど、やはりメモリマップやポインタが使えたら便利だよなぁ パッチ作ったら需要あるかな? http://mevius.5ch.net/test/read.cgi/tech/1172242542/693
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
アボンOFF
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.032s