awk ファンクラブ
>>125 それ、xgawkで書くとどんなになるの? >>129 gawk '$0=gensub("</?title>", "", "g", RT)' RS='<title>.*</title>' IGNORECASE=1 >>128 待てよ…awkでもパターン検索だけなら遜色なく書けて かつawkのが速いんじゃ、grepの存在価値って… ああ、複数ファイルからの検索があるか つーても、これもawkでFILENAMEとFNR明示したら書けちゃうか… >>131 まあgrepで済む物は記述が簡単なわけで。 xgawkは使ってないなぁ。使ってる鳥には無いし。XHTMLが対象ならもっと短く書けるのだろうか。 >>130 おー!これはクール。 gawkは大文字小文字無視する処理書くの楽だね。流石だ。 >>131 前後の行を表示させたりが楽かも。まあ、滅多にお世話になることないけど… rm -r *でデータ飛ばしたから、そのサルベージに役立つとは…orz コマンド`grep -C N regex'を真似する awk 'BEGIN{ L=N; b=L+1; n=L+2; i=j=0; s=2 }; /regex/{ if (L&&s==1) print "--"; while (i!=j) { print a[i++]; if (i==b) i=0 } n=s=0 }; n>L{ a[j++]=$0; if (j==b) j=0; if (i==j) { i++; if (i==b) i=0; if (!s) s++ } next }; n++<=L' 書けた!!データ飛ばすは、アク禁に巻き込まれるは散々だった。よく見たら凄い遅レスだ… データのサルベージに使ったgrep -Cを書いてみた。流石にワンライナーとは言い難い。 効率はもう少し良くできそうだけど、これ以上短くするのは無理だった。実力が足りない;_; あまりに読み辛いので、pastebinに整形版を置いておきます。 ttp://pastebin.com/PJ2VfqN4 時間計測の結果を追記。 time grep -C 500 'public class\|jar cf\|javac\|\.java' <strings_a.txt >/dev/null real 0m2.112s user 0m1.528s sys 0m0.311s time awk 'BEGIN{ L=500;(略)}; /public class|jar cf|javac|\.java/{(略)}; n++<=L' <strings_a.txt >/dev/null real 1m20.089s user 1m15.426s sys 0m0.389s 一回計測。約50倍くらい遅いか。ネイティブとスクリプトだから、まあこうなる、と言ったところだと思う。 短い処理なら有利な場合もあるんだろうけど。 指定された正規表現を含むファイルの名前を表示する awk 'f!=FILENAME && /regex/{ print f=FILENAME }' gawkならこう書ける。 awk '/regex/{ print FILENAME; nextfile }' >>131 に近い。FNRも使って検索結果を表示するスクリプトも、あまり複雑にはならなそう。 下の方が速いけど、mawkだとnextfileをサポートしてなかった。 grep -lと同じ結果で、指定する正規表現によってawkの方が速く動くこともあるよ。 md5sumコマンドの出力から重複するMD5チェックサムを持つファイルを列挙する awk '{ i=++a[$1,0]; a[$1,i]=$0 }; END{ for (i in a) if (!k[split(i,k,SUBSEP)] && a[i]>1) for (j=1; j<=a[i]; j++) print a[k[1],j] }' まだ短く書けそうかな? あるディレクトリ以下を調べるなら、こんな感じでMD5チェックサムを計算する。 find sda6.photorec -type f -exec md5sum '{}' + この出力をパイプか何かで食わせればいい。 gawkの4.0が出たか。いろんな亜種を使う機会があるから、なかなか依存したプログラムは書けないね。 よく使うのはgawkとmawkだけど、皆何をよく使ってるのだろう?使用者が少ないから余計に気になる。 デバッガって使いやすい?いまだにprintで表示してやってるなぁ。 gdbやpythonデバッガやらと似てるのでとっつきやすくはあると思う。 fileコマンドの出力からテキストファイル(表示可能なファイル)だけ取得する awk '{ q=$1; $1="" }; /text/{ print q }' -F: FSは-Fオプションを使って1文字短く書く。使い方は次のようにパイプでつなぐ。 find sda6.photorec -type f -exec file '{}' + |awk '{ q="'\''" $1 "'\''"; $1="" }; /text/{ print q }' -F: |xargs -i cp -v "{}" sda6.photorec.text/ xargsに渡すためクォートしてる。ワンラインにシングルクォーテーション入ると書きづらい。 でも、こういう処理はawkが一番楽だね。 >>140 へー、それは良いね!って思ったけど自分が書くような短いスクリプトには不要かも… 今、awkでデバッガが重宝するような長いスクリプトって、どれほど書かれてるんだろう? >>142 BEGIN{for(;i<256;++i)c[t=sprintf("%c",i)]= i==32?"+":t~/[0-9A-Za-z]/?t:"%"sprintf("%x",i)} {for(s=i="";i++<length;s=s c[substr($0,i,1)]); print s} マルチバイト対応してて length() とか substr() とかが バイト数ではなく文字数を数えて動作するような小賢しい awk だと逆に動かない。 Gawk4.0の新オプションはそういう時のためにある訳か。 >>141 ファイル名には : も使えるから汎用じゃないね。 あとショートコードを意識してるようなのに不必要なセミコロンとカッコ内側のスペースが あるのはスタイルとして一貫してないな。 このスレ七夕に立ってたのか。3周年って言われると、まだ3年かと思ってしまう。 3年前といえばLLが盛り上がってた頃だから、もう少し前に立ってればここももっと盛り上がっていたかもね。 gawkは新しくなったけど、確実に他のLLに流れてるよなぁ… >>145 どこぞのOSでは使えない文字をわざわざファイル名に使わないよねって思い、楽してます。 ただパスに含まれる可能性はあるので、そういった場合は file -F; のようにして fileコマンドの使うセパレータを(使われていない)任意の文字に設定して下さい。 スタイルに関しては全くその通りで、自分でも冗長だと思いつつ残しています。以下言い訳… スペースは読み辛くなると思う所にだけ残すようにしています。また、ここに貼ると、 表示がプロポーショナルフォントになって、幅が狭い文字の隣から一部分コピペする操作をよくミスるため、 そういった幅の狭い文字(}とか;)の後には残しています。 ifやwhileの後、print $1 や "a" b "c" に含まれるものも省略できますが、違和感が物凄いので残しています。 セミコロンは(POSIXの仕様で)必要なものだけを残しているつもりです。 過去の互換性のために省略可能なものは、残すようにしています。 >>147 他のLLに比べて、Windowsで使われる頻度が滅法低いのも一因かなあと思う コマンドプロンプトで awk がやれることって、BEGIN{ } に何か書くぐらいしか無いのよね だったらPerlとかでいいじゃん、って話になっちゃう awkオンリーってのがムズイので、Cygwin上でsh他外部コマンドと組み合わせて使う事が多い 結局awkはプログラミング言語というより「ちょっとややこしいことも出来るUnix系テキストツール」としての性格が強いんだと思う。 そうか、Windowsでの使用率は考えたことなかったわ。そっちで今何が流行ってるのかは知らないけど、 GUI扱うライブラリを持つLLが使われてそうだ。こればかりは厳しい。そもそも、ライブラリって概念がないのが避けられてるのかな。 >>152 いやGUIはほとんどVisualStudio、Java、Delphi辺りで喰われてるよ その他のGUIツールもあるにはあるんだけど LLの主な出番は向こうでもテキストフィルタだったりはするんだけど Windowsにはそもそも組み合わせるような小物のコマンド群が無いから やりたい処理の1から10まで全部を1個(もしくは一連)のスクリプトで済ませるのが主流 だからたとえLLであっても、1言語で最初から最後までを完結できる大きめの言語が好まれるのよ awkは単品で使うより、組み合わせで威力を発揮する言語だからか、あまり使われない あ、いやテキストフィルタよりもCGIとかのWebでの出番のが多いか? awkでcgiも出来なくもないだろうけど、っていうかそれでblog作ろうとしてた人もいたな >>153 ホント?Delphiなんて懐かしいなぁ。GUIでなく、Webでの利用なら、もはやOSあまり関係ないような気も。よく分からん。 >>155 聞いたことはあるけど、見たことはない程度には珍しいかと。gawkはネットに対応してるから頑張ればサーバにもなれるかな? >>157 いやまあDelphiは新規としては瀕死で、過去遺産の保守で使われるのが主だけどね。 やっぱawkでcgiってマイナーか。しかしblogつーか、CMS作ろうとするのは凄いなw ちなみにgawkのhttpdって、どっかで見たなあ。 httプロトコルでなく、俺プロトコル用サーバならawkスクリプトでやってる。 httpに例えるなら、ファイルか404を返すだけの簡単なやつ。 しかもgawkのソケットでなく、inetdから呼ばれるだけの低機能。 私はエンバカになっても応援してるよ!>Delphi >>160 今更inetdって思ってて、ろくに調べてなかったけど、socatみたいな機能もあるんだね。 ポート監視→サーバ起動って機能しかないと思ってたよ。 これならネット非対応なawkでもhttpdくらい実装できる?…バイナリまともに扱えそうなのはgawkしかねー。 テキストオンリーまでなら何とかできそうだけど、画像も転送できないか。厳しい制限だ。 個人的にはawkは今まで通りシェルのお供でいいと思う perlとかでもそりゃ書けんことは無いが シェルのお供として使うには微妙に違和感あるんだよな〜 >>134 これを使って正規表現によって grep とどれだけ実行速度に差が出るのか計ってみた。 ttp://pastebin.com/bpXZ5pg8 数字だけではよく分からないので、ユーザ時間のグラフを描いた。 ttp://i53.tinypic.com/303a4iv.jpg 赤がawk、青がgrep こっちじゃないと見れないかも → ttp://tinypic.com/r/303a4iv/7 awk もばらつきがあるけど、grep ほどではない。 どちらも、マッチする可能性が高い正規表現は遅くなる傾向があるのかなぁ? 引数で与えられたファイルをメモリに読み込み繰り返し検索する awk 'BEGIN{f=ARGV[1];while((getline<f)>0)a[n++]=$0;close(f);ARGV=1};{for(i=0;i<n;++i)if(a[i]~$0)print a[i]}' 最近、用途が限られているもの中心だったので使えそうなワンライナーにしてみたよ。きっと。 指摘を受けたので、スペースは削ることにしました。ちっと見づらい? ↓は大文字小文字を無視するもの。こうするとdmesgの出力を何回も検索できる。 awk 'BEGIN{f=ARGV[1];while((getline<f)>0)l[n++]=tolower(a[+n]=$0);close(f);ARGC=1};{for(i=0;i<n;++i)if(l[i]~tolower($0))print a[i]}' <(dmesg) 長過ぎるone-linerを見易く改行するone-linerを書きなさい しまったー!書き込む前にちょろっと書き換えたところがバグってました。mawkで動きません。 >>164 の下のスクリプトは次に書き換えてください。 awk 'BEGIN{f=ARGV[1];while((getline<f)>0)a[n++]=$0;close(f);ARGC=1};{for(i=0;i<n;++i)if(tolower(a[i])~tolower($0))print a[i]}' awkのシーケンスポイントってC言語と同じなのかな…痛いミス。 おまけ。使ってるやつ。エスケープシーケンスを使って見つかった文字列に色を付けた。 awk 'BEGIN{f=ARGV[1];while((getline<f)>0)a[n++]=$0;close(f);ARGC=1}; {for(i=j=0;i<n;++i)if(k=match(tolower(a[i]),tolower($0)))print C(j=!j)I(I(a[i],C(39),k+RLENGTH),C(31),k);print C()}; function C(n){return"\033["n"m"};function I(x,y,z){return substr(x,1,z-1)y substr(x,z)}' パターンごとに改行を入れた。少し見やすいか? >>164 の上のスクリプトに色を付ける機能を追加。ずっと分かりやすいと思う。 awk 'BEGIN{f=ARGV[1];while((getline<f)>0)a[n++]=$0;close(f);ARGC=1}; {for(i=j=0;i<n;++i){l=a[i];if(sub($0,C(31)"&"C(39),l))print C(j=!j)l}print C()}; function C(n){return"\033["n"m"}' subをgsubにするとマッチする全ての文字列に色を付けられるよ。 gawkならgensub使ってもう少し短く書けるかもしれない。IGNORECASE=1で簡単に大文字小文字無視できるし。 classは使えるようになりましたか? > gawk4 つ ttp://awk.info/?doc/dsl/awkplusplus.html ふるいけや "かわず とびこむ" みずのおと といったレコードを、 field[1]=ふるいけや field[2]=かわず とびこむ field[3]=みずのおと number_of_field = 3 とフィールド分割するすっりした方法を教えて下さい。 >>172 それ、CSVとかでもよく語られることだけど、意外と面倒なのよ。 例えば「"」自体を文字列に入れたい場合はどうするのか、とか色々決めなきゃならんし。 あれ?awkでclass使いたいって事なんでしょ? ttp://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 >172 素直に区切り文字を変えるしか... ふるいけや,かわず とびこむ,みずのおと FS="," 自己レスです。 BEGIN { FPAT = "([^" FS "]+)|(\"[^\"]+\")" } みたいな事をしました。 awk にわけわかんな機能を増やすよりも、 RFC4180 互換なフィールド分割オプションを実装すればいいのにといつも思う。 perl -e 'print $1 if /href="(¥d¥d¥d¥d-¥d¥d¥-¥d¥d)"/' と同じことをawkでやろうとしているのですがわかりません。 awk -e '/href="(¥d¥d¥d¥d-¥d¥d¥-¥d¥d)"/ { print ??? }' グルーピングしたあとにそれを取り出す方法を探したのですが、わかりませんでした。 awkまたはsedでのやり方を教えて下さい。 >>181 馬鹿じゃないあなたに是非>>182 の回答をしてもらおうか。 >>182 perl がわからないから求めるものがよくわからないけれど、こんな感じ? awk '/href=\"[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\"/ {print $1}' input.html awk '/href=\"\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\)\"/ {print $1}' input.html BEGIN とか使ったほうがいいのかもしれないけれど awk '/href=\"[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\"/ {print $1} BEGIN { 何か書く }' input.html >>182 どのawk使っているか分からないし、入力の仕様も分からないけど、どこでも動くのはこんな感じ awk -F\" '/href=/ { for (i=1; i<=NF; i++) if ($i ~ /href=$/ && $(i+1) ~ /[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]/) print $++i }' gawkでも正規表現パターンのグループを保存している組み込み変数はなかった気がする gawk4.0なら awk '{if (match($0,"href=([0-9]{4}-[0-9][0-9]-[0-9][0-9])",a)) print a[1]}' じゃ駄目? ごめん、 awk '{if (match($0,"href=\"([0-9]{4}-[0-9][0-9]-[0-9][0-9])\"",a)) print a[1]}' >>184-186 うーん、あまりわかりやすい方法ではないですね。 メンテナンスしにくいコードになってしまうので、perlが使えるよう上司に交渉したほうがよさそうです。 回答いただいた方、ありがとうございました。 >>185 はともかく>>186-187 の方がPerlみたいにグローバル変数にマッチ結果を入れるより分かりやすいと思うのって俺だけ? >>189 186は、単にgawk独自の拡張機能を知ってないとわかりにくいというだけであり、 マッチした結果を明示的に変数に代入するのはいいことだと思います。 なお個人的には match(string, rexp, matched) はmatchedがいわゆるout変数になるため分かりにくいです。 matched = match(string, rexp) のほうがよかったです。 >>190 何言っているのかちょっと分からん。言語仕様上awkは配列を返せないだろ gawk独自の実装はどうも…という話がよく出てくるけど、 gawk/mawk/true awk相互で運用する必要ってよくあるものなの? またはbusyboxのawkで使いたいとか? gawkは最早awkと呼ぶには拡張され過ぎている感じがある よくあるかは知らないけど、少なくとも手元の環境には3種類のawkがあって、gawkの拡張が使えない mawkはnextfileにも対応してないし、awkは実装の差がかなり大きいと思うよ gawkが拡張されてるのは承知だが、gawk依存だとメンテが大変だから perlというロジックが分かりにくい。 gawkで (ああ(いい((うう)(ええ)))) この行の「ああ」「いい」「うう」「ええ」を変数に入れたい時、 何か定番な書き方はありますか? 何を期待しているのか分からん 括弧を区切りにして分けたいだけならFS="[()]+"で 配列に入れたいならsplitでどう? もしかして括弧の対応をとりながら分けたいってことなら gawkに詳しい別の誰かに期待してくれ。拡張正規表現でも無理じゃなかったか str = "(ああ(いい((うう)(ええ))))" while (match(str,/([^()]*)/)) { v = substr(str,RSTART+1,RLENGTH-2) str = substr(str,1,RSTART-1) substr(str,RSTART+RLENGTH) if (v != "") { # 取り出した v をなんかする } } とかじゃ駄目なの? ちゃんと構文解析するなら yacc (bison) を使わないと駄目だよ _ |O\ | \ キリキリ ∧|∧ \ キリキリ ググゥ>(;⌒ヽ \ ∪ | (~) ∪∪ γ´⌒`ヽ ) ) {i:i:i:i:i:i:i:i:} ( ( ( ´・ω・)、 (O ⌒ )O ⊂_)∪ しつもん http://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_050 のスクリプトの35行目 for (++day;;) { の意味と動作がよくわからんです which で等価なループを書くとどんな感じになるの? カコイイ先輩おしえてplz >>201 先輩ありがとう ++day を最初に持ってくるのはオイラも考えたんですが、break の条件式も反転して持ってくればおkかなと思って $ diff time.awk time2.awk 34,35c34,35 < < for (++day;;) { --- > ++day; > while (day >= year_days) { 49,52d48 < } < < if (day < year_days) { < break; てやったら1日ズレちゃったんだけどこれってどこがマズいんでしょうか (・ω・` ) >>202 そのbreakの後にも続きの処理があるだろ。年もズレるんじゃない? >>203 day の値を追っかけてみたら元のfor、変更後のwhileともに同じ値で終了してたので頭抱えてたんですが もう少し調べてみたら leap の値がズレてました break の前の処理が1回分少なかったということで、落ち着いて考えれば当たり前の結論でした (;´Д`) 結局この処理の場合は元々のスクリプトや >>201 のように無限ループ使うのが一番シンプルに 書けるんだなーと確認して納得しました。先輩方ありがとう AWKを256倍使うための本が読みたいのですが どうにかして入手できないでしょうか? たけえわ! こういう本こそ電子版にしてくれねえかなあ レスありがとうございます 高いけどあるといえばあるんですね どうしようかな 長年親しんだテキストの遊園地がなくなってて非常に悲しい どっかにアーカイブないっすか >>215 で、それはいつできるんだ? できたらURL貼るのを忘れんなよ おばんです。 Linux環境の方にお願いします。 下記にあるblength()を試してもらえませんか? http://www1.bbiq.jp/rem_vba/gawk_blength.html よろしくお願いします。 HP製作者です。当方の環境はWindowsです。 Linux環境下で同じ実行結果を得ることができるのか、 知りたいのです。 よろしくお願いします。 それもそうですね。 昔々REDHATだったか入れていました。 現在のおすすめのディストリビューションは何でしょうか? 今はMS製のcygwinみたいのがあるのでは。Windows 10 Bashナントカ Windows 10 Creators UpdateでUbuntu 16.04.1 これかな。 やってみます。ありがとうございました。 jgawkをガウォークって読んでたマクロスヲタいない 誰でも簡単にパソコン1台で稼げる方法など 参考までに、 ⇒ 『宮本のゴウリエセレレ』 というブログで見ることができるらしいです。 グーグル検索⇒『宮本のゴウリエセレレ』 DCQTVO9E2N 空の配列はどう作るの。 bashの declare -a var 相当。 僕の知り合いの知り合いができた副業情報ドットコム 関心がある人だけ見てください。 グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』 V09DR Linux Beep Musicに感動したのでnokia2beeps.tclを移植してみた https://pastebin.com/hLJnpPNv nokia2beeps.awkとか保存し下記のページのコードを鳴らすやつ http://nokia.nigelcoldwell.co.uk/tunes.html あと日本語の着メロも対応してる(コメント参照) read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる