07/02/23 23:55:42
腐っても鯛? 騏驎も老いては駑馬に劣る?
三人の碩学が生み出したスクリプト言語AWKについて語るスレ
◆ 前スレ
awkについて語るスレ
スレリンク(tech板)
◆ 関係スレ
シェルスクリプト相談室
スレリンク(tech板)
AWKでCGI
スレリンク(php板)
【sed】シェルスクリプト総合@LINUX Part2【awk】
スレリンク(linux板)
◆ 参考
The AWK Programming Language (Brian Kernighan):
URLリンク(cm.bell-labs.com)
GAWK (GNU Projedt):
URLリンク(www.gnu.org)
2:デフォルトの名無しさん
07/02/24 00:04:13
awking shoes
3:デフォルトの名無しさん
07/02/24 00:24:49
オーク
オーク
オーク
奥さん
4:デフォルトの名無しさん
07/02/24 01:35:13
多くは語るまい。
Mawk - Mike' AWK
URLリンク(gnuwin32.sourceforge.net)
5:デフォルトの名無しさん
07/02/24 23:32:05
いや多くを語ってくれ
6:デフォルトの名無しさん
07/02/25 06:34:37
ローカル変数、。
7:デフォルトの名無しさん
07/02/27 21:39:18
クロージャを持ったawk実装とかないかね
8:デフォルトの名無しさん
07/02/27 23:45:59
コマンドプロンプトでちょちょっと使うことは頻繁にあるけど
気合い入れてプログラミングするってのは最近無くなった。
9:デフォルトの名無しさん
07/02/28 00:13:16
>>7
前スレにObjective awkが実在するかのような話があるがネタだろう。
実用性を無視すればawk自身で書くことも不可能ではないかもしれない。
お望みに一番近い実装は、実はJavaScriptではないかと。
URLリンク(developer.mozilla.org)
10:デフォルトの名無しさん
07/03/01 00:43:46
トッパンのプログラミング言語AWKがブックオフで105円で叩き売られてるのを見て
なんか悲しい気分になった
11:デフォルトの名無しさん
07/03/01 16:01:47
>>10
俺もオライリーの「sed & awk プログラミング」本が、図書館の「無料で持ってけー棚」
にあったので、即 GET した。まあ、かなり古い本(1991 年)だけど、内容はいい本だ。
定価 \3800 円のバカ高本で、 たぶん、新書では買わなかっただろう。
トッパンのプログラミング言語AWKって、いつごろの本だったけ。とりあえず、105円なら
欲しいっす。
12:デフォルトの名無しさん
07/03/01 21:49:42
>>11
赤い表紙の第1版だねきっと。
緑の表紙の第2版が手元にあるけど、gawkで拡張されている
正規表現の説明とか増えてて第2版のほうがお勧め。
ちなみに定価4100円なり。
13:11
07/03/01 23:52:54
>>12
> 赤い表紙の第1版だねきっと。
そう、それそれ。 ほんで、
gensub がない。もちろん、
/inet/..... |& .... もない。
最近、/inet/..... |& .... がある(gawk3.1 から)ことを知って、gawk を見直している。
使い捨てのプログラムは gawk に汁!!。
14:デフォルトの名無しさん
07/03/02 02:09:03
>>11
トッパンの最初の本なら確か1990年の春頃だったと思う。
一応nawkレベルの記述のはずなんで、gawkなんかの固有の
拡張を除けば十分使えるでしょ。
105円は…ちと悲しいけどいい人に拾われて欲しいねえ。
15:デフォルトの名無しさん
07/03/02 02:27:22
>>13
gawkの /inet 拡張ってイマイチ使いづらくね?
汎用的なのかもしれないけど、お手軽にhttp経由でwebページの
内容取れればいいってときに記述が面倒。
16:デフォルトの名無しさん
07/03/04 00:06:22
>>15
単純に
gawk '{print $0}' URLリンク(foo.org)
とかでシームレスにアクセスできるというほうが便利なのかな?
17:デフォルトの名無しさん
07/03/04 00:24:42
URLリンク(www.gnu.org)
から、簡単な例。
BEGIN {
RS = ORS = "\r\n"
HttpService = "/inet/tcp/0/www.yahoo.com/80"
print "GET URLリンク(www.yahoo.com") |& HttpService
while ((HttpService |& getline) > 0)
print $0
close(HttpService)
}
18:デフォルトの名無しさん
07/03/04 00:38:54
awkでSQLのleftjoinみたいなことできる?
19:デフォルトの名無しさん
07/03/04 01:55:43
>>17
なんじゃこりゃ。
wget -O - URLリンク(www.yahoo.com) の出力を読むのと全然変わらんな。
20:15
07/03/04 03:46:24
>>16
まあ wgetとかcurl使って標準入力から取れよという話もあるかもしれないけど、
http://ほげほげ は特別扱いしてくれるとうれしいなあと思ってる。
まあHTML読んでそれを解析する手間が次に待ってるけどさw
21:デフォルトの名無しさん
07/03/04 03:55:11
エンコーディング対応とか色々考えると、awkでHTMLを処理しようとするほうが
無理がある感じ。
素直にPではじまる言語とか使っとけば?みたいな。
22:19
07/03/04 04:55:31
>>21
PとかR使えってのはまあそうなんだけど、HTMLの妥当性とかエンコーディングを気にしないで
いい使い道で考えてた(個人的にそういう需要がある)のでね。
HTMLに関してはきちんとしたドキュメントならxgawkでどうにかなる?
23:デフォルトの名無しさん
07/03/14 16:26:36
昔、Fortran、Cぐらいしか知らなかった時、
「えっ、こんな数行で計算出来るの?」
「プログラム内にファイル名書かなくて良いの?」
「この数行で、すべてのデータの計算してくれるの?」
って、驚きながら友人に教えてもらいました。
今なら、Excelでするような計算はすべてawkでしてました。
アスキーから256倍シリーズが出たぐらいだから
注目の言語だったんだよね。
24:デフォルトの名無しさん
07/03/14 16:40:22
Visicalcと1-2-3はawkブームより昔からあったんだけどね。
UNIXって意外と古くないんだよね。
25:デフォルトの名無しさん
07/04/14 08:00:42
>10
発行所が新紀元社の「プログラミング言語AWK」を2005年に定価3465円(税込)で買いました。
奥付に「本書は1989年11月に株式会社トッパンより発行されました。この度、株式会社新紀元社より、原出版社、訳者の許可を得て再発行いたしました。」と書かれています。
26:デフォルトの名無しさん
07/04/14 09:43:47
新紀元社ってRPGの本しか出してないと思ってたから意外だ。
27:デフォルトの名無しさん
07/04/14 13:42:47
大昔に通ってた高専の土木工学科にはawkの授業があった
実験のデータ処理にでも使ってほしかったんだろう
28:デフォルトの名無しさん
07/04/16 17:34:08
>24
awkブームは、西暦だと何年頃でしょうか?
29:デフォルトの名無しさん
07/04/17 00:31:15
>>28
DOS末期。256倍本が出た93年頃がピークでは。
後のPerlとは比較にならないプチブームだけど。
30:28
07/04/17 08:45:33
>29
御回答ありがとうございます。
31:デフォルトの名無しさん
07/05/04 21:28:49
最近の情報は、こちら!
URLリンク(gauc.no-ip.org)
32:デフォルトの名無しさん
07/07/14 08:27:58
鬼車awkを誰か作ってくれないかなー
33:デフォルトの名無しさん
07/07/15 03:17:40
>>32
いいこと言うねぇ。
賛成!
34:デフォルトの名無しさん
07/09/03 08:59:45
あとローカル変数が欲しいな
35:デフォルトの名無しさん
07/09/03 10:30:14
functionの中はローカル変数になるよ。
36:デフォルトの名無しさん
07/09/04 00:12:17
いつから?未だに引数に並べるもんだと。
37:デフォルトの名無しさん
07/09/04 09:33:02
あー、ごめん、引数並べたやつがローカル変数になる。だった。
先に宣言すればいいんだから別によくね?
38:デフォルトの名無しさん
07/09/09 04:42:02
キモいやん。そのやり方。
39:デフォルトの名無しさん
07/09/14 04:37:24
これからawkを勉強します。
40:デフォルトの名無しさん
07/09/14 09:05:13
awkを学ぶことになるでしょう。
41:デフォルトの名無しさん
07/09/15 01:03:04
みなさんawkは語らないのですね。
42:デフォルトの名無しさん
07/09/15 10:28:44
船頭awkして船山に登る。
43:デフォルトの名無しさん
07/09/16 03:03:51
人に言えるほどawk知ってる訳でも無いし
44:デフォルトの名無しさん
07/09/16 10:27:22
だけど人の話は聞きたいし
45:デフォルトの名無しさん
07/09/17 18:12:15
awkぼ利通
46:cat.awk
07/09/19 08:55:44
1
47:デフォルトの名無しさん
07/09/19 16:41:49
awkを勉強しているのですが、Perlに慣れているからか
awkでできることはPerlでワンライナーでやったほうが(少なくとも自分にとっては)速い気がしてなりません。
これについてawk熟練者である皆様はいかがお考えになりますか?
こういう時はawkのほうが便利!という例にはどんなものがありますか?
48:デフォルトの名無しさん
07/09/19 16:43:11
↑あっ速いというのは、コードを書くのが速いという意味です。
49:デフォルトの名無しさん
07/09/19 16:48:06
>>47
perl はなくても awk なら入っている事がある
50:デフォルトの名無しさん
07/09/19 16:53:58
「コードを書くのが速い」という基準で、
「こういう時はawkのほうが便利」という例を他人に挙げさせても、
それはその人間にとっての速い気がする便利さであって、
意味のある一般的な議論にならないのではないか?
51:デフォルトの名無しさん
07/09/19 16:57:51
PerlもRubyもPythonも使うけど、特定のカラムだけに興味があるケースは
無意識にawkを使うこともある。
perl -a とか cutしてpasteとかもあるけど。
52:デフォルトの名無しさん
07/09/19 18:19:27
>>49 環境によらず入っているということですね。
>>50 そうですね。
なぜawkなのか、
一般的にはどういう時にawkが使われるのか、
というのがイマイチ自分のなかで分かっていないのです。
>>51 少し勉強した限りでは、確かにカラムの取り出しはawkが便利なのかもと思いました。
53:デフォルトの名無しさん
07/09/19 19:55:33
>>52
シェルスクリプトの中で、貧弱なシェルの計算能力を
補うために、ツールボックスの一つとして使われることが多い。
ので、シェルスクリプトを書く機会が多いのなら、やっておいて
損は無いと思うが、フットプリントが多少デカイこととやや移植性に
欠けることを気にしなければ、別にPerl使ったっていいわけだ
(どうせ今なら大抵は使えるだろうし、awkにしても一応Posix標準だが
色々変種がある)。
ま、単に便利なスクリプト言語が欲しいだけなら、今更awkをやる意味は
ほとんどないだろう。
フィールド分割だけならperl -aでawkの真似ができるしな。
54:デフォルトの名無しさん
07/09/19 20:06:52
>>53 丁寧なお返事ありがとうございます。
シェルの計算の補助ですか。
シェルスクリプトを書く機会は多少はあるので、多少は覚えておこうと思います。
55:デフォルトの名無しさん
07/09/19 21:00:04
awkとperl、処理速度はどっちが速いんだろ?
ってオマエが試せって言われそうだけどふと思ったんで書いてみた。
56:デフォルトの名無しさん
07/09/19 22:17:45
awkは処理系多いからなぁ
何の処理かにもよるだろうし
57:デフォルトの名無しさん
07/09/19 23:45:00
どちらも得意とする単純なテキストのフィルタリング処理なら、
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:デフォルトの名無しさん
07/09/19 23:51:16
PerlにたいするAwkの現実的メリットはメモリ消費が少ないことくらいで
これは今の計算機では微々たる問題だ。
ESRのArt of UNIX Programmingを立ち読みしたら
Awkがメモリ節約のために仕様を制限したことが
早期に競争力をなくした理由と論じていた。
バッドな言語設計の見本って感じで、ちと不愉快だった
59:デフォルトの名無しさん
07/09/22 02:28:36
>>57
俺も時々やる。
その時は便利!と思って.cshrcとかにalias登録するけどすぐに忘れて同じ内容を手打ちしてたりする
その挙句にこれは便利!と思って.cshrc開くと既に登録してあるという…
60:デフォルトの名無しさん
07/09/22 09:21:37
>>59
全俺が共感した。
61:デフォルトの名無しさん
07/09/24 12:01:33
(.cshrcを.bashrcに置き換えて) 俺も同じ経験がある。
62:デフォルトの名無しさん
07/09/28 00:37:50
「一行野郎」は名訳
63:デフォルトの名無しさん
07/09/28 01:20:24
むかし、「読書するプログラマ」をよんで、awkで会計をするのがかっこ良いと
おもってました。
でも確定申告をする身になったらEXCELを使っている。
「エンジニアのための事務作業 sed awk grep そしてTex」なんて書籍があれば食いつくのに...
64:デフォルトの名無しさん
07/09/28 02:53:12
awkで会計用スクリプトを書くより、会計のしくみを理解することの方が
俺には遥かに難しい
65:デフォルトの名無しさん
07/09/28 14:47:04
Perlだけど、これは?
URLリンク(www.moge.org)
66:デフォルトの名無しさん
07/10/02 02:19:46
Perl はコード一目見て俺がcore吐きそうになる
67:デフォルトの名無しさん
07/10/02 07:50:30
任意に core が吐けたら便利だよな。日記代わりになる。
68:デフォルトの名無しさん
07/10/02 08:00:10
>>67
体型維持のために余儀なくされている人もいたようです。
指を喉に入れるようにするので、俗に言うげろだこが指にできます。
69:デフォルトの名無しさん
07/10/03 23:18:59
awkってなんでPerl風に正規表現置換できるようにならんの。独自拡張でもいいんだけどな。
70:デフォルトの名無しさん
07/10/04 02:48:29
>>69
ん、くわしく。
Perlのメタ文字を使いたいというのとは違うの?
#使えんわけだが
71:デフォルトの名無しさん
07/10/04 21:53:48
awkはDFAでperlはNFAだっけか?
72:デフォルトの名無しさん
07/10/05 02:45:00
>>71
オリジナルではね。
中にはNFAを使っているawkもある。mawkとか。
73:デフォルトの名無しさん
07/11/22 06:36:33
xgawkで多倍長整数を使いたいんですが、
printf( "%ld\n", num );
では桁数は増えても精度は上がってないようです。
型宣言するにはどうするのでしょうか
74:デフォルトの名無しさん
07/11/22 07:17:23
>>73
多倍長整数を実装するのに個別の精度を上げてどうする。
75:デフォルトの名無しさん
07/11/22 07:34:48
xgawkは多倍長整数あるんですよね?
で、rubyのように無宣言で使えるかと思ったらそうではないらしいので、
どうするのかと。
URLリンク(home.vrweb.de)
いまこのへん見てるんですが
76:デフォルトの名無しさん
07/11/22 08:47:49
MPFR,多倍長整数ではなく実数かな。
ググって見つけました。
URLリンク(www.kt.rim.or.jp)
URLリンク(golf.shinh.org)
実はこれやってるんですが。
あとはdllのパスが分かれば・・・
77:デフォルトの名無しさん
07/11/26 21:13:28
>>76
「あなごる」の xgawk は MPFR 積んでないと思うが・・・。
78:デフォルトの名無しさん
07/11/29 08:00:03
そうですか
どちらにしても実数って事はやっぱ無理な気がしました
79:デフォルトの名無しさん
08/01/04 07:28:20
sedみたいに、パターン部分を行番号で指定出来ませんか?
80:デフォルトの名無しさん
08/01/04 09:32:19
>>79
awk 'NR == 79 {print;}'
ってこと? それとも、
awk 'FNR == 79 {print;}'
ってこと?
81:デフォルトの名無しさん
08/01/04 14:24:54
>80
はじめsedみたいに 10,35{ みたいな感じに書いてダメだったので; }
普通に比較式書くんですね。10<=NR&&NR<=35{ で出来ました; }
ありがとうございます。
82:デフォルトの名無しさん
08/01/05 00:50:26
>>81
もう少し sed らしくしたいなら、
10==NR, NR==35 { print }
なんてのもあり
83:デフォルトの名無しさん
08/01/14 09:02:50
awk はオプションなしだとワンライナーのコードを書くことになると思いますが
実際 awk のワンライナーってどんな時に使いますか?
あまり見たことがなくて…
84:デフォルトの名無しさん
08/01/14 09:45:08
>>83
UNIXでは多くのファイルや出力が欄区切りテキストの形式になっているから
その場使い捨てワンライナーが本来の使い方なんだけど、
他のOSだと BEGIN を main 代わりに使うようなのばっかになるかもね。
85:デフォルトの名無しさん
08/01/14 09:46:06
>>83がsedをどう使っているのか気になる。
sedスクリプトファイルとか作って、スクリプトの引数に処理対象のファイルを渡してたりするのかな。
86:デフォルトの名無しさん
08/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でいいけど、近似を見るには使えないんで。
87:デフォルトの名無しさん
08/01/15 18:34:44
>>85
sedは単体の命令を見て「置換」「行の切り捨て」みたいな用途が
パッと見て思い付くので疑問は沸かないんです。
awkはひとつひとつの命令を見ても
普通にスクリプト言語の命令としか思えないので
「コード書くならともかく、ワンライナーでどう使うの?」と
疑問をもってしまうんです。
>>86
う~ん、結構複雑になりますね。
それだと私ならターミナルに書かずに
コードに起こしてしまいそうです。
でも、パターンとフィールドを上手く使えば
色々出来る気がしてきました。
例をありがとうございます。
88:デフォルトの名無しさん
08/01/15 18:59:18
あ、コード書きそうなのは後者です。
平均とか合計みたいなモノには良さそうですね。
89:デフォルトの名無しさん
08/01/15 19:28:50
今日書いた一行野郎。
--
awk '{for (ic = 1; ic <= NF; ++ic) {if (max < $ic) max = $ic;}} END {print max;}'
--
これも全フィールドに拡張しているだけで、単に最大値を得ているだけだね。
90:デフォルトの名無しさん
08/01/22 16:52:32
よく書く一行
du -k|awk '$1 > 10000'
でかいデレクトリをさがす
91:デフォルトの名無しさん
08/01/29 23:34:51
俺がよく書く一行野郎
$ awk 1 > hoge.sh
92:デフォルトの名無しさん
08/01/31 12:58:14
>>91
それに何の意味が?
cat > hoge.shでも事が足りそうだが。
93:デフォルトの名無しさん
08/01/31 18:48:07
>92
Windowsにawk入れてた時に、こんなヘンな癖が付いてしまった。
94:デフォルトの名無しさん
08/02/02 12:38:28
すみません、初心者ですが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:デフォルトの名無しさん
08/02/02 13:01:48
それを動かすにはまず gawk をどこかから入手する。
96:デフォルトの名無しさん
08/02/02 17:48:45
>>94
>↓のソースを書いていただいたのですが、
書いた人に聞く。
と答えると、わけのわからん理由を言ってごねるだろうから、
先に言っとくと、そんな見苦しい言い訳するな。
どうせ答えたって、今度は○○がわかりませんとか言い出すんだろ?
どっかからgawkを落として展開しろよ。全く、一生ググってろよカス
"C:\Program Files\WinRAR\UnRAR.exe" lt *.rar | "gawkのフルパス" -f rr.awk
97:デフォルトの名無しさん
08/02/10 19:16:33
すいません、あるテキストを{print $1,$2}として抽出して
aaa 1
aaa 2
aaa 3
bbb 1
bbb 2
ccc 1
ccc 4
...
とまではできたんですが、並んでいるデータをそれぞれ、
aaa 6
bbb 3
ccc 5
と集計したいんですが、どのようにすればいいでしょうか?
98:デフォルトの名無しさん
08/02/10 19:28:07
awk '{count[$1] += $2;} END{for (aaa in count) {print aaa count[aaa]}}'
あとはソートすればいいはず
99:97
08/02/10 20:22:03
>98さん、ありがとうございます!
情けないのですが、今まで便利なツールに頼っていて全然コマンドについて理解できていなかったので困っていました。
実はメールログで送信者がどれだけの通数を送信してるかを確かめるためにコマンドでできないか、で>97でつまづいていました。
何とか途中までできたんですが、非常にスーパーエレガントな1行コードでして…。
質問ついでで申し訳ないのですが、
(aaa in count) {print aaa count[aaa]}
のaaaについてはどう解釈すればいいのでしょうか?
100:デフォルトの名無しさん
08/02/10 20:33:27
>>99
bashとかのforとかと同じで適当な文字列ならなんでもいいです.例に出てきたaaaなんかにするからややこしくなってすみません.
for(hoge in list) {...}
で配列listのキーを片っ端からhogeに入れてループするって意味になるはずですよ.
101:デフォルトの名無しさん
08/02/10 20:36:22
98じゃないけど
awk '{count[$1] += $2;} END{for (i in count) {printf "%s %i\n", i, count[i]}}'
こうやって書けばしんせつじゃね?
データの中のaaaとloopカウンターのaaaを同じ名前にするのは意地悪だと思うよ
102:デフォルトの名無しさん
08/02/10 20:37:23
101です。すまんonz
103:≠98
08/02/10 20:39:44
あー、みんな書いているから私の書いたのは大幅に削るか。
そのENDブロック内は、
for (制御変数 in 連想配列) {...;}
というパターン。
その前段のcount[$1] += $2は一行目のとき
count["aaa"] += 1と解釈される。以下同様に。
このcountが連想配列として使われているということ。
104:デフォルトの名無しさん
08/02/10 20:42:05
>>101
…反省してます
いや,ほら,ついいつものクセで…ごめん
105:97
08/02/10 20:52:15
いえいえいえいえ…そういう意味じゃなくて教わっていながらすいませんです。
上記で書いたとおり便利ツールに頼り切ってて殆ど知らない私が悪いのですが…。
今一生懸命3byte程度の脳みそで勉強してるんですが、2日目で挫折しそうで質問させて貰いました…。
たとえばログには
Feb 9 22:44:40 localhost postfix/qmgr[1936]: 345C48C0154: from=<use1@example.com>, size=556, nrcpt=1 (queue active)
と必ず出ます。で、
1,生ログをそのまま処理するのが怖い(大きなファイル)ので、日付でログを抽出して別ファイルへ保存。
2,grepで nrcpt=と抽出して、さらにgrep -vで除外するドメインを指定して抽出
3,そしてsedでnrcpt=を削除して
4,ここで>97のように$7と$9を並べたところで脳みそのバッファエラーを起こしました。
この処理の方法もエレガントなことは分かっていますが、恥は承知でお伺いした次第です…。
106:デフォルトの名無しさん
08/02/13 07:31:34
gsubで[.*]を置き換えるにはどうすればいいでしょうか?
107:デフォルトの名無しさん
08/02/14 02:38:02
>>106
それはリテラルとして扱ってということかい?
なら全部エスケープすればいいと思うが何か問題があるの?
108:デフォルトの名無しさん
08/02/16 01:08:44
awkで現在時刻からn分前から以降のログだけを抜き出したいんですが、どうすればいいでしょうか…。
02 15 12:34:56 xxxxxxxxx
02 15 13:45:01 xxxxxxxxx
...
...
...
とかの形式なので、strftime()とかで現在とログの時刻を比較して抜き出す、とかを試したんですがダメでした…
109:デフォルトの名無しさん
08/02/16 01:49:16
>>108 これで駄目かな?(一応 gawk 3.0.4 では動いた)
BEGIN{
n=5
basetime=strftime("%m %d %H:%M:%S", systime()-60*n)
}
{
chktime=substr($0, 1, 14)
if(chktime >= basetime) print
}
110:デフォルトの名無しさん
08/02/16 02:23:28
>109
ありがとうございます…素直に目が鱗でした…。
> chktime=substr($0, 1, 14)
なんですね…
perlが使えない環境なので、これが分かればいろいろ流用効くので助かりました。
ありがとうございます。もうちょっと精進します。。。
111:デフォルトの名無しさん
08/02/18 18:58:36
>>29
昨年6月に「AWKを256倍使うための本」が本屋の書棚にあったので買いました。
奥付に
1993年8月21日初版発行
2007年5月9日 第1版第16刷発行
と書かれています。
112:デフォルトの名無しさん
08/02/18 22:32:44
>>111
いつのレスにレスしてんだ(w
モレも買ったけど、まだ大きな本屋で見かけるね。
113:デフォルトの名無しさん
08/02/19 02:59:17
>2007年5月9日 第1版第16刷発行
本屋の棚で眠り続けてたってわけじゃないのかw
114:デフォルトの名無しさん
08/02/24 00:57:13
目が鱗 に一致する日本語のページ 約 1,920 件中 1 - 20 件目 (0.24 秒)
115:デフォルトの名無しさん
08/02/24 01:00:56
メガ鱗
116:デフォルトの名無しさん
08/03/28 21:53:28
sed, awk, ruby を使う。
それぞれ適材適所で使うけど、
「sed だけ」「awk だけ」で済ませられると、
不思議な喜びを感じる。
117:デフォルトの名無しさん
08/03/30 14:05:33
>>116
うち、AIX使ってるんでksh+sed+awk+perlだな。
rubyが標準でインストールされてる環境ってあんまないと思う。
118:デフォルトの名無しさん
08/03/30 16:22:26
古いサーバだとPerlすら入ってない事があるからawkは重宝する。
119:デフォルトの名無しさん
08/04/06 10:26:45
最近のgawkがネットワークにも使えると知ってちょっと驚いたw
カーニハンの本レベル(とか256倍)しか知らない人って多いと思う。
120:デフォルトの名無しさん
08/04/06 12:44:41
ノーマルのawkでXMLを字下げしたりしてうまく表示させるにはどうすればいいのかな・・・
121:デフォルトの名無しさん
08/04/06 17:09:18
sedだけで書けると、俺って頭イイかもって思う。
#!/bin/sed -f
122:デフォルトの名無しさん
08/04/06 17:16:17
文字列の単純な置換だけならawkより簡単に書けるんだけど。
awkに固執しないで臨機応変にsedを使うって意味でなら要領がいいという意味で賢いけど。
# awkで書いた方が簡単なことをsedで頑張って書いたのだとしたら、その意味では頭悪いなw
123:デフォルトの名無しさん
08/04/06 17:34:45
awkからsystemでsed呼ぶことは時々あるw
124:デフォルトの名無しさん
08/04/06 18:49:04
>>24
awkって表計算のような処理に特化してますよね。
その点が非常にユニークというか事務処理の言語だな、と。
visicalc(1979)awk(1977)ですからawkのほうが若干古いんですが、
表計算はセルに直接式を書くという発想が新しかった。うむむ。
125:デフォルトの名無しさん
08/04/06 19:26:56
VisiCalcの考案者Dan Bricklinによるアイデアの説明
URLリンク(www.danbricklin.com)
Danの電卓がHPじゃなくてTIなのが意外な感じ。
The idea for the electronic spreadsheet came to me while I was a student at the Harvard Business School, working on my MBA degree, in the spring of 1978.
Sitting in Aldrich Hall, room 108, I would daydream.
"Imagine if my calculator had a ball in its back, like a mouse..." (I had seen a mouse previously, I think in a demonstration at a conference by Doug Engelbart, and maybe the Alto).
And "..imagine if I had a heads-up display, like in a fighter plane, where I could see the virtual image hanging in the air in front of me.
I could just move my mouse/keyboard calculator around, punch in a few numbers, circle them to get a sum, do some calculations, and answer '10% will be fine!'"
(10% was always the answer in those days when we couldn't do very complicated calculations...)
126:デフォルトの名無しさん
08/04/07 02:52:10
はじめましてgawkの質問です
お手すきの時にでもご解答頂けましたら助かります
2chでお話していただいた方からgawkを教えて頂きました
正規表現でマッチした部分がいくつあっても全ての箇所を1アクションで保存できる優れものです
当方、言語は全く知らないので先ほどまでテスト実行しては驚いていました
この優れものを今後末永く使っていきたいのですが
下記の事項をググって見たのですがわかりませんでした
どなたかわかる方おられましたら教えて下さい
私のやりたいこと
・EUCを読み込んでS-JISを出力
・既存のテキスト末尾に追加書き込み保存
(教えて頂いたスクリプトは上書き保存なので出力先の内容が消えてしまいます)
気長に待っていますので何卒よろしくお願い致します
127:デフォルトの名無しさん
08/04/07 03:10:31
>>126
前者はawkでやるべきことではない。iconv, nkfなどそれ専用のツールがある。
後者も必ずしもawkは不要。コマンドラインが使える環境なら普通にできる。
例えば、Unix系なら cat append.txt >> original.txt で既存のファイルに追加できる。
DOS系でも、type append.txt >> original.txt でできる。
要は、awkのいいところはそれ単体でなんでもできる(或いはできない)ことではなく、
コマンドライン環境で力を発揮するツールであること。
例えば、正規表現でマッチした文字列を置換するだけならテキストエディタでもできる。
あーそうそう、エディタがあれば文字コードの変換もそれだけでできる。
所謂テキストエディタを使ったことがないなら、一度(正規表現検索機能、
文字コード変換機能のある)テキストエディタを触ってみるといいかもしれない。
128:デフォルトの名無しさん
08/04/07 03:32:54
>>127さん
>>126です
お疲れのところ早々のご解答誠にありがとうございます
コンバートは別のツールで行う
DOS環境ではtype append.txt >> 出力先ファイル名で追加書き込み
了解しました
エディターは秀丸エディターを使っています
コンバートは出来るのですが検索でマッチした文字列は1箇所ずつコピーなんです
sakuraエディターで一括コピーや切り取りが出来ると教えてくれた方もいてたのですが
sakuraエディターは試したことが無いんです
詳しくありがとうございました
129:デフォルトの名無しさん
08/04/07 03:56:33
AAA.txtを開き”東京(.+?)号室”を検索する
マッチした複数箇所を一括でコピーしてTEST.txtにペーストする
BBB.txtを開き”東京(.+?)号室”を検索する
マッチした複数箇所を一括でコピーしてTEST.txtの末尾にペーストする
CCC.txtを開き”東京(.+?)号室”を検索する
マッチした複数箇所を一括でコピーしてTEST.txtの末尾にペーストする
よろしくお願いします
130:デフォルトの名無しさん
08/04/07 04:02:07
>>127は結局awkの解答はしないのになんでしゃしゃり出てきたの?
できないじゃん
131:デフォルトの名無しさん
08/04/07 06:48:34
>>130
質問に具体性がないから一般論を書いただけだけど。
>>129
awk '/東京(.+?)号室/ {print > "TEST.txt";}' AAA.txt
awk '/東京(.+?)号室/ {print >> "TEST.txt";}' BBB.txt
以下同様に。
132:デフォルトの名無しさん
08/04/07 12:02:34
>>131
レスありがと
gawk '/東京(.+?)号室/ {print > "TEST.txt";}' AAA.txt
gawk '/東京(.+?)号室/ {print >> "TEST.txt";}' BBB.txt
ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。
gawk3.16では使えない?
133:デフォルトの名無しさん
08/04/07 13:29:56
>>132
DOSのコマンドラインの使い方は他所で聞いてくれ。
134:デフォルトの名無しさん
08/04/07 13:38:24
役所の窓口みたいな対応だな。
135:デフォルトの名無しさん
08/04/07 13:43:47
DOSのコマンドラインについては多くを知らないんだよ。
136:デフォルトの名無しさん
08/04/07 16:36:42
DOSの場合は空白を含む場合シングルクォートじゃダメだからな。
ダブルクォートで括って中のコードは
シングルクォートか、エスケープしてダブルクォート入れるか。
一番簡単なのは、ワンライナーでもファイルに起こしてしまうこと。
gawk -f myscript.awk AAA.txt
とやってしまえば、シングルクォートとかダブルクォートとか気にする必要はない。
137:デフォルトの名無しさん
08/04/07 18:22:15
>>132
二つ問題がある。
gawkの正規表現では.+?というのは使えない。
cmd.exeでは、シングルクォートを引数を
くくるのに使えない。
なんかよくわからんが、perlでテキストを丸飲みしてから
処理すればいいんじゃないのか?
138:デフォルトの名無しさん
08/04/12 19:00:42
VisiCalc といえば、出始めの頃に TRS-80 用 を Radio Shack で見せてもらったんだけど、学生だった私には価値がわからなかったなぁ。
まぁ、これに限らず、『なんでこんなコマンドやオプションがあるんだ?』ってのは多い。
使い方じゃなく、なぜそれがあるのかを包括的に解説した本や web site ってありますか。(たとえば多くの unix コマンドを網羅しているとか)
139:デフォルトの名無しさん
08/04/12 19:01:22
ああ、スレ違いだった。ごめんごめん。
140:デフォルトの名無しさん
08/04/12 19:58:47
なんという誤爆
141:デフォルトの名無しさん
08/05/06 02:42:04
>>132 もう居ないかな。gawk3.1.6 + nkf2.0 使用@cmd.exe
C:\work>type aaa.txt (※EUCなので化ける事を確認)
、ロ、イ、ロ、イ
ナ・ケ貍シ
ナ・」イケ貍シ
ナ・」ア」ーケ貍シ
ナ・、ロ、イケ貍シ
ナ・、ユ、ャケ・ナ・ユ、ャケ貍シ
ナ・」ウケ貍シ、ネナ・」オケ貍シ
C:\work>nkf -Es AAA.txt
ほげほげ
東京号室
東京2号室
東京10号室
東京ほげ号室
東京ふが号
東ふが号室
東京3号室と東京5号室
C:\work>nkf -Es AAA.txt| gawk "/東京.*号室/{print $0}"
東京号室
東京2号室
東京10号室
東京ほげ号室
東京3号室と東京5号室
既出の通り文字変換nkf(>>127) 正規表現の制約で条件変更(>>137)
実際に使う場合はこんな感じでバッチ作るとか。
C:\work>nkf -Es AAA.txt| gawk "/東京.*号室/{print $0}" >>TEST.txt
142:141
08/05/06 02:56:02
と、方法を書いておいてアレだけど、
秀丸使ってるならgrepの実行で検索するファイルに(現在の内容)で
検索結果からファイル名と行番号を除去するのでもできそうな気がする。
盛大にスレ違いだけど。
143:デフォルトの名無しさん
08/05/06 14:28:43
>>142さん
ありがと
まだ思うようにできていないんだ
参考になるよ感謝です
144:デフォルトの名無しさん
08/06/16 01:50:26
ひでえwwwwwwwwwwwwww
145:デフォルトの名無しさん
08/06/16 01:50:57
すまん誤爆
146:デフォルトの名無しさん
08/06/25 02:17:58
質問です!
以下のファイルhogeからawkで、価格を抜き出して合計値を出したいと思っています。
ファイルの内容は、書籍名と価格です。価格は一番後ろの数字になります。
----------------------
$ cat hoge
それいけ!あんぱんまん 1000
メタボリックを撃退せよ 1000
下流社会 1000
上流社会と下流社会 日本のこれから 1000
論文 2008 日本の抱える問題 1000
論文 2007 日本の抱える問題 過去問題集 1000
----------------------
難しいのが、書籍名の2008や2007などの数値が含まれていることや空白が含まれていることです。
1行目の場合2列目が価格になりますが、2行目の場合4列目が価格となります。
このように一番最後の列(価格)を取得し、合計値を計算するにはどうすればよいでしょうか?
ご教示お願いいたします。
147:デフォルトの名無しさん
08/06/25 02:28:00
awk '{x+=$NF}END{print x}' hoge
148:デフォルトの名無しさん
08/06/25 09:33:15
xじゃなくてsumとかにしようよ。
149:デフォルトの名無しさん
08/06/25 13:36:51
一行野郎は手数(打数)重視なんじゃまいか
150:デフォルトの名無しさん
08/06/25 15:27:28
難しいってマニュアル読めば最後の要素を指すものが何か書いてあると思うが
151:デフォルトの名無しさん
08/06/25 16:09:13
読んでたら他人になんか聞きません。
152:デフォルトの名無しさん
08/06/25 16:34:16
じゃあ、マニュアル読んでもわからなかったらお手上げか
153:デフォルトの名無しさん
08/06/29 21:37:04
Windows 版の gawk-3.1.5 で`双方向パイプがうまく動作しません。以下、
URLリンク(www.kt.rim.or.jp)
からのサンプルファイルですが、途中で止まってしまって、返事が返ってきません。
BEGIN {
command = "sort"
n = split("abcdefghijklmnopqrstuvwxyz", a, "")
for (i = n; i > 0; i--)
print a[i] |& command
close(command, "to")
while ((command |& getline line) > 0)
print "got", line
close(command)
}
Cygwin の gawk では問題ありませんでした。
154:デフォルトの名無しさん
08/07/01 20:42:14
これ使うといいよ
URLリンク(www.pipeunish.jp)
155:デフォルトの名無しさん
08/07/02 01:35:15
どうやったら Cygwin の gawk(GNU Awk 3.1.6) で print length("あいう") が 3 になるのですか?
156:デフォルトの名無しさん
08/07/02 02:13:54
Windowsのバージョンくらい書こうな。でないと釣りと思われるよ
157:デフォルトの名無しさん
08/07/02 08:51:57
jgawk?
158:デフォルトの名無しさん
08/07/02 09:32:16
gawk.dllって、まだ誰かメンテしてくださってるんでしょうか?
最新版gawkのdllを探してるんですが、見つかりません。
または、ソースのtar.gzからdllを作る方法が載っているページを
御存知の方がいらっしゃいましたら、教えていただけると助かります。
159:デフォルトの名無しさん
08/07/02 10:34:53
なにをいってるのかわからん
ソースのtar.gzってなに?
160:デフォルトの名無しさん
08/07/02 10:42:47
URLリンク(ftp.gnu.org) からダウンロードできるgawk-*.tar.gzのことですが。。
sourceからgawk.exeを作ったりしないのですか??
dllと書いているのでわかるかとは思いますが、
windows環境下での話です。普段はcygwinでmakeしたgawkを使っているのですが、
dllがあると他の言語から呼び出して使えるので便利かなーと思ってます。
161:デフォルトの名無しさん
08/07/02 10:45:49
cygwinはwin用のソースじゃないから
win用のソースがいる
162:デフォルトの名無しさん
08/07/02 11:53:32
>>160
昔あったDLL版は作者が独自に作ったものみたいで
本家に反映されてないから本家のソースからDLLを作るのは無理。
DLL版のソースを参考にして自力で作るか
できないなら作者に連絡して協力を求めるしかない。
163:デフォルトの名無しさん
08/07/02 12:05:07
>>160
自分で改修するしかないだろ
164:デフォルトの名無しさん
08/07/03 02:36:53
(ノ∀`) アイタタタ
165:155
08/07/05 15:47:31
>156
XP [Version 5.1.2600] でつ
166: [―{}@{}@{}-] デフォルトの名無しさん
08/07/05 17:55:22
>>153
まだ見てるか?
多分なおってると思うんで新しいので試してみてくりや。
167:デフォルトの名無しさん
08/07/06 06:36:13
うお?
作者降臨か
168:デフォルトの名無しさん
08/07/06 07:02:21
すんばらすぃ
169:デフォルトの名無しさん
08/07/20 00:40:48
AWK 使って15年? 30年前のコードが吐き出すデータをちょこっと処理しようとして…
FS=/[ ()]+/ は期待通りの動きをせず、FS="[ ()]+" と書かねばならない。
初めて知った。
検索しても、これについて明快に書いてあるページがなかなか見つからなかったが
>正規表現定数がそれ自身として現れたとき、それはパターン中に現れたかのように、
>つまり`($0 ~ /foo/)' のようにみなされる。
<中略>
>言語のこの機能は、POSIX標準までドキュメント化されなかった。
orz
これで1時間ぐらいムダにした。私が知らなかっただけですか??
170:デフォルトの名無しさん
08/07/20 00:58:40
『プログラミング言語AWK』には一応載ってるけどな
> (FSに代入される)文字列が1文字より長いときは,正規表現として扱われる
171:デフォルトの名無しさん
08/07/20 01:10:48
ベル研系統の言語は記述の自由度はあるが挙動がつかみづらい
172:デフォルトの名無しさん
08/07/20 02:09:53
>>170
””で囲んだ文字列が正規表現として扱われる ということと
//で囲んだ正規表現定数で書いてはいけない ということは同じではない。
実際、split関数の 第3引数に与える正規表現は どちらでも動く
むむむ、ここでは($0~/foo/)に置き換えて評価されないんだ…
171の意見が正しいようだね チャンチャン
173:デフォルトの名無しさん
08/07/21 12:39:44
複数のファイルの読み込みってできますか?
print ファイル1の$2 ファイル2の$1
みたいな感じで
174:デフォルトの名無しさん
08/07/21 13:06:32
>>173
pasteで繋いじゃダメ?
私はよくやるけど。
仮にファイル1が5カラム固定なら、
paste ファイル1 ファイル2| awk '{print $2 $6;}'
てな感じで。
# カラム数可変ならもう一捻り必要だけどね。
175:デフォルトの名無しさん
08/07/21 13:50:02
>>173
awkだけでやりたいならgetlineを使えばできる。
176:デフォルトの名無しさん
08/07/22 18:37:52
awkすごい便利で、gnuplotと組み合わせてExcelから解放されつつあります。
上の方にあったDFAとNFA使ってる事からくる違いってなんですか?
177:デフォルトの名無しさん
08/07/23 02:40:07
>>176
一番の違いは、DFAだと後方参照ができないことかな。
とりあえず
DFA
前準備に手間を掛けるけど処理そのものは早い
NFA
即座に処理を始めるけど、処理に時間がかかる場合がある。
ぐらいに考えておけばいいと思う。
178:デフォルトの名無しさん
08/08/02 00:57:57
保守
179:デフォルトの名無しさん
08/08/02 14:34:05
sh + awk は明らかに簡単だと思う。
sh + awk で出来ることを perl のみで記述する人の気持ちがどうしても理解出来ない。
ただ、ネットワークプログラミング以上になるとC, perl, ruby にならざるを得ないけど。
マシン単体での種々の手続き記述だと、
sh + awk がやっぱり一番完結になると思うんだけどな~。
180:デフォルトの名無しさん
08/08/02 14:49:58
おれもawkでできることならawkでやる。
でもあまりにトリッキーなことになりそうだったらperlでやったりするかな。
181:あいちゃん
08/08/03 01:39:18
人に渡す可能性があるなら、awkは結構つらいことがある。
Perlでやれば基本的に問題ないから、Perlで書く癖がつく。
ShellScriptでいったん使うだけなら、awkは便利だけど。
182:デフォルトの名無しさん
08/08/04 01:23:58
>>180
俺も AWK でできるならAWK。
と考えると バイナリーのデータいじる以外はAWKでできるのでは…
(少なくとも 俺に日常のニーヅでは そうだ)
183:デフォルトの名無しさん
08/08/04 02:16:24
>>182
同感。ただバイナリは仕方ないにしても、
全半角混在の固定長フォーマットが扱いにくいんだよな。
ASCIIにすると全角のみ部分が処理しにくいし、
SJISとかにすると正しく切り出せないし・・・
あれはなんとかならんものかな。
184:デフォルトの名無しさん
08/08/07 01:55:09
やっぱり ASCII だけの問題にしておいた方が無難。
185:デフォルトの名無しさん
08/08/11 15:38:13
URLリンク(www.kt.rim.or.jp)
でダウソできるのがASCIIとSJISをうまく扱えるやつぢゃねの?
186:デフォルトの名無しさん
08/08/13 00:38:23
>>185
いや、そのgawk使ってるけど、全半角混在の固定長は困るはず。
両方別々なら問題なく扱えるけど、同時には扱えない。
例えば。SJIS1行5バイト+改行の固定長ファイルで
1行は2項目(a:全半角混在4バイト b:半角のみ1バイト)のファイルがあるとき。
asciiモードならa, bを切り分けられるがaの全角文字は処理できない。
sjisモードならa, bを切り分けられない。
悩ましいのは、項目を切り分けるスクリプトをascii オプションで起動して
出力結果をsjisで処理すれば(めんどくさいけど)現状で処理できてしまう。
ので、マニュアルに書いてある通り、作者をおねがいすれば可能性はあるかもしれないが、
お願いするのが躊躇われる感じなのね。
187:デフォルトの名無しさん
08/08/13 22:12:09
awkは時代の関数だから使われなくなっていくんだろなあ
188:デフォルトの名無しさん
08/08/15 02:08:00
UTF-8の場合でも固定長は半角幅しか対応できてない。
文字数とバイト数と表示幅とか、日本語は面倒だのう。
length()とかでバイト数を拾えないから自前で処理もやりにくい。
189:デフォルトの名無しさん
08/08/19 22:37:59
>>188
一瞬納得しかけたけど。
冷静に考えると、そもそも1文字が可変長であるUTF8を
固定長ファイルの文字コードに使おうと考えた奴を締め上げて
泣くほど問い詰める方が先だと思うのは俺だけ?
考えても考えてもメリットが思いつかないよ…
190:デフォルトの名無しさん
08/08/21 00:40:10
>>189
ほとんどの文字コードが可変長だからなあ。
相対的に見ればマシな方に入るんじゃない?
ホストが絡むと文字コード周りは悲惨だよ…
ホストじゃないならそもそも固定長じゃなくて良いんだけどね。
191:デフォルトの名無しさん
08/08/23 01:53:25
あるフィルタスクリプトをgawkで書いているのですが
文字のコードを整数値に変換しようとしてうまくいきません
たとえば「c」という文字のコードを整数値にしようとして
BEGIN {
testChar = "c";
printf("testChar=%d\n",testChar);
}
のようにしても「testChar=0」と表示されてしまいます
良い方法があればお教えください
192:デフォルトの名無しさん
08/08/23 03:21:15
>>191
awklib に ord ってユーザー定義のライブラリ関数があるからそれを使う。
自前で作ってもいいけどね。
くわしくは info gawk で調べて。
193:191
08/08/23 03:28:08
>>192
ありがとうございます
早速検討してみます
194:191
08/08/23 10:56:41
>>192
URLリンク(www.kt.rim.or.jp)
にあったものを試してみました.期待どおりの動作をしてくれます.
どうもありがとうございました.
195:デフォルトの名無しさん
08/09/15 01:12:37
入力内容をawkで生成することは出来ますでしょうか
もしくはBEGIN等のブロック内で文字列を生成して
その文字列のパターン毎に分岐、フィールドを使っての処理
(要はawkに入力ファイル渡した時に簡単に書ける処理)
を簡単に書くことは出来るのでしょうか
例えば…どんな処理が適切な説明か判りませんが
BEGIN{for(i=0;i<10;i++) print int(rand()*10),int(rand()*10),int(rand()*10)}
の結果に対して
$1+$2+$3<10{ print $1+$2+$3 }
$1+$2+$3>=10{ print ($1+$2+$3) % 10 }
…とかそんな感じで、テキストを生成した結果に対して
フィルターとして比較式や正規表現で分岐して、フィールドを使って処理する感じです。
やっぱりバッチファイルとawkファイルをいくつも作ったり
一行一行に対してif文で分岐したりsplitで分割するしか無いですかね…。
196:デフォルトの名無しさん
08/09/15 01:52:51
>>195
敢えて入力を生成したいのなら、awkをパイプで繋げばいいと思う。
そうではなく、単に乱数で処理を振り分けたいのなら普通にif文でいいと思う。
それはさておき、
--
$1+$2+$3<10{ print $1+$2+$3 }
$1+$2+$3>=10{ print ($1+$2+$3) % 10 }
--
は別に上の条件式は要らんだろ。一桁の数値を10で割った余りは元のままだからな。
197:デフォルトの名無しさん
08/09/15 14:18:55
>196
いやあくまで例題なので内容は深く考えないでください…orz
普通にif文とは言うものの、折角awkが標準で備えてる便利な機能を無視して冗長な書き方するのも難だし
かと言って.awkファイル複数個とバッチで、パイプでつなげて処理するのも…う~ん、となってしまう。
良い書き方無いかなぁと思ったので聞いてみたのですが、ifとsplitで頑張ります。
198:デフォルトの名無しさん
08/09/16 02:58:54
質問がよくわからんのだが、BEGIN部で生成したファイルを処理部で扱いたいということかな?
例えば、
gawk 'BEGIN{ ARGV[1]="in_file.txt"; ARGC=2; }{ print }'
ってやったら in_file.txt を表示できるぞい
199:デフォルトの名無しさん
08/09/16 09:51:03
>198
!!!
目から鱗です。
そっか、ファイル生成しちゃえば一発で行けるのか…やってみます
200:デフォルトの名無しさん
08/09/16 15:07:48
うげ、一旦ファイルを作るのはありなのかよ。
ifを使うのは冗長なのに、ファイルを作るのは冗長じゃないってどんなセンスなんだ。
201:デフォルトの名無しさん
08/09/16 17:48:16
>200
入力データは規則性のあるもので、生成してしまえるけど
それに対しての分岐は多い…という場合
ifやsplitを羅列するよりも、awkが元々持ってる
パターンとフィールド分割を使った方が
スッキリすると思うのですが間違ってるでしょうか…。
202:デフォルトの名無しさん
08/09/16 19:39:26
>>201
別にいいんじゃね?
巨大な中間ファイルを作るってわけでもないんだろうし。
まぁ、次の理由で私は中間ファイルを作るのは避けるけどね。
・フルパスを指定しない場合、カレントディレクトリに書き込み権限がある保障がない。
・そもそも同名ファイルが存在していて書き込み権限がないかも知れない。
・つーか、同時に2件動かしたらバッティングしてしまう。
・だからと言って、一々ユニークな名前のファイル名を生成するのも面倒だ。
・しかも、中間ファイルは後で消しておく必要があるかもしれない。
それと、自前で入力を生成するなら、最初から分割された状態で作ればいいからsplitは要らないね。
パターンを使うかifを使うかは趣味の問題のような気がするけど。
# $1+$2+$3<10{print;}と書くかif($1+$2+$3<10){print;}と書くかの違いだもんね。
203:デフォルトの名無しさん
08/09/18 01:19:00
色々考え方があるのね。
自分ならトリッキーな細工して1つに収めず分割してif使わずに書くけど。
手早くカタをつけられるのがawkの良い所だと思うし、
技巧に走ると間違いなく忘れるのでメンテ不可能になる可能性大
ま、それはそれとして>>198はパズル的な面白さがあって良いね。
204:デフォルトの名無しさん
08/09/19 19:54:42
>202
う~ん、言われてみればそうかも。
一応、今回のは仕事で使うわけでもなければ他人に使ってもらう予定もない
完全な個人用スクリプトなのでどうにでもなりますが
これが業務や自分以外も使うものであれば素直にifなんでしょうね。
205:デフォルトの名無しさん
08/09/22 20:50:40
2008/09/15 13:17 61 20080915142145.txt
2008/09/16 13:17 316 2008091611529.txt
2008/09/22 20:09 24,028 2008_0922asahiindex.txt
2008/09/22 12:57 1,545 clean.txt
というファイル一覧から、gawkで今日の日付のファイルだけ抜き出すにはどうすりゃいいんだっけ?
BEGIN{month = strftime("%m",systime()); date = strftime("%d",systime())}
/month/ && /date/ {print $0}
でいいかと思ったら、/ /のなかにmonthとかは使えないらしい。
/strftime("%d",systime())/ {print $0}
とべた書きしてもだめ。
ど忘れ中。ヘルプミー。
206:デフォルトの名無しさん
08/09/22 21:05:13
BEGIN{date=strftime("%m/%d")} $0 ~ date {print $0}
207:デフォルトの名無しさん
08/09/22 21:45:34
>>206
thanks!
208:デフォルトの名無しさん
08/10/10 19:41:51
質問です。
入力中のファイル名はFILENAMEにセットされますが、
入力中のファイルのパスを取得するにはどうしたらよいですか。
209:デフォルトの名無しさん
08/10/10 22:13:43
>>208
FILENAMEで得られる情報が全て。フルパスが欲しいということなら、
cwdを取得してそこからの相対パスがFILENAME。
210:デフォルトの名無しさん
08/11/12 19:19:08
awkの結果を set か setenv の変数に代入したいです。
awk '{ print $1+ $3 }' test.txt
で数値が出ます。
この結果を変数に代入するにはどうしたらいいんでしょうか?
set tmp=`awk '{ $1+ $3 }' test.txt`
これだと上手くいきません。print はそのままでいいのでしょうか?
211:デフォルトの名無しさん
08/11/12 20:24:22
なんで print を省略できると考えたのかが謎だが
212:デフォルトの名無しさん
08/11/12 23:57:16
>print はそのままでいいのでしょうか?
まず試せよw
213:デフォルトの名無しさん
08/11/13 14:17:14
新紀元社のプログラミング言語awkがどこも売り切れなんだけど
もう入らないのかな
214:デフォルトの名無しさん
08/11/16 03:02:56
>>211
printは画面表示するもの→変数に入れるだけなら不要
…と思ったんじゃ内科ね
215:デフォルトの名無しさん
08/11/18 11:28:33
カンマ区切りのデータファイルがあり、その中で、第1フィールドと第3フィールド内にもし
子音、子音、子音、母音が存在すればその行だけ抜き出すオークのスクリプトファイルをつくりたいのですがどうすればよいですか
216:デフォルトの名無しさん
08/11/18 11:41:15
>>215
データファイルのサンプルと抜き出したい行ヨロ
217:デフォルトの名無しさん
08/11/18 11:50:40
こんな感じです
takeshi,fiad,fdjioaf,fdjsoafds(←該当なし)
dddacea,fsaofsa,rrra,fjisaofdjsa(dddaとrrraが該当)
aexxxu,dsoifsa,yyyuo,fjsaofa(xxxuとyyyuが該当)
218:びぎなぁ
08/11/18 12:12:55
オークスクリプトを実行すると情報を表示するようにしたのですが1行目と最後の行だけを表示しないようにするには
END内に何て書けば宜しいでしょうか
219:デフォルトの名無しさん
08/11/18 12:43:59
>>215
BEGIN{FS=","}
function term_check(term, lower_term) # lower_term は局所変数
{
lower_term=tolower(term)
if(lower_term ~ /[bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][aiueo]/) return 1
return 0
}
{
if(term_check($1) && term_check($3)) print
}
パターン繰り返しって {3} とかでいけるはずなんだが
書き方知らないのでコピペしたw
220:デフォルトの名無しさん
08/11/18 12:47:37
>>218
逐次出力してる?
END でまとめて出力してる?
221:デフォルトの名無しさん
08/11/18 13:53:22
>>218
1行ずつバッファリングして、次の行の入力で前の行を出力すれば最後の行は消えてなくなる。
awk 'NR > 2 {print buffer;} NR > 1 {buffer = $0;}'
222:デフォルトの名無しさん
08/11/18 14:20:29
>>215
gawkなら
awk -F "," -v r="[bcdfghj-np-tv-z]{3}[aiueo]" --posix '$1 ~ r && $3 ~ r'
$1と$3どちらか一方にあればいいなら&&を||に変えてね
223:デフォルトの名無しさん
08/11/18 16:29:37
>>219
助かりました!
224:びぎなぁ
08/11/18 16:46:03
出来ました ありがとうございます
225:デフォルトの名無しさん
08/11/19 23:48:41
込み入ってて整理できないので教えてください。
・対象のテキストは2行目がない(1行目しかない)かつ
・1行目はひらがなカタカナ漢字で15文字以内
という条件を書くのって、次のようにしたのですが、うまくヒットしません。
どう書けばいいでしょう?
NR==2 && length($0) == 0 && NR==1 && /[ぁ-んァ-ヶ亜-腕]{1,15}/
226:デフォルトの名無しさん
08/11/19 23:53:31
>>225
NR == 2 && NR == 1じゃ、絶対成立しないだろ。
227:デフォルトの名無しさん
08/11/19 23:54:54
awkは行を1行ずつ処理するから、事前にトータル行数を知ることはできない。
トータル行数が1行であることを保証したいなら、ENDブロックで処理するしかない。
228:デフォルトの名無しさん
08/11/20 00:22:37
>事前にトータル行数を知ることはできない
BEGIN部で数えれば?
229:デフォルトの名無しさん
08/11/20 00:28:19
>>228
どうやって? 対象がファイルである保証があるならwcでも呼べばいいけどそれならawkでやる必要さえないよね。
230:デフォルトの名無しさん
08/11/20 03:49:07
{ a = $0 }
END { if (NR == 1 && a ~ /re/) print a }
とか?
231:デフォルトの名無しさん
08/11/20 23:58:06
どなたか、任意ビット幅の2の補数HEXをDECに変換するプログラムを書いてもらえませぬか?
232:デフォルトの名無しさん
08/11/22 12:02:58
仕様が不明確なところがあるし、なによりなんでawkで?
233:デフォルトの名無しさん
08/11/26 22:53:51
>>232
ここがawkスレだからでしょ。
234:デフォルトの名無しさん
08/11/29 03:05:38
>>232
考えるな。感じろw
235:デフォルトの名無しさん
08/12/12 07:21:00
「あなたは何故awkでやろうとするのですか?」
「そこにawkがあるから」
236:デフォルトの名無しさん
08/12/13 04:23:45
awkからsystem()でgrepとかsedとか呼んだりする癖が付いている
シェルスクリプトにする方がむしろ違和感
237:デフォルトの名無しさん
08/12/13 23:56:31
おいおい、grepやsedぐらい呼び出さずにawkでやろうぜ。
238:デフォルトの名無しさん
08/12/16 00:29:26
grepやsedはパイプでつなげて使うものじゃないの?(^^;
239:デフォルトの名無しさん
09/01/10 22:10:41
gawk 3.1.4 mb のwindows版のEXEファイルが欲しい…
240:デフォルトの名無しさん
09/01/11 00:38:51
なんでそんな古いバージョンが欲しいの?
241:デフォルトの名無しさん
09/01/11 12:16:04
>なんでそんな古いバージョンが欲しいの?
lengthとかsubstrで、「j」付き文字列関数があるからです。
3.1.5以降だと、同じスクリプトファイル内で、バイト単位処理と
キャラクター単位処理の混在が難儀なのです。
242:240
09/01/11 15:01:36
3.1.5で文字の扱いが変わったのはその通りだけど、3.1.4のWindows版て
jlengthやらあったっけ?
なかったと思うんだけど。
243:デフォルトの名無しさん
09/01/11 15:48:22
>なかったと思うんだけど。
えっ。3.1.4以前のはバイト単位オンリーって事ですか?
…それでも2バイト換算で扱えばいいから、まだマシかも。
j付きが追加されていたけど、動作変更に伴って廃止された…
と思っていました。
記憶にあるのは、どなたかの独自拡張別Verだったのか…?
244:240
09/01/11 17:54:21
> えっ。3.1.4以前のはバイト単位オンリーって事ですか? ちゃう。
jなんとかがあったのは、
2.11ベースのjgawkと2.15ベースのjgawk
2.15ベースのとgawk+mb
3.0.xベースのgawk+mb
で、3.1.xベースのにはなかったという話だったと思う。
それぞれやってる人が違う。
245:デフォルトの名無しさん
09/01/11 19:05:17
>3.1.xベースのにはなかったという話だったと思う。
そうですか…。
gawk 3.1.4 mb のwindows版のEXEファイルが欲しい…
ではなくて、
3.0.xベースのgawk+mb のwindows版のEXEファイルが欲しい…
という事になる訳ですが…無理っぽい。
あっても関数や組込変数が減少…その前に16bitDOS版ONLYの予感…。
諦めます。240さん、どうもでした。
246:デフォルトの名無しさん
09/01/11 19:50:26
>>245
URLリンク(www.hinadori.atnifty.com)
にあるよ。3.0.6のやつ。
DOS版だけじゃなくてWin32版もある。
3.0.6→3.1.xで増えた機能でも使ってんの?
247:デフォルトの名無しさん
09/01/11 22:30:39
>あるよ。3.0.6のやつ。
おお。 ありがとうございます。
>3.0.6→3.1.xで増えた機能でも使ってんの?
いつ何が増えたのかよく把握していないんですが、
gensubとかmktimeとかswitch-caseとか…ありますかね。
まあ、代替手段はあるので試してみます。どうもです。
248:デフォルトの名無しさん
09/02/23 08:11:12
awkで、組み合わせの全てを作る、という事はできるのでしょうか?
いわゆるnCrの、個数ではなくて、中身を知りたいという事なのですが・・・。
(mawkを使っています)
249:デフォルトの名無しさん
09/02/24 18:18:34
>>248
できます
250:sage
09/03/04 15:23:19
248です。
なんとかできました。249さんどうもです。
251:デフォルトの名無しさん
09/03/04 15:24:16
sage間違えた…
252:デフォルトの名無しさん
09/03/23 11:47:59
int(0.5005*10000)が5004になるのはなぜですか。
253:デフォルトの名無しさん
09/03/23 12:41:00
丸め誤差でしょう。
切り捨て前に0.5足すとか工夫してみては如何でしょうか。
詳しくは、IEEEと丸め誤差辺りのキーワードで検索のこと。
254:デフォルトの名無しさん
09/03/23 19:57:34
>253
ありがとう