1read 100read
2011年12月2期プログラム48: awkについて語るスレ $2 (669) TOP カテ一覧 スレ一覧 2ch元 削除依頼
・ 次のスレ
49: 文字コード総合スレ part7 (440)
51: 雑談スレ 4 (185)
52: MFC、Win32++を超えるライブラリを作るスレ (825)
53: 【GUI】wxWidgets(旧wxWindows) その5【サイザー】 (330)

awkについて語るスレ $2


1 :07/02/23 〜 最終レス :11/12/22
腐っても鯛? 騏も老いては駑馬に劣る?
三人の碩学が生み出したスクリプト言語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/

2 :
awking shoes

3 :
オーク
オーク
オーク
 奥さん

4 :
多くは語るまい。
Mawk - Mike' AWK
http://gnuwin32.sourceforge.net/packages/mawk.htm

5 :
いや多くを語ってくれ

6 :
ローカル変数、。

7 :
クロージャを持ったawk実装とかないかね

8 :
コマンドプロンプトでちょちょっと使うことは頻繁にあるけど
気合い入れてプログラミングするってのは最近無くなった。

9 :
>>7
前スレにObjective awkが実在するかのような話があるがネタだろう。
実用性を無視すればawk自身で書くことも不可能ではないかもしれない。
お望みに一番近い実装は、実はJavaScriptではないかと。
http://developer.mozilla.org/ja/docs/New_in_JavaScript_1.7

10 :
トッパンのプログラミング言語AWKがブックオフで105円で叩き売られてるのを見て
なんか悲しい気分になった

11 :
>>10
俺もオライリーの「sed & awk プログラミング」本が、図書館の「無料で持ってけー棚」
にあったので、即 GET した。まあ、かなり古い本(1991 年)だけど、内容はいい本だ。
定価 \3800 円のバカ高本で、 たぶん、新書では買わなかっただろう。
トッパンのプログラミング言語AWKって、いつごろの本だったけ。とりあえず、105円なら
欲しいっす。

12 :
>>11
赤い表紙の第1版だねきっと。
緑の表紙の第2版が手元にあるけど、gawkで拡張されている
正規表現の説明とか増えてて第2版のほうがお勧め。
ちなみに定価4100円なり。

13 :
>>12
> 赤い表紙の第1版だねきっと。
そう、それそれ。 ほんで、
gensub がない。もちろん、
/inet/..... |& .... もない。
最近、/inet/..... |& .... がある(gawk3.1 から)ことを知って、gawk を見直している。
使い捨てのプログラムは gawk に汁!!。

14 :
>>11
トッパンの最初の本なら確か1990年の春頃だったと思う。
一応nawkレベルの記述のはずなんで、gawkなんかの固有の
拡張を除けば十分使えるでしょ。
105円は…ちと悲しいけどいい人に拾われて欲しいねえ。

15 :
>>13
gawkの /inet 拡張ってイマイチ使いづらくね?
汎用的なのかもしれないけど、お手軽にhttp経由でwebページの
内容取れればいいってときに記述が面倒。

16 :
>>15
単純に
gawk '{print $0}' http://foo.org/index.html
とかでシームレスにアクセスできるというほうが便利なのかな?

17 :
http://www.gnu.org/software/gawk/manual/gawkinet/gawkinet.html#Web-page
から、簡単な例。
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)
}

18 :
awkでSQLのleftjoinみたいなことできる?

19 :
>>17
なんじゃこりゃ。
wget -O - http://www.yahoo.com/ の出力を読むのと全然変わらんな。

20 :
>>16
まあ wgetとかcurl使って標準入力から取れよという話もあるかもしれないけど、
http://ほげほげ は特別扱いしてくれるとうれしいなあと思ってる。
まあHTML読んでそれを解析する手間が次に待ってるけどさw

21 :
エンコーディング対応とか色々考えると、awkでHTMLを処理しようとするほうが
無理がある感じ。
素直にPではじまる言語とか使っとけば?みたいな。

22 :
>>21
PとかR使えってのはまあそうなんだけど、HTMLの妥当性とかエンコーディングを気にしないで
いい使い道で考えてた(個人的にそういう需要がある)のでね。
HTMLに関してはきちんとしたドキュメントならxgawkでどうにかなる?

23 :
昔、Fortran、Cぐらいしか知らなかった時、
「えっ、こんな数行で計算出来るの?」
「プログラム内にファイル名書かなくて良いの?」
「この数行で、すべてのデータの計算してくれるの?」
って、驚きながら友人に教えてもらいました。
今なら、Excelでするような計算はすべてawkでしてました。
アスキーから256倍シリーズが出たぐらいだから
注目の言語だったんだよね。

24 :
Visicalcと1-2-3はawkブームより昔からあったんだけどね。
UNIXって意外と古くないんだよね。

25 :
>10
発行所が新紀元社の「プログラミング言語AWK」を2005年に定価3465円(税込)で買いました。
奥付に「本書は1989年11月に株式会社トッパンより発行されました。この度、株式会社新紀元社より、原出版社、訳者の許可を得て再発行いたしました。」と書かれています。

26 :
新紀元社ってRPGの本しか出してないと思ってたから意外だ。

27 :
大昔に通ってた高専の土木工学科にはawkの授業があった
実験のデータ処理にでも使ってほしかったんだろう

28 :
>24
awkブームは、西暦だと何年頃でしょうか?

29 :
>>28
DOS末期。256倍本が出た93年頃がピークでは。
後のPerlとは比較にならないプチブームだけど。

30 :
>29
御回答ありがとうございます。

31 :
最近の情報は、こちら!
ttp://gauc.no-ip.org/

32 :
鬼車awkを誰か作ってくれないかなー

33 :
>>32
いいこと言うねぇ。
賛成!

34 :
あとローカル変数が欲しいな

35 :
functionの中はローカル変数になるよ。

36 :
いつから?未だに引数に並べるもんだと。

37 :
あー、ごめん、引数並べたやつがローカル変数になる。だった。
先に宣言すればいいんだから別によくね?

38 :
キモいやん。そのやり方。

39 :
これからawkを勉強します。

40 :
awkを学ぶことになるでしょう。

41 :
みなさんawkは語らないのですね。

42 :
船頭awkして船山に登る。

43 :
人に言えるほどawk知ってる訳でも無いし

44 :
だけど人の話は聞きたいし

45 :
awkぼ利通

46 :
1

47 :
awkを勉強しているのですが、Perlに慣れているからか
awkでできることはPerlでワンライナーでやったほうが(少なくとも自分にとっては)速い気がしてなりません。
これについてawk熟練者である皆様はいかがお考えになりますか?
こういう時はawkのほうが便利!という例にはどんなものがありますか?

48 :
↑あっ速いというのは、コードを書くのが速いという意味です。

49 :
>>47
perl はなくても awk なら入っている事がある

50 :
「コードを書くのが速い」という基準で、
「こういう時はawkのほうが便利」という例を他人に挙げさせても、
それはその人間にとっての速い気がする便利さであって、
意味のある一般的な議論にならないのではないか?

51 :
PerlもRubyもPythonも使うけど、特定のカラムだけに興味があるケースは
無意識にawkを使うこともある。
perl -a とか cutしてpasteとかもあるけど。

52 :
>>49 環境によらず入っているということですね。
>>50 そうですね。
なぜawkなのか、
一般的にはどういう時にawkが使われるのか、
というのがイマイチ自分のなかで分かっていないのです。
>>51 少し勉強した限りでは、確かにカラムの取り出しはawkが便利なのかもと思いました。

53 :
>>52
シェルスクリプトの中で、貧弱なシェルの計算能力を
補うために、ツールボックスの一つとして使われることが多い。
ので、シェルスクリプトを書く機会が多いのなら、やっておいて
損は無いと思うが、フットプリントが多少デカイこととやや移植性に
欠けることを気にしなければ、別にPerl使ったっていいわけだ
(どうせ今なら大抵は使えるだろうし、awkにしても一応Posix標準だが
色々変種がある)。
ま、単に便利なスクリプト言語が欲しいだけなら、今更awkをやる意味は
ほとんどないだろう。
フィールド分割だけならperl -aでawkの真似ができるしな。

54 :
>>53 丁寧なお返事ありがとうございます。
シェルの計算の補助ですか。
シェルスクリプトを書く機会は多少はあるので、多少は覚えておこうと思います。

55 :
awkとperl、処理速度はどっちが速いんだろ?
ってオマエが試せって言われそうだけどふと思ったんで書いてみた。

56 :
awkは処理系多いからなぁ
何の処理かにもよるだろうし

57 :
どちらも得意とする単純なテキストのフィルタリング処理なら、
I/O速度で制限されるのでどちらでも(或いはsedを持ち出しても)大して変わらないと思う。
awkの真骨頂は一行野郎にあると思う私は、こんなのをよく書き捨てる。
--
awk 'BEGIN {print 1+2*3-4;}'
ls -l /tmp|awk '$5>0'
ls -l |awk '{sum+=$5;} END{print sum;}'

58 :
PerlにたいするAwkの現実的メリットはメモリ消費が少ないことくらいで
これは今の計算機では微々たる問題だ。
ESRのArt of UNIX Programmingを立ち読みしたら
Awkがメモリ節約のために仕様を制限したことが
早期に競争力をなくした理由と論じていた。
バッドな言語設計の見本って感じで、ちと不愉快だった

59 :
>>57
俺も時々やる。
その時は便利!と思って.cshrcとかにalias登録するけどすぐに忘れて同じ内容を手打ちしてたりする
その挙句にこれは便利!と思って.cshrc開くと既に登録してあるという…

60 :
>>59
全俺が共感した。

61 :
(.cshrcを.bashrcに置き換えて) 俺も同じ経験がある。

62 :
「一行野郎」は名訳

63 :
むかし、「読書するプログラマ」をよんで、awkで会計をするのがかっこ良いと
おもってました。
でも確定申告をする身になったらEXCELを使っている。
「エンジニアのための事務作業 sed awk grep そしてTex」なんて書籍があれば食いつくのに...

64 :
awkで会計用スクリプトを書くより、会計のしくみを理解することの方が
俺には遥かに難しい

65 :
Perlだけど、これは?
http://www.moge.org/okabe/temp/balance/

66 :
Perl はコード一目見て俺がcore吐きそうになる

67 :
任意に core が吐けたら便利だよな。日記代わりになる。

68 :
>>67
体型維持のために余儀なくされている人もいたようです。
指を喉に入れるようにするので、俗に言うげろだこが指にできます。

69 :
awkってなんでPerl風に正規表現置換できるようにならんの。独自拡張でもいいんだけどな。

70 :
>>69
ん、くわしく。
Perlのメタ文字を使いたいというのとは違うの?
#使えんわけだが

71 :
awkはDFAでperlはNFAだっけか?

72 :
>>71
オリジナルではね。
中にはNFAを使っているawkもある。mawkとか。

73 :
xgawkで多倍長整数を使いたいんですが、
printf( "%ld\n", num );
では桁数は増えても精度は上がってないようです。
型宣言するにはどうするのでしょうか

74 :
>>73
多倍長整数を実装するのに個別の精度を上げてどうする。

75 :
xgawkは多倍長整数あるんですよね?
で、rubyのように無宣言で使えるかと思ったらそうではないらしいので、
どうするのかと。
http://home.vrweb.de/~juergen.kahrs/gawk/XML/xmlgawk.html
いまこのへん見てるんですが

76 :
MPFR,多倍長整数ではなく実数かな。
ググって見つけました。
http://www.kt.rim.or.jp/~kbk/zakkicho/zakkicho7.html#D060126
http://golf.shinh.org/p.rb?Factorial
実はこれやってるんですが。
あとはdllのパスが分かれば・・・

77 :
>>76
「あなごる」の xgawk は MPFR 積んでないと思うが・・・。

78 :
そうですか
どちらにしても実数って事はやっぱ無理な気がしました

79 :
sedみたいに、パターン部分を行番号で指定出来ませんか?

80 :
>>79
awk 'NR == 79 {print;}'
ってこと? それとも、
awk 'FNR == 79 {print;}'
ってこと?

81 :
>80
はじめsedみたいに 10,35{ みたいな感じに書いてダメだったので; }
普通に比較式書くんですね。10<=NR&&NR<=35{ で出来ました; }
ありがとうございます。

82 :
>>81
もう少し sed らしくしたいなら、
10==NR, NR==35 { print }
なんてのもあり

83 :
awk はオプションなしだとワンライナーのコードを書くことになると思いますが
実際 awk のワンライナーってどんな時に使いますか?
あまり見たことがなくて…

84 :
>>83
UNIXでは多くのファイルや出力が欄区切りテキストの形式になっているから
その場使い捨てワンライナーが本来の使い方なんだけど、
他のOSだと BEGIN を main 代わりに使うようなのばっかになるかもね。

85 :
>>83がsedをどう使っているのか気になる。
sedスクリプトファイルとか作って、スクリプトの引数に処理対象のファイルを渡してたりするのかな。

86 :
よく書く一行野郎。
--
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でいいけど、近似を見るには使えないんで。

87 :
>>85
sedは単体の命令を見て「置換」「行の切り捨て」みたいな用途が
パッと見て思い付くので疑問は沸かないんです。
awkはひとつひとつの命令を見ても
普通にスクリプト言語の命令としか思えないので
「コード書くならともかく、ワンライナーでどう使うの?」と
疑問をもってしまうんです。
>>86
う〜ん、結構複雑になりますね。
それだと私ならターミナルに書かずに
コードに起こしてしまいそうです。
でも、パターンとフィールドを上手く使えば
色々出来る気がしてきました。
例をありがとうございます。

88 :
あ、コード書きそうなのは後者です。
平均とか合計みたいなモノには良さそうですね。

89 :
今日書いた一行野郎。
--
awk '{for (ic = 1; ic <= NF; ++ic) {if (max < $ic) max = $ic;}} END {print max;}'
--
これも全フィールドに拡張しているだけで、単に最大値を得ているだけだね。

90 :
よく書く一行
du -k|awk '$1 > 10000'
でかいデレクトリをさがす

91 :
俺がよく書く一行野郎
$ awk 1 > hoge.sh

92 :
>>91
それに何の意味が?
cat > hoge.shでも事が足りそうだが。

93 :
>92
Windowsにawk入れてた時に、こんなヘンな癖が付いてしまった。

94 :
すみません、初心者ですがawkに関するスレがここしかなかったので。
↓のソースを書いていただいたのですが、いったいどうすれば使えるのでしょうか?
ちなみに、これはフォルダ内の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";}}

95 :
それを動かすにはまず gawk をどこかから入手する。

96 :
>>94
>↓のソースを書いていただいたのですが、
書いた人に聞く。
と答えると、わけのわからん理由を言ってごねるだろうから、
先に言っとくと、そんな見苦しい言い訳するな。
どうせ答えたって、今度は○○がわかりませんとか言い出すんだろ?
どっかからgawkを落として展開しろよ。全く、一生ググってろよカス
"C:\Program Files\WinRAR\UnRAR.exe" lt *.rar | "gawkのフルパス" -f rr.awk

97 :
すいません、あるテキストを{print $1,$2}として抽出して
aaa 1
aaa 2
aaa 3
bbb 1
bbb 2
ccc 1
ccc 4
...
とまではできたんですが、並んでいるデータをそれぞれ、
aaa 6
bbb 3
ccc 5
と集計したいんですが、どのようにすればいいでしょうか?

98 :
awk '{count[$1] += $2;} END{for (aaa in count) {print aaa count[aaa]}}'
あとはソートすればいいはず

99 :
>98さん、ありがとうございます!
情けないのですが、今まで便利なツールに頼っていて全然コマンドについて理解できていなかったので困っていました。
実はメールログで送信者がどれだけの通数を送信してるかを確かめるためにコマンドでできないか、で>97でつまづいていました。
何とか途中までできたんですが、非常にスーパーエレガントな1行コードでして…。
質問ついでで申し訳ないのですが、
(aaa in count) {print aaa count[aaa]}
のaaaについてはどう解釈すればいいのでしょうか?

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
・ 次のスレ
49: 文字コード総合スレ part7 (440)
51: 雑談スレ 4 (185)
52: MFC、Win32++を超えるライブラリを作るスレ (825)
53: 【GUI】wxWidgets(旧wxWindows) その5【サイザー】 (330)