awkについて語るスレ $2
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/02/23(金) 23:55:42三人の碩学が生み出したスクリプト言語AWKについて語るスレ
◆ 前スレ
awkについて語るスレ
http://pc10.2ch.net/test/read.cgi/tech/1023556171/
◆ 関係スレ
シェルスクリプト相談室
http://pc10.2ch.net/test/read.cgi/tech/1112553783/
AWKでCGI
http://pc10.2ch.net/test/read.cgi/php/1171804314/
【sed】シェルスクリプト総合@LINUX Part2【awk】
http://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/
0002デフォルトの名無しさん
2007/02/24(土) 00:04:130003デフォルトの名無しさん
2007/02/24(土) 00:24:49オーク
オーク
奥さん
0004デフォルトの名無しさん
2007/02/24(土) 01:35:13Mawk - Mike' AWK
http://gnuwin32.sourceforge.net/packages/mawk.htm
0005デフォルトの名無しさん
2007/02/24(土) 23:32:050006デフォルトの名無しさん
2007/02/25(日) 06:34:370007デフォルトの名無しさん
2007/02/27(火) 21:39:180008デフォルトの名無しさん
2007/02/27(火) 23:45:59気合い入れてプログラミングするってのは最近無くなった。
0009デフォルトの名無しさん
2007/02/28(水) 00:13:16前スレにObjective awkが実在するかのような話があるがネタだろう。
実用性を無視すればawk自身で書くことも不可能ではないかもしれない。
お望みに一番近い実装は、実はJavaScriptではないかと。
http://developer.mozilla.org/ja/docs/New_in_JavaScript_1.7
0010デフォルトの名無しさん
2007/03/01(木) 00:43:46なんか悲しい気分になった
0011デフォルトの名無しさん
2007/03/01(木) 16:01:47俺もオライリーの「sed & awk プログラミング」本が、図書館の「無料で持ってけー棚」
にあったので、即 GET した。まあ、かなり古い本(1991 年)だけど、内容はいい本だ。
定価 \3800 円のバカ高本で、 たぶん、新書では買わなかっただろう。
トッパンのプログラミング言語AWKって、いつごろの本だったけ。とりあえず、105円なら
欲しいっす。
0012デフォルトの名無しさん
2007/03/01(木) 21:49:42赤い表紙の第1版だねきっと。
緑の表紙の第2版が手元にあるけど、gawkで拡張されている
正規表現の説明とか増えてて第2版のほうがお勧め。
ちなみに定価4100円なり。
001311
2007/03/01(木) 23:52:54> 赤い表紙の第1版だねきっと。
そう、それそれ。 ほんで、
gensub がない。もちろん、
/inet/..... |& .... もない。
最近、/inet/..... |& .... がある(gawk3.1 から)ことを知って、gawk を見直している。
使い捨てのプログラムは gawk に汁!!。
0014デフォルトの名無しさん
2007/03/02(金) 02:09:03トッパンの最初の本なら確か1990年の春頃だったと思う。
一応nawkレベルの記述のはずなんで、gawkなんかの固有の
拡張を除けば十分使えるでしょ。
105円は…ちと悲しいけどいい人に拾われて欲しいねえ。
0015デフォルトの名無しさん
2007/03/02(金) 02:27:22gawkの /inet 拡張ってイマイチ使いづらくね?
汎用的なのかもしれないけど、お手軽にhttp経由でwebページの
内容取れればいいってときに記述が面倒。
0016デフォルトの名無しさん
2007/03/04(日) 00:06:22単純に
gawk '{print $0}' http://foo.org/index.html
とかでシームレスにアクセスできるというほうが便利なのかな?
0017デフォルトの名無しさん
2007/03/04(日) 00:24:42から、簡単な例。
BEGIN {
RS = ORS = "\r\n"
HttpService = "/inet/tcp/0/www.yahoo.com/80"
print "GET http://www.yahoo.com" |& HttpService
while ((HttpService |& getline) > 0)
print $0
close(HttpService)
}
0018デフォルトの名無しさん
2007/03/04(日) 00:38:540019デフォルトの名無しさん
2007/03/04(日) 01:55:43なんじゃこりゃ。
wget -O - http://www.yahoo.com/ の出力を読むのと全然変わらんな。
002015
2007/03/04(日) 03:46:24まあ wgetとかcurl使って標準入力から取れよという話もあるかもしれないけど、
http://ほげほげ は特別扱いしてくれるとうれしいなあと思ってる。
まあHTML読んでそれを解析する手間が次に待ってるけどさw
0021デフォルトの名無しさん
2007/03/04(日) 03:55:11無理がある感じ。
素直にPではじまる言語とか使っとけば?みたいな。
002219
2007/03/04(日) 04:55:31PとかR使えってのはまあそうなんだけど、HTMLの妥当性とかエンコーディングを気にしないで
いい使い道で考えてた(個人的にそういう需要がある)のでね。
HTMLに関してはきちんとしたドキュメントならxgawkでどうにかなる?
0023デフォルトの名無しさん
2007/03/14(水) 16:26:36「えっ、こんな数行で計算出来るの?」
「プログラム内にファイル名書かなくて良いの?」
「この数行で、すべてのデータの計算してくれるの?」
って、驚きながら友人に教えてもらいました。
今なら、Excelでするような計算はすべてawkでしてました。
アスキーから256倍シリーズが出たぐらいだから
注目の言語だったんだよね。
0024デフォルトの名無しさん
2007/03/14(水) 16:40:22UNIXって意外と古くないんだよね。
0025デフォルトの名無しさん
2007/04/14(土) 08:00:42発行所が新紀元社の「プログラミング言語AWK」を2005年に定価3465円(税込)で買いました。
奥付に「本書は1989年11月に株式会社トッパンより発行されました。この度、株式会社新紀元社より、原出版社、訳者の許可を得て再発行いたしました。」と書かれています。
0026デフォルトの名無しさん
2007/04/14(土) 09:43:470027デフォルトの名無しさん
2007/04/14(土) 13:42:47実験のデータ処理にでも使ってほしかったんだろう
0028デフォルトの名無しさん
2007/04/16(月) 17:34:08awkブームは、西暦だと何年頃でしょうか?
0029デフォルトの名無しさん
2007/04/17(火) 00:31:15DOS末期。256倍本が出た93年頃がピークでは。
後のPerlとは比較にならないプチブームだけど。
003028
2007/04/17(火) 08:45:33御回答ありがとうございます。
0031デフォルトの名無しさん
2007/05/04(金) 21:28:49ttp://gauc.no-ip.org/
0032デフォルトの名無しさん
2007/07/14(土) 08:27:580033デフォルトの名無しさん
2007/07/15(日) 03:17:40いいこと言うねぇ。
賛成!
0034デフォルトの名無しさん
2007/09/03(月) 08:59:450035デフォルトの名無しさん
2007/09/03(月) 10:30:140036デフォルトの名無しさん
2007/09/04(火) 00:12:170037デフォルトの名無しさん
2007/09/04(火) 09:33:02先に宣言すればいいんだから別によくね?
0038デフォルトの名無しさん
2007/09/09(日) 04:42:020039デフォルトの名無しさん
2007/09/14(金) 04:37:240040デフォルトの名無しさん
2007/09/14(金) 09:05:130041デフォルトの名無しさん
2007/09/15(土) 01:03:040042デフォルトの名無しさん
2007/09/15(土) 10:28:440043デフォルトの名無しさん
2007/09/16(日) 03:03:510044デフォルトの名無しさん
2007/09/16(日) 10:27:220045デフォルトの名無しさん
2007/09/17(月) 18:12:150046cat.awk
2007/09/19(水) 08:55:440047デフォルトの名無しさん
2007/09/19(水) 16:41:49awkでできることはPerlでワンライナーでやったほうが(少なくとも自分にとっては)速い気がしてなりません。
これについてawk熟練者である皆様はいかがお考えになりますか?
こういう時はawkのほうが便利!という例にはどんなものがありますか?
0048デフォルトの名無しさん
2007/09/19(水) 16:43:110049デフォルトの名無しさん
2007/09/19(水) 16:48:06perl はなくても awk なら入っている事がある
0050デフォルトの名無しさん
2007/09/19(水) 16:53:58「こういう時はawkのほうが便利」という例を他人に挙げさせても、
それはその人間にとっての速い気がする便利さであって、
意味のある一般的な議論にならないのではないか?
0051デフォルトの名無しさん
2007/09/19(水) 16:57:51無意識にawkを使うこともある。
perl -a とか cutしてpasteとかもあるけど。
0052デフォルトの名無しさん
2007/09/19(水) 18:19:27>>50 そうですね。
なぜawkなのか、
一般的にはどういう時にawkが使われるのか、
というのがイマイチ自分のなかで分かっていないのです。
>>51 少し勉強した限りでは、確かにカラムの取り出しはawkが便利なのかもと思いました。
0053デフォルトの名無しさん
2007/09/19(水) 19:55:33シェルスクリプトの中で、貧弱なシェルの計算能力を
補うために、ツールボックスの一つとして使われることが多い。
ので、シェルスクリプトを書く機会が多いのなら、やっておいて
損は無いと思うが、フットプリントが多少デカイこととやや移植性に
欠けることを気にしなければ、別にPerl使ったっていいわけだ
(どうせ今なら大抵は使えるだろうし、awkにしても一応Posix標準だが
色々変種がある)。
ま、単に便利なスクリプト言語が欲しいだけなら、今更awkをやる意味は
ほとんどないだろう。
フィールド分割だけならperl -aでawkの真似ができるしな。
0054デフォルトの名無しさん
2007/09/19(水) 20:06:52シェルの計算の補助ですか。
シェルスクリプトを書く機会は多少はあるので、多少は覚えておこうと思います。
0055デフォルトの名無しさん
2007/09/19(水) 21:00:04ってオマエが試せって言われそうだけどふと思ったんで書いてみた。
0056デフォルトの名無しさん
2007/09/19(水) 22:17:45何の処理かにもよるだろうし
0057デフォルトの名無しさん
2007/09/19(水) 23:45:00I/O速度で制限されるのでどちらでも(或いはsedを持ち出しても)大して変わらないと思う。
awkの真骨頂は一行野郎にあると思う私は、こんなのをよく書き捨てる。
--
awk 'BEGIN {print 1+2*3-4;}'
ls -l /tmp|awk '$5>0'
ls -l |awk '{sum+=$5;} END{print sum;}'
0058デフォルトの名無しさん
2007/09/19(水) 23:51:16これは今の計算機では微々たる問題だ。
ESRのArt of UNIX Programmingを立ち読みしたら
Awkがメモリ節約のために仕様を制限したことが
早期に競争力をなくした理由と論じていた。
バッドな言語設計の見本って感じで、ちと不愉快だった
0059デフォルトの名無しさん
2007/09/22(土) 02:28:36俺も時々やる。
その時は便利!と思って.cshrcとかにalias登録するけどすぐに忘れて同じ内容を手打ちしてたりする
その挙句にこれは便利!と思って.cshrc開くと既に登録してあるという…
0060デフォルトの名無しさん
2007/09/22(土) 09:21:37全俺が共感した。
0061デフォルトの名無しさん
2007/09/24(月) 12:01:330062デフォルトの名無しさん
2007/09/28(金) 00:37:500063デフォルトの名無しさん
2007/09/28(金) 01:20:24おもってました。
でも確定申告をする身になったらEXCELを使っている。
「エンジニアのための事務作業 sed awk grep そしてTex」なんて書籍があれば食いつくのに...
0064デフォルトの名無しさん
2007/09/28(金) 02:53:12俺には遥かに難しい
0065デフォルトの名無しさん
2007/09/28(金) 14:47:04http://www.moge.org/okabe/temp/balance/
0066デフォルトの名無しさん
2007/10/02(火) 02:19:460067デフォルトの名無しさん
2007/10/02(火) 07:50:300068デフォルトの名無しさん
2007/10/02(火) 08:00:10体型維持のために余儀なくされている人もいたようです。
指を喉に入れるようにするので、俗に言うげろだこが指にできます。
0069デフォルトの名無しさん
2007/10/03(水) 23:18:590070デフォルトの名無しさん
2007/10/04(木) 02:48:29ん、くわしく。
Perlのメタ文字を使いたいというのとは違うの?
#使えんわけだが
0071デフォルトの名無しさん
2007/10/04(木) 21:53:480072デフォルトの名無しさん
2007/10/05(金) 02:45:00オリジナルではね。
中にはNFAを使っているawkもある。mawkとか。
0073デフォルトの名無しさん
2007/11/22(木) 06:36:33printf( "%ld\n", num );
では桁数は増えても精度は上がってないようです。
型宣言するにはどうするのでしょうか
0074デフォルトの名無しさん
2007/11/22(木) 07:17:23多倍長整数を実装するのに個別の精度を上げてどうする。
0075デフォルトの名無しさん
2007/11/22(木) 07:34:48で、rubyのように無宣言で使えるかと思ったらそうではないらしいので、
どうするのかと。
http://home.vrweb.de/~juergen.kahrs/gawk/XML/xmlgawk.html
いまこのへん見てるんですが
0076デフォルトの名無しさん
2007/11/22(木) 08:47:49ググって見つけました。
http://www.kt.rim.or.jp/~kbk/zakkicho/zakkicho7.html#D060126
http://golf.shinh.org/p.rb?Factorial
実はこれやってるんですが。
あとはdllのパスが分かれば・・・
0077デフォルトの名無しさん
2007/11/26(月) 21:13:28「あなごる」の xgawk は MPFR 積んでないと思うが・・・。
0078デフォルトの名無しさん
2007/11/29(木) 08:00:03どちらにしても実数って事はやっぱ無理な気がしました
0079デフォルトの名無しさん
2008/01/04(金) 07:28:200080デフォルトの名無しさん
2008/01/04(金) 09:32:19awk 'NR == 79 {print;}'
ってこと? それとも、
awk 'FNR == 79 {print;}'
ってこと?
0081デフォルトの名無しさん
2008/01/04(金) 14:24:54はじめsedみたいに 10,35{ みたいな感じに書いてダメだったので; }
普通に比較式書くんですね。10<=NR&&NR<=35{ で出来ました; }
ありがとうございます。
0082デフォルトの名無しさん
2008/01/05(土) 00:50:26もう少し sed らしくしたいなら、
10==NR, NR==35 { print }
なんてのもあり
0083デフォルトの名無しさん
2008/01/14(月) 09:02:50実際 awk のワンライナーってどんな時に使いますか?
あまり見たことがなくて…
0084デフォルトの名無しさん
2008/01/14(月) 09:45:08UNIXでは多くのファイルや出力が欄区切りテキストの形式になっているから
その場使い捨てワンライナーが本来の使い方なんだけど、
他のOSだと BEGIN を main 代わりに使うようなのばっかになるかもね。
0085デフォルトの名無しさん
2008/01/14(月) 09:46:06sedスクリプトファイルとか作って、スクリプトの引数に処理対象のファイルを渡してたりするのかな。
0086デフォルトの名無しさん
2008/01/14(月) 10:18:29--
du -sk /tmp/* | awk '{sum += $1;} END {print sum / NR;}'
# まぁ、duってのは今思いついただけで、実際にduの出力の平均を取ることはないけどね。
--
paste foo bar | awk '($1 - $2) > 1e-3 || ($1 - $2) < -1e-3 {print NR, $0;}'
# 一致を見るだけならdiffでいいけど、近似を見るには使えないんで。
0087デフォルトの名無しさん
2008/01/15(火) 18:34:44sedは単体の命令を見て「置換」「行の切り捨て」みたいな用途が
パッと見て思い付くので疑問は沸かないんです。
awkはひとつひとつの命令を見ても
普通にスクリプト言語の命令としか思えないので
「コード書くならともかく、ワンライナーでどう使うの?」と
疑問をもってしまうんです。
>>86
う〜ん、結構複雑になりますね。
それだと私ならターミナルに書かずに
コードに起こしてしまいそうです。
でも、パターンとフィールドを上手く使えば
色々出来る気がしてきました。
例をありがとうございます。
0088デフォルトの名無しさん
2008/01/15(火) 18:59:18平均とか合計みたいなモノには良さそうですね。
0089デフォルトの名無しさん
2008/01/15(火) 19:28:50--
awk '{for (ic = 1; ic <= NF; ++ic) {if (max < $ic) max = $ic;}} END {print max;}'
--
これも全フィールドに拡張しているだけで、単に最大値を得ているだけだね。
0090デフォルトの名無しさん
2008/01/22(火) 16:52:32du -k|awk '$1 > 10000'
でかいデレクトリをさがす
0091デフォルトの名無しさん
2008/01/29(火) 23:34:51$ awk 1 > hoge.sh
0092デフォルトの名無しさん
2008/01/31(木) 12:58:14それに何の意味が?
cat > hoge.shでも事が足りそうだが。
0093デフォルトの名無しさん
2008/01/31(木) 18:48:07Windowsにawk入れてた時に、こんなヘンな癖が付いてしまった。
0094デフォルトの名無しさん
2008/02/02(土) 12:38:28↓のソースを書いていただいたのですが、いったいどうすれば使えるのでしょうか?
ちなみに、これはフォルダ内のWinrar形式ファイルのリカバリレコードが付いているか否か
リストを一括で出力するものです。
よろしこ
**************
コマンドラインだけどunrar lt sample.rarの出力利用してリストを作るだけ
使い方はパイプでawkに渡して処理unrar lt *.rar | gawk -f rr.awk
awkなんか入ってないだろうから当然そのままじゃ動かない
rr.awk
#!/usr/local/bin/gawk
BEGIN {$rr=0; printf "%-30s\t%s\n", "FileName", "RecoveryRecord";}
{if($1=="Solid" && $2=="archive"){
for(i=3;i<=NF;i++) printf "%-30s ",$i;printf "\t";getline;getline;
if($0=="Recovery record is present"){printf "Yes / ";
for(;;){getline;if($0=="Data header type: RR"){getline;printf "%sbyte\n",$2;break;}}
}else printf "No\n";}}
0095デフォルトの名無しさん
2008/02/02(土) 13:01:480096デフォルトの名無しさん
2008/02/02(土) 17:48:45>↓のソースを書いていただいたのですが、
書いた人に聞く。
と答えると、わけのわからん理由を言ってごねるだろうから、
先に言っとくと、そんな見苦しい言い訳するな。
どうせ答えたって、今度は○○がわかりませんとか言い出すんだろ?
どっかからgawkを落として展開しろよ。全く、一生ググってろよカス
"C:\Program Files\WinRAR\UnRAR.exe" lt *.rar | "gawkのフルパス" -f rr.awk
0097デフォルトの名無しさん
2008/02/10(日) 19:16:33aaa 1
aaa 2
aaa 3
bbb 1
bbb 2
ccc 1
ccc 4
...
とまではできたんですが、並んでいるデータをそれぞれ、
aaa 6
bbb 3
ccc 5
と集計したいんですが、どのようにすればいいでしょうか?
0098デフォルトの名無しさん
2008/02/10(日) 19:28:07あとはソートすればいいはず
009997
2008/02/10(日) 20:22:03情けないのですが、今まで便利なツールに頼っていて全然コマンドについて理解できていなかったので困っていました。
実はメールログで送信者がどれだけの通数を送信してるかを確かめるためにコマンドでできないか、で>97でつまづいていました。
何とか途中までできたんですが、非常にスーパーエレガントな1行コードでして…。
質問ついでで申し訳ないのですが、
(aaa in count) {print aaa count[aaa]}
のaaaについてはどう解釈すればいいのでしょうか?
0100デフォルトの名無しさん
2008/02/10(日) 20:33:27bashとかのforとかと同じで適当な文字列ならなんでもいいです.例に出てきたaaaなんかにするからややこしくなってすみません.
for(hoge in list) {...}
で配列listのキーを片っ端からhogeに入れてループするって意味になるはずですよ.
0101デフォルトの名無しさん
2008/02/10(日) 20:36:22awk '{count[$1] += $2;} END{for (i in count) {printf "%s %i\n", i, count[i]}}'
こうやって書けばしんせつじゃね?
データの中のaaaとloopカウンターのaaaを同じ名前にするのは意地悪だと思うよ
■ このスレッドは過去ログ倉庫に格納されています