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を同じ名前にするのは意地悪だと思うよ
0102デフォルトの名無しさん
2008/02/10(日) 20:37:230103≠98
2008/02/10(日) 20:39:44そのENDブロック内は、
for (制御変数 in 連想配列) {...;}
というパターン。
その前段のcount[$1] += $2は一行目のとき
count["aaa"] += 1と解釈される。以下同様に。
このcountが連想配列として使われているということ。
0104デフォルトの名無しさん
2008/02/10(日) 20:42:05…反省してます
いや,ほら,ついいつものクセで…ごめん
010597
2008/02/10(日) 20:52:15上記で書いたとおり便利ツールに頼り切ってて殆ど知らない私が悪いのですが…。
今一生懸命3byte程度の脳みそで勉強してるんですが、2日目で挫折しそうで質問させて貰いました…。
たとえばログには
Feb 9 22:44:40 localhost postfix/qmgr[1936]: 345C48C0154: from=<[email protected]>, size=556, nrcpt=1 (queue active)
と必ず出ます。で、
1,生ログをそのまま処理するのが怖い(大きなファイル)ので、日付でログを抽出して別ファイルへ保存。
2,grepで nrcpt=と抽出して、さらにgrep -vで除外するドメインを指定して抽出
3,そしてsedでnrcpt=を削除して
4,ここで>97のように$7と$9を並べたところで脳みそのバッファエラーを起こしました。
この処理の方法もエレガントなことは分かっていますが、恥は承知でお伺いした次第です…。
0106デフォルトの名無しさん
2008/02/13(水) 07:31:340107デフォルトの名無しさん
2008/02/14(木) 02:38:02それはリテラルとして扱ってということかい?
なら全部エスケープすればいいと思うが何か問題があるの?
0108デフォルトの名無しさん
2008/02/16(土) 01:08:4402 15 12:34:56 xxxxxxxxx
02 15 13:45:01 xxxxxxxxx
...
...
...
とかの形式なので、strftime()とかで現在とログの時刻を比較して抜き出す、とかを試したんですがダメでした…
0109デフォルトの名無しさん
2008/02/16(土) 01:49:16BEGIN{
n=5
basetime=strftime("%m %d %H:%M:%S", systime()-60*n)
}
{
chktime=substr($0, 1, 14)
if(chktime >= basetime) print
}
0110デフォルトの名無しさん
2008/02/16(土) 02:23:28ありがとうございます…素直に目が鱗でした…。
> chktime=substr($0, 1, 14)
なんですね…
perlが使えない環境なので、これが分かればいろいろ流用効くので助かりました。
ありがとうございます。もうちょっと精進します。。。
0111デフォルトの名無しさん
2008/02/18(月) 18:58:36昨年6月に「AWKを256倍使うための本」が本屋の書棚にあったので買いました。
奥付に
1993年8月21日初版発行
2007年5月9日 第1版第16刷発行
と書かれています。
0112デフォルトの名無しさん
2008/02/18(月) 22:32:44いつのレスにレスしてんだ(w
モレも買ったけど、まだ大きな本屋で見かけるね。
0113デフォルトの名無しさん
2008/02/19(火) 02:59:17本屋の棚で眠り続けてたってわけじゃないのかw
0114デフォルトの名無しさん
2008/02/24(日) 00:57:130115デフォルトの名無しさん
2008/02/24(日) 01:00:560116デフォルトの名無しさん
2008/03/28(金) 21:53:28それぞれ適材適所で使うけど、
「sed だけ」「awk だけ」で済ませられると、
不思議な喜びを感じる。
0117デフォルトの名無しさん
2008/03/30(日) 14:05:33うち、AIX使ってるんでksh+sed+awk+perlだな。
rubyが標準でインストールされてる環境ってあんまないと思う。
0118デフォルトの名無しさん
2008/03/30(日) 16:22:260119デフォルトの名無しさん
2008/04/06(日) 10:26:45カーニハンの本レベル(とか256倍)しか知らない人って多いと思う。
0120デフォルトの名無しさん
2008/04/06(日) 12:44:410121デフォルトの名無しさん
2008/04/06(日) 17:09:18#!/bin/sed -f
0122デフォルトの名無しさん
2008/04/06(日) 17:16:17awkに固執しないで臨機応変にsedを使うって意味でなら要領がいいという意味で賢いけど。
# awkで書いた方が簡単なことをsedで頑張って書いたのだとしたら、その意味では頭悪いなw
0123デフォルトの名無しさん
2008/04/06(日) 17:34:450124デフォルトの名無しさん
2008/04/06(日) 18:49:04awkって表計算のような処理に特化してますよね。
その点が非常にユニークというか事務処理の言語だな、と。
visicalc(1979)awk(1977)ですからawkのほうが若干古いんですが、
表計算はセルに直接式を書くという発想が新しかった。うむむ。
0125デフォルトの名無しさん
2008/04/06(日) 19:26:56ttp://www.danbricklin.com/history/saiidea.htm
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...)
0126デフォルトの名無しさん
2008/04/07(月) 02:52:10お手すきの時にでもご解答頂けましたら助かります
2chでお話していただいた方からgawkを教えて頂きました
正規表現でマッチした部分がいくつあっても全ての箇所を1アクションで保存できる優れものです
当方、言語は全く知らないので先ほどまでテスト実行しては驚いていました
この優れものを今後末永く使っていきたいのですが
下記の事項をググって見たのですがわかりませんでした
どなたかわかる方おられましたら教えて下さい
私のやりたいこと
・EUCを読み込んでS-JISを出力
・既存のテキスト末尾に追加書き込み保存
(教えて頂いたスクリプトは上書き保存なので出力先の内容が消えてしまいます)
気長に待っていますので何卒よろしくお願い致します
0127デフォルトの名無しさん
2008/04/07(月) 03:10:31前者はawkでやるべきことではない。iconv, nkfなどそれ専用のツールがある。
後者も必ずしもawkは不要。コマンドラインが使える環境なら普通にできる。
例えば、Unix系なら cat append.txt >> original.txt で既存のファイルに追加できる。
DOS系でも、type append.txt >> original.txt でできる。
要は、awkのいいところはそれ単体でなんでもできる(或いはできない)ことではなく、
コマンドライン環境で力を発揮するツールであること。
例えば、正規表現でマッチした文字列を置換するだけならテキストエディタでもできる。
あーそうそう、エディタがあれば文字コードの変換もそれだけでできる。
所謂テキストエディタを使ったことがないなら、一度(正規表現検索機能、
文字コード変換機能のある)テキストエディタを触ってみるといいかもしれない。
0128デフォルトの名無しさん
2008/04/07(月) 03:32:54>>126です
お疲れのところ早々のご解答誠にありがとうございます
コンバートは別のツールで行う
DOS環境ではtype append.txt >> 出力先ファイル名で追加書き込み
了解しました
エディターは秀丸エディターを使っています
コンバートは出来るのですが検索でマッチした文字列は1箇所ずつコピーなんです
sakuraエディターで一括コピーや切り取りが出来ると教えてくれた方もいてたのですが
sakuraエディターは試したことが無いんです
詳しくありがとうございました
0129デフォルトの名無しさん
2008/04/07(月) 03:56:33マッチした複数箇所を一括でコピーしてTEST.txtにペーストする
BBB.txtを開き”東京(.+?)号室”を検索する
マッチした複数箇所を一括でコピーしてTEST.txtの末尾にペーストする
CCC.txtを開き”東京(.+?)号室”を検索する
マッチした複数箇所を一括でコピーしてTEST.txtの末尾にペーストする
よろしくお願いします
0130デフォルトの名無しさん
2008/04/07(月) 04:02:07できないじゃん
0131デフォルトの名無しさん
2008/04/07(月) 06:48:34質問に具体性がないから一般論を書いただけだけど。
>>129
awk '/東京(.+?)号室/ {print > "TEST.txt";}' AAA.txt
awk '/東京(.+?)号室/ {print >> "TEST.txt";}' BBB.txt
以下同様に。
0132デフォルトの名無しさん
2008/04/07(月) 12:02:34レスありがと
gawk '/東京(.+?)号室/ {print > "TEST.txt";}' AAA.txt
gawk '/東京(.+?)号室/ {print >> "TEST.txt";}' BBB.txt
ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。
gawk3.16では使えない?
0133デフォルトの名無しさん
2008/04/07(月) 13:29:56DOSのコマンドラインの使い方は他所で聞いてくれ。
0134デフォルトの名無しさん
2008/04/07(月) 13:38:240135デフォルトの名無しさん
2008/04/07(月) 13:43:470136デフォルトの名無しさん
2008/04/07(月) 16:36:42ダブルクォートで括って中のコードは
シングルクォートか、エスケープしてダブルクォート入れるか。
一番簡単なのは、ワンライナーでもファイルに起こしてしまうこと。
gawk -f myscript.awk AAA.txt
とやってしまえば、シングルクォートとかダブルクォートとか気にする必要はない。
0137デフォルトの名無しさん
2008/04/07(月) 18:22:15二つ問題がある。
gawkの正規表現では.+?というのは使えない。
cmd.exeでは、シングルクォートを引数を
くくるのに使えない。
なんかよくわからんが、perlでテキストを丸飲みしてから
処理すればいいんじゃないのか?
0138デフォルトの名無しさん
2008/04/12(土) 19:00:42まぁ、これに限らず、『なんでこんなコマンドやオプションがあるんだ?』ってのは多い。
使い方じゃなく、なぜそれがあるのかを包括的に解説した本や web site ってありますか。(たとえば多くの unix コマンドを網羅しているとか)
0139デフォルトの名無しさん
2008/04/12(土) 19:01:220140デフォルトの名無しさん
2008/04/12(土) 19:58:470141デフォルトの名無しさん
2008/05/06(火) 02:42:04C:\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
0142141
2008/05/06(火) 02:56:02秀丸使ってるならgrepの実行で検索するファイルに(現在の内容)で
検索結果からファイル名と行番号を除去するのでもできそうな気がする。
盛大にスレ違いだけど。
0143デフォルトの名無しさん
2008/05/06(火) 14:28:43ありがと
まだ思うようにできていないんだ
参考になるよ感謝です
0144デフォルトの名無しさん
2008/06/16(月) 01:50:260145デフォルトの名無しさん
2008/06/16(月) 01:50:570146デフォルトの名無しさん
2008/06/25(水) 02:17:58以下のファイルhogeからawkで、価格を抜き出して合計値を出したいと思っています。
ファイルの内容は、書籍名と価格です。価格は一番後ろの数字になります。
----------------------
$ cat hoge
それいけ!あんぱんまん 1000
メタボリックを撃退せよ 1000
下流社会 1000
上流社会と下流社会 日本のこれから 1000
論文 2008 日本の抱える問題 1000
論文 2007 日本の抱える問題 過去問題集 1000
----------------------
難しいのが、書籍名の2008や2007などの数値が含まれていることや空白が含まれていることです。
1行目の場合2列目が価格になりますが、2行目の場合4列目が価格となります。
このように一番最後の列(価格)を取得し、合計値を計算するにはどうすればよいでしょうか?
ご教示お願いいたします。
0147デフォルトの名無しさん
2008/06/25(水) 02:28:000148デフォルトの名無しさん
2008/06/25(水) 09:33:150149デフォルトの名無しさん
2008/06/25(水) 13:36:510150デフォルトの名無しさん
2008/06/25(水) 15:27:280151デフォルトの名無しさん
2008/06/25(水) 16:09:130152デフォルトの名無しさん
2008/06/25(水) 16:34:160153デフォルトの名無しさん
2008/06/29(日) 21:37:04http://www.kt.rim.or.jp/~kbk/gawk-3.1/gawk.html#SEC182
からのサンプルファイルですが、途中で止まってしまって、返事が返ってきません。
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 では問題ありませんでした。
0154デフォルトの名無しさん
2008/07/01(火) 20:42:14ttp://www.pipeunish.jp/
0155デフォルトの名無しさん
2008/07/02(水) 01:35:150156デフォルトの名無しさん
2008/07/02(水) 02:13:540157デフォルトの名無しさん
2008/07/02(水) 08:51:570158デフォルトの名無しさん
2008/07/02(水) 09:32:16最新版gawkのdllを探してるんですが、見つかりません。
または、ソースのtar.gzからdllを作る方法が載っているページを
御存知の方がいらっしゃいましたら、教えていただけると助かります。
0159デフォルトの名無しさん
2008/07/02(水) 10:34:53ソースのtar.gzってなに?
0160デフォルトの名無しさん
2008/07/02(水) 10:42:47sourceからgawk.exeを作ったりしないのですか??
dllと書いているのでわかるかとは思いますが、
windows環境下での話です。普段はcygwinでmakeしたgawkを使っているのですが、
dllがあると他の言語から呼び出して使えるので便利かなーと思ってます。
0161デフォルトの名無しさん
2008/07/02(水) 10:45:49win用のソースがいる
0162デフォルトの名無しさん
2008/07/02(水) 11:53:32昔あったDLL版は作者が独自に作ったものみたいで
本家に反映されてないから本家のソースからDLLを作るのは無理。
DLL版のソースを参考にして自力で作るか
できないなら作者に連絡して協力を求めるしかない。
0163デフォルトの名無しさん
2008/07/02(水) 12:05:07自分で改修するしかないだろ
0164デフォルトの名無しさん
2008/07/03(木) 02:36:530165155
2008/07/05(土) 15:47:31XP [Version 5.1.2600] でつ
まだ見てるか?
多分なおってると思うんで新しいので試してみてくりや。
0167デフォルトの名無しさん
2008/07/06(日) 06:36:13作者降臨か
0168デフォルトの名無しさん
2008/07/06(日) 07:02:210169デフォルトの名無しさん
2008/07/20(日) 00:40:48FS=/[ ()]+/ は期待通りの動きをせず、FS="[ ()]+" と書かねばならない。
初めて知った。
検索しても、これについて明快に書いてあるページがなかなか見つからなかったが
>正規表現定数がそれ自身として現れたとき、それはパターン中に現れたかのように、
>つまり`($0 ~ /foo/)' のようにみなされる。
<中略>
>言語のこの機能は、POSIX標準までドキュメント化されなかった。
orz
これで1時間ぐらいムダにした。私が知らなかっただけですか??
0170デフォルトの名無しさん
2008/07/20(日) 00:58:40> (FSに代入される)文字列が1文字より長いときは,正規表現として扱われる
0171デフォルトの名無しさん
2008/07/20(日) 01:10:480172デフォルトの名無しさん
2008/07/20(日) 02:09:53””で囲んだ文字列が正規表現として扱われる ということと
//で囲んだ正規表現定数で書いてはいけない ということは同じではない。
実際、split関数の 第3引数に与える正規表現は どちらでも動く
むむむ、ここでは($0~/foo/)に置き換えて評価されないんだ…
171の意見が正しいようだね チャンチャン
0173デフォルトの名無しさん
2008/07/21(月) 12:39:44print ファイル1の$2 ファイル2の$1
みたいな感じで
0174デフォルトの名無しさん
2008/07/21(月) 13:06:32pasteで繋いじゃダメ?
私はよくやるけど。
仮にファイル1が5カラム固定なら、
paste ファイル1 ファイル2| awk '{print $2 $6;}'
てな感じで。
# カラム数可変ならもう一捻り必要だけどね。
0175デフォルトの名無しさん
2008/07/21(月) 13:50:02awkだけでやりたいならgetlineを使えばできる。
0176デフォルトの名無しさん
2008/07/22(火) 18:37:52上の方にあったDFAとNFA使ってる事からくる違いってなんですか?
0177デフォルトの名無しさん
2008/07/23(水) 02:40:07一番の違いは、DFAだと後方参照ができないことかな。
とりあえず
DFA
前準備に手間を掛けるけど処理そのものは早い
NFA
即座に処理を始めるけど、処理に時間がかかる場合がある。
ぐらいに考えておけばいいと思う。
0178デフォルトの名無しさん
2008/08/02(土) 00:57:570179デフォルトの名無しさん
2008/08/02(土) 14:34:05sh + awk で出来ることを perl のみで記述する人の気持ちがどうしても理解出来ない。
ただ、ネットワークプログラミング以上になるとC, perl, ruby にならざるを得ないけど。
マシン単体での種々の手続き記述だと、
sh + awk がやっぱり一番完結になると思うんだけどな〜。
0180デフォルトの名無しさん
2008/08/02(土) 14:49:58でもあまりにトリッキーなことになりそうだったらperlでやったりするかな。
0181あいちゃん
2008/08/03(日) 01:39:18Perlでやれば基本的に問題ないから、Perlで書く癖がつく。
ShellScriptでいったん使うだけなら、awkは便利だけど。
0182デフォルトの名無しさん
2008/08/04(月) 01:23:58俺も AWK でできるならAWK。
と考えると バイナリーのデータいじる以外はAWKでできるのでは…
(少なくとも 俺に日常のニーヅでは そうだ)
0183デフォルトの名無しさん
2008/08/04(月) 02:16:24同感。ただバイナリは仕方ないにしても、
全半角混在の固定長フォーマットが扱いにくいんだよな。
ASCIIにすると全角のみ部分が処理しにくいし、
SJISとかにすると正しく切り出せないし・・・
あれはなんとかならんものかな。
0184デフォルトの名無しさん
2008/08/07(木) 01:55:090185デフォルトの名無しさん
2008/08/11(月) 15:38:13でダウソできるのがASCIIとSJISをうまく扱えるやつぢゃねの?
0186デフォルトの名無しさん
2008/08/13(水) 00:38:23いや、そのgawk使ってるけど、全半角混在の固定長は困るはず。
両方別々なら問題なく扱えるけど、同時には扱えない。
例えば。SJIS1行5バイト+改行の固定長ファイルで
1行は2項目(a:全半角混在4バイト b:半角のみ1バイト)のファイルがあるとき。
asciiモードならa, bを切り分けられるがaの全角文字は処理できない。
sjisモードならa, bを切り分けられない。
悩ましいのは、項目を切り分けるスクリプトをascii オプションで起動して
出力結果をsjisで処理すれば(めんどくさいけど)現状で処理できてしまう。
ので、マニュアルに書いてある通り、作者をおねがいすれば可能性はあるかもしれないが、
お願いするのが躊躇われる感じなのね。
0187デフォルトの名無しさん
2008/08/13(水) 22:12:090188デフォルトの名無しさん
2008/08/15(金) 02:08:00文字数とバイト数と表示幅とか、日本語は面倒だのう。
length()とかでバイト数を拾えないから自前で処理もやりにくい。
0189デフォルトの名無しさん
2008/08/19(火) 22:37:59一瞬納得しかけたけど。
冷静に考えると、そもそも1文字が可変長であるUTF8を
固定長ファイルの文字コードに使おうと考えた奴を締め上げて
泣くほど問い詰める方が先だと思うのは俺だけ?
考えても考えてもメリットが思いつかないよ…
0190デフォルトの名無しさん
2008/08/21(木) 00:40:10ほとんどの文字コードが可変長だからなあ。
相対的に見ればマシな方に入るんじゃない?
ホストが絡むと文字コード周りは悲惨だよ…
ホストじゃないならそもそも固定長じゃなくて良いんだけどね。
0191デフォルトの名無しさん
2008/08/23(土) 01:53:25文字のコードを整数値に変換しようとしてうまくいきません
たとえば「c」という文字のコードを整数値にしようとして
BEGIN {
testChar = "c";
printf("testChar=%d\n",testChar);
}
のようにしても「testChar=0」と表示されてしまいます
良い方法があればお教えください
0192デフォルトの名無しさん
2008/08/23(土) 03:21:15awklib に ord ってユーザー定義のライブラリ関数があるからそれを使う。
自前で作ってもいいけどね。
くわしくは info gawk で調べて。
0194191
2008/08/23(土) 10:56:41ttp://www.kt.rim.or.jp/~kbk/gawk-30/gawk_16.html
にあったものを試してみました.期待どおりの動作をしてくれます.
どうもありがとうございました.
0195デフォルトの名無しさん
2008/09/15(月) 01:12:37もしくは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で分割するしか無いですかね…。
0196デフォルトの名無しさん
2008/09/15(月) 01:52:51敢えて入力を生成したいのなら、awkをパイプで繋げばいいと思う。
そうではなく、単に乱数で処理を振り分けたいのなら普通にif文でいいと思う。
それはさておき、
--
$1+$2+$3<10{ print $1+$2+$3 }
$1+$2+$3>=10{ print ($1+$2+$3) % 10 }
--
は別に上の条件式は要らんだろ。一桁の数値を10で割った余りは元のままだからな。
0197デフォルトの名無しさん
2008/09/15(月) 14:18:55いやあくまで例題なので内容は深く考えないでください…orz
普通にif文とは言うものの、折角awkが標準で備えてる便利な機能を無視して冗長な書き方するのも難だし
かと言って.awkファイル複数個とバッチで、パイプでつなげて処理するのも…う〜ん、となってしまう。
良い書き方無いかなぁと思ったので聞いてみたのですが、ifとsplitで頑張ります。
0198デフォルトの名無しさん
2008/09/16(火) 02:58:54例えば、
gawk 'BEGIN{ ARGV[1]="in_file.txt"; ARGC=2; }{ print }'
ってやったら in_file.txt を表示できるぞい
0199デフォルトの名無しさん
2008/09/16(火) 09:51:03!!!
目から鱗です。
そっか、ファイル生成しちゃえば一発で行けるのか…やってみます
0200デフォルトの名無しさん
2008/09/16(火) 15:07:48ifを使うのは冗長なのに、ファイルを作るのは冗長じゃないってどんなセンスなんだ。
0201デフォルトの名無しさん
2008/09/16(火) 17:48:16入力データは規則性のあるもので、生成してしまえるけど
それに対しての分岐は多い…という場合
ifやsplitを羅列するよりも、awkが元々持ってる
パターンとフィールド分割を使った方が
スッキリすると思うのですが間違ってるでしょうか…。
0202デフォルトの名無しさん
2008/09/16(火) 19:39:26別にいいんじゃね?
巨大な中間ファイルを作るってわけでもないんだろうし。
まぁ、次の理由で私は中間ファイルを作るのは避けるけどね。
・フルパスを指定しない場合、カレントディレクトリに書き込み権限がある保障がない。
・そもそも同名ファイルが存在していて書き込み権限がないかも知れない。
・つーか、同時に2件動かしたらバッティングしてしまう。
・だからと言って、一々ユニークな名前のファイル名を生成するのも面倒だ。
・しかも、中間ファイルは後で消しておく必要があるかもしれない。
それと、自前で入力を生成するなら、最初から分割された状態で作ればいいからsplitは要らないね。
パターンを使うかifを使うかは趣味の問題のような気がするけど。
# $1+$2+$3<10{print;}と書くかif($1+$2+$3<10){print;}と書くかの違いだもんね。
0203デフォルトの名無しさん
2008/09/18(木) 01:19:00自分ならトリッキーな細工して1つに収めず分割してif使わずに書くけど。
手早くカタをつけられるのがawkの良い所だと思うし、
技巧に走ると間違いなく忘れるのでメンテ不可能になる可能性大
ま、それはそれとして>>198はパズル的な面白さがあって良いね。
0204デフォルトの名無しさん
2008/09/19(金) 19:54:42う〜ん、言われてみればそうかも。
一応、今回のは仕事で使うわけでもなければ他人に使ってもらう予定もない
完全な個人用スクリプトなのでどうにでもなりますが
これが業務や自分以外も使うものであれば素直にifなんでしょうね。
0205デフォルトの名無しさん
2008/09/22(月) 20:50:402008/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}
とべた書きしてもだめ。
ど忘れ中。ヘルプミー。
0206デフォルトの名無しさん
2008/09/22(月) 21:05:130207デフォルトの名無しさん
2008/09/22(月) 21:45:34thanks!
0208デフォルトの名無しさん
2008/10/10(金) 19:41:51入力中のファイル名はFILENAMEにセットされますが、
入力中のファイルのパスを取得するにはどうしたらよいですか。
0209デフォルトの名無しさん
2008/10/10(金) 22:13:43FILENAMEで得られる情報が全て。フルパスが欲しいということなら、
cwdを取得してそこからの相対パスがFILENAME。
0210デフォルトの名無しさん
2008/11/12(水) 19:19:08awkの結果を set か setenv の変数に代入したいです。
awk '{ print $1+ $3 }' test.txt
で数値が出ます。
この結果を変数に代入するにはどうしたらいいんでしょうか?
set tmp=`awk '{ $1+ $3 }' test.txt`
これだと上手くいきません。print はそのままでいいのでしょうか?
0211デフォルトの名無しさん
2008/11/12(水) 20:24:220212デフォルトの名無しさん
2008/11/12(水) 23:57:16まず試せよw
0213デフォルトの名無しさん
2008/11/13(木) 14:17:14もう入らないのかな
0214デフォルトの名無しさん
2008/11/16(日) 03:02:56printは画面表示するもの→変数に入れるだけなら不要
…と思ったんじゃ内科ね
0215デフォルトの名無しさん
2008/11/18(火) 11:28:33子音、子音、子音、母音が存在すればその行だけ抜き出すオークのスクリプトファイルをつくりたいのですがどうすればよいですか
0216デフォルトの名無しさん
2008/11/18(火) 11:41:15データファイルのサンプルと抜き出したい行ヨロ
0217デフォルトの名無しさん
2008/11/18(火) 11:50:40takeshi,fiad,fdjioaf,fdjsoafds(←該当なし)
dddacea,fsaofsa,rrra,fjisaofdjsa(dddaとrrraが該当)
aexxxu,dsoifsa,yyyuo,fjsaofa(xxxuとyyyuが該当)
0218びぎなぁ
2008/11/18(火) 12:12:55END内に何て書けば宜しいでしょうか
0219デフォルトの名無しさん
2008/11/18(火) 12:43:59BEGIN{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
0220デフォルトの名無しさん
2008/11/18(火) 12:47:37逐次出力してる?
END でまとめて出力してる?
0221デフォルトの名無しさん
2008/11/18(火) 13:53:221行ずつバッファリングして、次の行の入力で前の行を出力すれば最後の行は消えてなくなる。
awk 'NR > 2 {print buffer;} NR > 1 {buffer = $0;}'
0222デフォルトの名無しさん
2008/11/18(火) 14:20:29gawkなら
awk -F "," -v r="[bcdfghj-np-tv-z]{3}[aiueo]" --posix '$1 ~ r && $3 ~ r'
$1と$3どちらか一方にあればいいなら&&を||に変えてね
0223デフォルトの名無しさん
2008/11/18(火) 16:29:37助かりました!
0224びぎなぁ
2008/11/18(火) 16:46:030225デフォルトの名無しさん
2008/11/19(水) 23:48:41・対象のテキストは2行目がない(1行目しかない)かつ
・1行目はひらがなカタカナ漢字で15文字以内
という条件を書くのって、次のようにしたのですが、うまくヒットしません。
どう書けばいいでしょう?
NR==2 && length($0) == 0 && NR==1 && /[ぁ-んァ-ヶ亜-腕]{1,15}/
0226デフォルトの名無しさん
2008/11/19(水) 23:53:31NR == 2 && NR == 1じゃ、絶対成立しないだろ。
0227デフォルトの名無しさん
2008/11/19(水) 23:54:54トータル行数が1行であることを保証したいなら、ENDブロックで処理するしかない。
0228デフォルトの名無しさん
2008/11/20(木) 00:22:37BEGIN部で数えれば?
0229デフォルトの名無しさん
2008/11/20(木) 00:28:19どうやって? 対象がファイルである保証があるならwcでも呼べばいいけどそれならawkでやる必要さえないよね。
0230デフォルトの名無しさん
2008/11/20(木) 03:49:07END { if (NR == 1 && a ~ /re/) print a }
とか?
0231デフォルトの名無しさん
2008/11/20(木) 23:58:060232デフォルトの名無しさん
2008/11/22(土) 12:02:580233デフォルトの名無しさん
2008/11/26(水) 22:53:51ここがawkスレだからでしょ。
0234デフォルトの名無しさん
2008/11/29(土) 03:05:38考えるな。感じろw
0235デフォルトの名無しさん
2008/12/12(金) 07:21:00「そこにawkがあるから」
0236デフォルトの名無しさん
2008/12/13(土) 04:23:45シェルスクリプトにする方がむしろ違和感
0237デフォルトの名無しさん
2008/12/13(土) 23:56:310238デフォルトの名無しさん
2008/12/16(火) 00:29:260239デフォルトの名無しさん
2009/01/10(土) 22:10:410240デフォルトの名無しさん
2009/01/11(日) 00:38:510241デフォルトの名無しさん
2009/01/11(日) 12:16:04lengthとかsubstrで、「j」付き文字列関数があるからです。
3.1.5以降だと、同じスクリプトファイル内で、バイト単位処理と
キャラクター単位処理の混在が難儀なのです。
0242240
2009/01/11(日) 15:01:36jlengthやらあったっけ?
なかったと思うんだけど。
0243デフォルトの名無しさん
2009/01/11(日) 15:48:22えっ。3.1.4以前のはバイト単位オンリーって事ですか?
…それでも2バイト換算で扱えばいいから、まだマシかも。
j付きが追加されていたけど、動作変更に伴って廃止された…
と思っていました。
記憶にあるのは、どなたかの独自拡張別Verだったのか…?
0244240
2009/01/11(日) 17:54:21jなんとかがあったのは、
2.11ベースのjgawkと2.15ベースのjgawk
2.15ベースのとgawk+mb
3.0.xベースのgawk+mb
で、3.1.xベースのにはなかったという話だったと思う。
それぞれやってる人が違う。
0245デフォルトの名無しさん
2009/01/11(日) 19:05:17そうですか…。
gawk 3.1.4 mb のwindows版のEXEファイルが欲しい…
ではなくて、
3.0.xベースのgawk+mb のwindows版のEXEファイルが欲しい…
という事になる訳ですが…無理っぽい。
あっても関数や組込変数が減少…その前に16bitDOS版ONLYの予感…。
諦めます。240さん、どうもでした。
0246デフォルトの名無しさん
2009/01/11(日) 19:50:26http://www.hinadori.atnifty.com/~wills/
にあるよ。3.0.6のやつ。
DOS版だけじゃなくてWin32版もある。
3.0.6→3.1.xで増えた機能でも使ってんの?
0247デフォルトの名無しさん
2009/01/11(日) 22:30:39おお。 ありがとうございます。
>3.0.6→3.1.xで増えた機能でも使ってんの?
いつ何が増えたのかよく把握していないんですが、
gensubとかmktimeとかswitch-caseとか…ありますかね。
まあ、代替手段はあるので試してみます。どうもです。
0248デフォルトの名無しさん
2009/02/23(月) 08:11:12いわゆるnCrの、個数ではなくて、中身を知りたいという事なのですが・・・。
(mawkを使っています)
0249デフォルトの名無しさん
2009/02/24(火) 18:18:34できます
0250sage
2009/03/04(水) 15:23:19なんとかできました。249さんどうもです。
0251デフォルトの名無しさん
2009/03/04(水) 15:24:160252デフォルトの名無しさん
2009/03/23(月) 11:47:590253デフォルトの名無しさん
2009/03/23(月) 12:41:00切り捨て前に0.5足すとか工夫してみては如何でしょうか。
詳しくは、IEEEと丸め誤差辺りのキーワードで検索のこと。
0254デフォルトの名無しさん
2009/03/23(月) 19:57:34ありがとう
0255デフォルトの名無しさん
2009/04/13(月) 21:36:16gawkが使える無料鯖どこかにありませんか?
0256デフォルトの名無しさん
2009/04/13(月) 21:58:14レンタル鯖板できいてみたら。
さくらのFreeBSDはFreeBSDのawk(!=gawk)だった。
0257デフォルトの名無しさん
2009/04/13(月) 22:07:10さくらはgawkですか。
Windowsじゃないレンタル鯖ならawkが使えても良さそうですけど、
無料ではなかなか見つからないんですよね。
perl,ruby,phpは多いんですけどねぇ。。
0258257
2009/04/13(月) 22:14:30さくらはgawkじゃないawkですか。
0259デフォルトの名無しさん
2009/04/18(土) 13:07:13ttp://awk.info/?doc/dsl/awkplusplus.html
object_variable = class_name.new[(optional parameters)]
object_variable.method_name(parameters)
object_variable.delete
0260デフォルトの名無しさん
2009/04/18(土) 13:30:10同じくウケた
awkは永続的に使っていて,C-->C++-->Javaと乗り継いできたが,awkはこれらコンパイラ言語を使う上で
良い学習材料になってきたと思い感謝している(もちろん未だにscriptのawkをawkで書いている).
唯一awkで勉強できなかったのがOOPだったから,学習材料としてのawkがこういう方向に活路を見いだすのは
良いことかもしれない.ただし実用に向けて考えてみると,個人的にはOOPが本領を発揮するのは頭の中でalgorithmを
把握しきれなくなる程度に大きなシステムを組み上げる場合なので,果たしてそれをawkで書くかといわれると….
0261260
2009/04/18(土) 13:57:190262デフォルトの名無しさん
2009/05/09(土) 23:49:39「rubyがあればAWKいらね」とは思えん。
逆にAWKの便利さを再認識した。
やっぱり、簡単なテキスト処理は
AWKでやったほうが簡単だ。
0263デフォルトの名無しさん
2009/05/09(土) 23:58:090264デフォルトの名無しさん
2009/05/10(日) 00:37:150265デフォルトの名無しさん
2009/05/10(日) 01:20:35ttp://homepage2.nifty.com/tomoarai/java/exper.html
0266デフォルトの名無しさん
2009/05/14(木) 08:38:05使ってる人少ないの?
0267デフォルトの名無しさん
2009/05/19(火) 23:16:20さくっと1行で済むのが気に入ってる俺には無用だな
0268デフォルトの名無しさん
2009/06/01(月) 15:22:34Jア(オ)ーク、プラグアウッ!
0269デフォルトの名無しさん
2009/06/08(月) 01:31:39Geocoding - 住所から緯度経度を検索 だって。何これおもろい。
0270デフォルトの名無しさん
2009/06/21(日) 16:39:12を実行すると$1が1桁の数字のときにうまくいかないんですけどなぜ?
0271デフォルトの名無しさん
2009/06/21(日) 19:43:04miso<$1-0
でやったらどう?
0272デフォルトの名無しさん
2009/06/21(日) 21:34:56ありがとうございます。でもだめでした。
文字列で比較されてるっぽいですね。
0273デフォルトの名無しさん
2009/06/21(日) 22:04:19何を入力したときに何が出て欲しいの?
うまくいかないってどうなるの?
0274デフォルトの名無しさん
2009/06/21(日) 22:23:40$1が4のときに出てほしくないのに出てしまうんです...
0275デフォルトの名無しさん
2009/06/21(日) 22:31:41こんなん?
BEGIN{miso=30}{if(miso<$1){printf("%d\n",$1)}}
0276デフォルトの名無しさん
2009/06/21(日) 22:46:46出てしまう理由が気になります...なんででしょう
やっぱり271さんの言うとおり文字列比較してるんでしょうか?
0277デフォルトの名無しさん
2009/06/21(日) 22:54:47awk のバージョン(種別)が分からない
何を食わせてるのか分からない
スクリプトは一行で書いてるのかファイルにしてるのか分からない
一行で書いているならシェルに何を使っているのか
0278デフォルトの名無しさん
2009/06/22(月) 00:38:26二桁のときだけ上手くいくという感じなのかね。
WindowsXPのコマンドプロンプトでgawk(3.1.5)使って下記を試してみたけど
その現象再現できなかった。
gawk "{if(miso<$1){printf($1)}}" miso=30
0279デフォルトの名無しさん
2009/06/22(月) 07:43:07mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan
compiled limits:
max NF 32767
sprintf buffer 2040
$seq 1 40 | awk '{if(miso<$1)printf($1)}' miso=30
31323334353637383940
うまく動いているようだが。
0280デフォルトの名無しさん
2009/06/22(月) 18:20:09$ awk -W version
GNU Awk 3.1.6
Copyright (C) 1989, 1991-2007 Free Software Foundation.
$ seq 1 40 | awk '{if(miso<$1)printf($1)}' miso=30
31323334353637383940
0281デフォルトの名無しさん
2009/06/22(月) 19:59:100282270 のが再現できない...
2009/06/23(火) 01:02:55コマンドラインで指定されたファイル名が var=val という形式ならば、それは変数への代入であると解釈されます。変数 var は値 val に設定されます (これは、すべての BEGIN ブロックを実行したあとに行われます)。
やっぱりもれの XPコマンドプロンプト環境でも
>gawk -W version
GNU Awk 3.1.6
Copyright (C) 1989, 1991-2007 Free Software Foundation.
>seq 1 40 | gawk "{if(miso<$1) print}" miso=30
31
32
33
34
35
36
37
38
39
40
って期待通りの動きだYO!
0283デフォルトの名無しさん
2009/06/24(水) 00:39:07他のソフトで「改行ありの固定長」にしてから、awkで処理していたのですが…
データファイルによく出てくる文字をとりあえずRSに見立てて読み込み
→RSに指定した文字を連接
→固定長の1行分より長かったらその部分を切り出し
していくと「改行ありの固定長」、できちゃいました。
RSに指定した文字がしばらく出てこなければ変数パンクしちゃうし、大分危なっかしいの
ですが、とりあえずawkでできたのが少しうれしい。
0284デフォルトの名無しさん
2009/06/24(水) 03:25:12substr($0, start, length) でばらせよw
0285デフォルトの名無しさん
2009/06/26(金) 11:29:46>284みたいな読解力ない馬鹿が湧かないように、判り易く書きましょう。
つーか、具体的なコードも出さずに「awkでできてうれしい」なんてのはチラシの裏にどうぞ。
0286デフォルトの名無しさん
2009/06/30(火) 01:27:460287デフォルトの名無しさん
2009/07/13(月) 09:52:52例)
10進 2進 8進
000 000 000
001 001 001
002 010 002
003 011 003
↓↓↓↓↓↓↓
<table>
<tr><th>10進</th> <th>2進</th> <th>8進</th></tr>
<tr><td>000</td> <td>000</td> <td>000</td></tr>
<tr><td>001</td> <td>001</td> <td>001</td></tr>
<tr><td>002</td> <td>010</td> <td>002</td></tr>
<tr><td>003</td> <td>011</td> <td>003</td></tr>
</table>
0288デフォルトの名無しさん
2009/07/13(月) 12:07:49正規表現を使うほどのことではない
コアの部分だけ書くとこれだけ
for(i=1;i<=NF;i++) printf("<td>%s</td>", $i)
0289デフォルトの名無しさん
2009/07/13(月) 16:12:210290hogehoge
2009/07/17(金) 16:37:34なんでだ!
仕様書読み飛ばしててデータ欠落させるところだった(´・ω・`)
>>287
sed でええやん
0291デフォルトの名無しさん
2009/07/17(金) 18:35:54http://www.eecs.harvard.edu/cs152/lectures/CS152-Lecture_14-Kernighan.pdf
0292デフォルトの名無しさん
2009/07/26(日) 15:10:31ここのgawkで>>17のサンプルを試したが動かなかった。
gawk: test.awk:4: 致命的: 入出力用の双方向ソケット `/inet/tcp/0/www.yahoo.com/80' が開けません (No such file or directory)。
0293hogehoge
2009/07/27(月) 11:13:150294デフォルトの名無しさん
2009/07/28(火) 00:11:420295デフォルトの名無しさん
2009/07/30(木) 11:45:580296デフォルトの名無しさん
2009/08/06(木) 10:22:377月28日→[[7月28日|07月28日]]
11月3日→[[11月3日|11月3日]]
12月16日→[[12月16日|12月16日]]
と置き換えたいです。
perlならわりと簡単なのですが、awkで簡単にいきますか?
自分がawkのことを勉強不足だからかもしれませんけど…。
0297デフォルトの名無しさん
2009/08/06(木) 10:24:137月7日→[[7月7日|07月07日]]
7月28日→[[7月28日|07月28日]]
11月3日→[[11月3日|11月03日]]
12月16日→[[12月16日|12月16日]]
0298デフォルトの名無しさん
2009/08/06(木) 11:03:170299デフォルトの名無しさん
2009/08/06(木) 11:13:12gsub(/月|日/," ");
printf("%02d月%02d日\n",$1,$2);
}
とか.
フィールドセパレータがデフォルト(半角スペース)の場合ね.
0300デフォルトの名無しさん
2009/08/06(木) 11:15:10Perlで簡単に書けるなら、一旦Perlコード晒してくれるか?
どうも仕様がよく解らんのだ…
0301デフォルトの名無しさん
2009/08/06(木) 11:54:28$1))
我ながら汚ねぇなぁ(´・ω・`)
>>299の方がいいな
0302デフォルトの名無しさん
2009/08/06(木) 12:27:22#!/usr/bin/perl
while(1){
$line = <STDIN>;
if($line =~ /(0?[1-9]|1[0-2])月(0?[1-9]|[1-2][0-9]|3[01])日/){
$month = $1; $day = $2;
if($month >= 10) {
if($day >=10){
print "$& -> [[$month月$day日]]";
}
else {
print "$& -> [[$month月$day日|$month月0$day]]";
}
}
else{
if($day >=10){
print "$& -> [[$month月$day日|0$month月$day]]";
}
else{
print "$& -> [[$month月$day日|0$month月0$day]]";
}
}
}
}
1月1日 - ユーロ導入10周年。
1月1日 -> [[1月1日|01月01]]
12月31日 - ニューヨークのマンハッタン橋開通100周年。
12月31日 -> [[12月31日]]
8月21日 - ハワイ州州制50周年。
8月21日 -> [[8月21日|08月21]]
10月1日 - パラオ独立15周年。
10月1日 -> [[10月1日|10月01]]
0303デフォルトの名無しさん
2009/08/06(木) 14:16:23ちなみに、そのコードじゃ無限ループするぞ。
#!/usr/bin/perl
while($line = <STDIN>) {
if($line =~ /(0?[1-9]|1[0-2])月(0?[1-9]|[1-2][0-9]|3[01])日/) {
$month = $1; $day = $2;
if($month < 10 || $day < 10) {
printf "%s -> [[%d月%d日|%02d月%02d]]\n", $&, $month, $day, $month, $day;
}
else {
print "$& -> [[$month月$day日]]\n";
}
}
}
0304デフォルトの名無しさん
2009/08/06(木) 14:44:030305デフォルトの名無しさん
2009/08/06(木) 14:47:14という文字列を
[[7月7日|07月07日]]
と置き換える、ってことでしょ。
なんで分からんかなぁ。そっちのが分からん。
0306デフォルトの名無しさん
2009/08/06(木) 14:53:30出力は[[07月07日|07月07日]]になるよね?これはOK?
そもそも,そういう入力は起こりえないの?
そんな感じです。
目的を言っていないので、何がやりたいのかよくわからないのだと思います。
早い話、Wikiの記法を使ってリンクを張りたいのです。
0をくわえて桁を調整している理由は
文字列としてソートして正しく昇順に並ぶようにするためです。例えばWikipediaなら
7月7日のときは、[[7月7日|07月07日]]とすることで
リンクはhttp://ja.wikipedia.org/wiki/7月7日
表示される文字列は 07月07日
となります。
これをソートできるテーブルの要素にします。参考までに
http://ja.wikipedia.org/wiki/Help:%E8%A1%A8%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9#.E5.86.8D.E6.95.B4.E5.88.97.E5.8F.AF.E8.83.BD.E3.81.AA.E8.A1.A8
この処理はawkでも可能なことは可能だったんですが、無知なせいか
おそろしく不格好になりました。
>>306
それ思いました。できれば
07月07日->[[7月7日|07月07日]]
のように処理したいです。
0308デフォルトの名無しさん
2009/08/06(木) 18:26:07それです。そういう意味です。
0309デフォルトの名無しさん
2009/08/06(木) 21:17:06# 一行に複数回現れた場合は無視.
BEGIN {
F = "(0?[1-9]|1[0-2])月(0?[1-9]|[1-2][0-9]|3[01])日";
}
{
if ($0 ~ F) {
match($0, F, a);
if (a[1]+0 < 10 || a[2]+0 < 10) {
sub(a[0], sprintf("[[%d月%d日|%02d月%02d日]]", $0, a[2], a[1], a[2], a[1]));
} else {
sub(a[0], sprintf("[[%d月%d日]]", $0, a[2], a[1]));
}
}
print $0;
}
0310309
2009/08/06(木) 21:21:15BEGIN {
F = "(0?[1-9]|1[0-2])月(0?[1-9]|[1-2][0-9]|3[01])日";
}
{
if ($0 ~ F) {
match($0, F, a);
if (a[1]+0 < 10 || a[2]+0 < 10) {
sub(a[0], sprintf("[[%d月%d日|%02d月%02d日]]", a[1], a[2], a[1], a[2]));
} else {
sub(a[0], sprintf("[[%d月%d日]]", a[1], a[2]));
}
}
print $0;
}
0311デフォルトの名無しさん
2009/08/06(木) 23:59:03$ cat test.txt
1月1日 #m月d日
01月1日 #0m月d日
1月01日 #m月0d日
01月01日 #0m月0d日
2月10日 #m月dd日
02月10日 #0m月dd日
11月3日 #mm月d日
11月03日 #mm月0d日
12月16日 #mm月dd日
$ awk -f test.awk test.txt
[[1月1日|01月01日]] #m月d日
[[1月1日|01月01日]] #0m月d日
[[1月1日|01月01日]] #m月0d日
[[1月1日|01月01日]] #0m月0d日
[[2月10日|02月10日]] #m月dd日
[[2月10日|02月10日]] #0m月dd日
[[11月3日|11月03日]] #mm月d日
[[11月3日|11月03日]] #mm月0d日
[[12月16日]] #mm月dd日
0312デフォルトの名無しさん
2009/08/07(金) 06:34:470313デフォルトの名無しさん
2009/08/07(金) 11:45:35> perlならわりと簡単なのですが、awkで簡単にいきますか?
って言ってるんだから、「いきます」って答えりゃいいんだよな
0314デフォルトの名無しさん
2009/08/07(金) 11:46:39なにその死の行進こわい
0315デフォルトの名無しさん
2009/08/15(土) 11:36:300316デフォルトの名無しさん
2009/08/16(日) 09:46:093.1.7ベースのWindows用バイナリ、出ました。
ttp://www.kt.rim.or.jp/%7Ekbk/gawk-3.1/index.html#GAWK-DOWNLOAD
名言集 その3
『いつもサボってばかりのキャップがウゼえ』
http://yutori7.2ch.net/test/read.cgi/news4vip/1249830540/ ID:PVAf+dux0 = 自動焼人 ★
> 71 :以下、名無しにかわりましてVIPがお送りします [sage] :2009/08/10(月) 00:58:57.28 ID:PVAf+dux0
> >>69
> 大変って言うか
> 毎日、報告されたのを見て、判断して、処理して、完了報告して、以下ループ。
> ちょっとでもミスすると、普段は作業もしてないキャップさんたちがさんざん文句言ってきて
> その言いわけを考えないと、キャップはく奪されたりアカウント凍結されたりするから
>
> 登録されてから一年以上経って、やっといいたいこと言えるようになってきたよ。
----------------------------------------------
この自動焼人 ★メールマガジンの配信停止をご希望される方は
http://qb5.2ch.net/test/read.cgi/sec2chd/1250169591/
にて自動焼人 ★までご連絡ください
0318デフォルトの名無しさん
2009/10/24(土) 17:23:040319デフォルトの名無しさん
2009/10/24(土) 18:19:03処理対象がファイルなら、事前にwc -lか何かで行数調べて awk に渡してみては
0320デフォルトの名無しさん
2009/10/24(土) 18:52:07ちょっと考えながらやってみます
0321デフォルトの名無しさん
2009/10/24(土) 19:15:52BEGIN {
SKIPTAILS = 10
}
{
line = buf[1]
for(i=1;i<SKIPTAILS;i++) buf[i] = buf[i+1]
buf[SKIPTAILS] = $0
}
NR > SKIPTAILS {
# lineを処理
}
0322デフォルトの名無しさん
2009/10/24(土) 22:11:41リングバッファで処理するようにしてみた。
BEGIN {
SKIPTAILS = 10
ringpos = SKIPTAILS
}
{
ringpos = (ringpos + 1) % SKIPTAILS
line = buf[ringpos]
buf[ringpos] = $0
}
NR > SKIPTAILS {
# lineを処理
}
0323デフォルトの名無しさん
2009/10/24(土) 23:18:06リングバッファ、勉強になりました
使わせて頂きます
0324デフォルトの名無しさん
2009/11/19(木) 20:22:22sed awk して船山に登る だろ?
0325デフォルトの名無しさん
2009/11/23(月) 12:06:14gawkで
{
printf("%d,%s\n", NR, $0 ) > FILENAME;
}
という行頭に番号を振って保存する処理をして
batファイルで一括処理させようとしたんですが
c:\windows\gawk\gawk -f g:\作業用\n.awk g:\作業用\*.txt
実行結果が
ファイル1 ファイル2
1A 4D
2B 5E
3C 6F
になります
ファイル2も
1D
2E
3F
にするにはどうしたらよいでしょうか?
0326デフォルトの名無しさん
2009/11/23(月) 12:27:220327デフォルトの名無しさん
2009/11/23(月) 12:35:21おお、出来た!
迅速な回答ありがとうございます
0328デフォルトの名無しさん
2009/12/21(月) 13:53:34あれ、vaioのOSがWindows7 64bitバージョンに・・・
ダメじゃん!gawkが使えなくなってしまう・・・
うーん、、、またXPを買うべきか・・・悩む・・・
0329デフォルトの名無しさん
2009/12/21(月) 14:21:01自分でコンパイルし直せばいいだけじゃないの?
0330デフォルトの名無しさん
2010/01/14(木) 03:52:20ttp://slashdot.jp/developers/article.pl?sid=10/01/06/0345207
多分必要性を感じない程度には使ってるから、買わないけど嬉しい。
布教用に買うってのもちょっとな。
0331デフォルトの名無しさん
2010/02/28(日) 11:08:56awk新参です。
-O(オプション)を検索し、
-Oとそれ以降をリダイレクトしたいのですが…
良い方法、ありますでしょうか
0332デフォルトの名無しさん
2010/02/28(日) 15:36:31その AAA で始まる文字列も一体どういうものなの。
コマンドライン引数なのか、ファイルから読み込んでくるのとか。
用語と状況はきちんと書いてくれ。
0333デフォルトの名無しさん
2010/02/28(日) 16:19:07AAA BBB CCC … -O ZZZ YYY XXX 0…
AAA BBB CCC … -O ZZZ YYY XXX 1…
AAA BBB CCC … -O ZZZ YYY XXX 2…
D:\My Documents\gawk\331>type 331.awk
{match($0, " -O .*", a);
print a[0];}
D:\My Documents\gawk\331>gawk -f 331.awk 331.txt >a.txt
D:\My Documents\gawk\331>type a.txt
-O ZZZ YYY XXX 0…
-O ZZZ YYY XXX 1…
-O ZZZ YYY XXX 2…
D:\My Documents\gawk\331>
0334331
2010/02/28(日) 18:43:32>>332すみません。書き直します。
AAA BBB CCC … -O ZZZ YYY XXX …
と書複数行書かれたファイルがあり、
「-O」以降の文字列を別ファイルに保存する
ってことをしたかったのです。
>>333
エスパーな文だったのにありがとうございます。
想定してたのはそんな感じです。
ただ以下のエラーが出て上手くいきません…
gawk: 331.awk:2: fatal: match() cannot have 3 arguments
match使ってるのにaという3つ目の引数を使ってるから…ってことでしょうか…?
0335デフォルトの名無しさん
2010/02/28(日) 19:00:04A: Your AWK is too old to recreate the Makefile. The build is done based on the distributed Makefile. Everything shall compile successfully though.
So if the compile succeeds just ignore such errors, please.
0336335
2010/02/28(日) 19:22:380338デフォルトの名無しさん
2010/02/28(日) 22:25:50おっと一言オウかったか。
0339デフォルトの名無しさん
2010/03/04(木) 15:04:38gsub(str1,str2)みたいに。
0340デフォルトの名無しさん
2010/03/04(木) 21:44:52man gawkより
gsub(r, s [, t])
For each substring matching the regular expression r in the string t,
substitute the string s, and return the number of substitutions.
If t is not supplied, use $0. An & in the replacement text is
replaced with the text that was actually matched. Use \& to get a
literal &. (This must be typed as "\\&"; see GAWK: Effective AWK
Programming for a fuller discussion of the rules for &'s and
backslashes in the replacement text of sub(), gsub(), and gen sub().)
0341デフォルトの名無しさん
2010/03/08(月) 21:36:03何が難しいのかよくわからん。
0342デフォルトの名無しさん
2010/03/17(水) 22:07:37実際のところ速くなるんでしょうか?
私の環境ではforループや加算などはawkのほうが速そうですが、
どのような処理の場合にperlのほうが速くなりますか?
$ time mawk 'BEGIN{x=0;for(i=1;i<=1000000;i++){x=x+i};printf("%f\n" ,x)}'
500000500000.000000
real 0m0.131s
user 0m0.120s
sys 0m0.000s
$ time gawk 'BEGIN{x=0;for(i=1;i<=1000000;i++){x=x+i};print x}'
500000500000
real 0m0.289s
user 0m0.284s
sys 0m0.000s
$ time perl -e '$x=0;for($i=1;$i<=1000000;$i++){$x=$x+$i};print $x'
500000500000
real 0m0.379s
user 0m0.376s
sys 0m0.004s
0343デフォルトの名無しさん
2010/03/17(水) 22:26:14「awkだと遅いのでperlに書き換えるという人」 に聞けば分かる
0344デフォルトの名無しさん
2010/03/19(金) 09:08:06遅いというawkはgawkなの?
素のawkよりgawkの方が早くなかったっけ?
0345デフォルトの名無しさん
2010/03/20(土) 01:03:01(とCとC++とJAVA)の比較があるな
今のマシン使って書き換えなきゃならないほど遅いって
どんな処理なんだろう?
0346デフォルトの名無しさん
2010/03/21(日) 13:44:10awk 等を組み合わせて実行するとプロセス起動のコストがかかるので perl で一つに纏める、という話じゃないの?
0347デフォルトの名無しさん
2010/03/22(月) 17:35:11文字列中の全角文字を半角文字に変える華麗な方法を模索しています。
0348デフォルトの名無しさん
2010/03/22(月) 18:01:580349デフォルトの名無しさん
2010/03/22(月) 18:25:10なにをしたいのかよくわかんないんだけど。
> 文字列中の全角文字を半角文字に変える華麗な方法を模索しています。
華麗なのはtrコマンドを使う方法。ただtrがマルチバイトをうまく扱ってくれるか
どうかはこころもとない。
Perlならtrを、Rubyなら文字列クラスのtrメソッドを、
Pythonならstringモジュールのmaketrans関数と文字列のメソッドtransleteを使う、
という手がある。
awkないし(tr以外の)古典的なツールで華麗にやる方法はないと思う。
0350デフォルトの名無しさん
2010/03/24(水) 17:11:16全角半角変換は ASC()
半角全角変換は JIS()
0351デフォルトの名無しさん
2010/03/25(木) 08:34:111. EUC-JPにして(nkfとか)kakasi で、戻す
2. それだったら最初から、nkf -Z
3. gawk前提で、文字毎に処理(LANGを指定して子プロセス起動)
awkの中で閉じてやるのはめんどくさそう
0352デフォルトの名無しさん
2010/03/29(月) 23:34:27system(cmd) を使うと、アンチウィルスソフト(kaspersky)の
アプリケーション履歴にバッチファイルが登録されるのを発見。
close(cmd) しても同じ。
while(cmd|getline>0){}
で代用すると残らなくなった。??
0353デフォルトの名無しさん
2010/05/13(木) 00:22:57http://www.cnn.co.jp/world/AIC201005120004.html
テヘランで、ブルカを着て入出国する時って、顔のチェックどうするんだろう。
他人や男でもばれないの?
0354デフォルトの名無しさん
2010/05/13(木) 00:23:49誤爆スマン
0355デフォルトの名無しさん
2010/05/14(金) 13:38:240356デフォルトの名無しさん
2010/05/18(火) 10:51:40下のような出力が有った場合、例えば
lrwxrwxrwx 1 root root 70 May 18 10:37 hoge
ls -al | awk '{print$1$2$2$4$6$7$8$9}' とすれば「$5」の
「70」を抜くことが出来ますが、これが$100とかまで続く場合、
「$5」だけを抜きたい場合記述が大変になります。
何か良い方法は無いものでしょうか?
0357デフォルトの名無しさん
2010/05/18(火) 11:01:32区切りの空白が$5のあったところだけ2個になるのが気にならなければ、
ls -al | awk '{$5 = ""; print}'
とすればよい。
空白2個を修正するならこうする。
ls -al | awk '{$5 = ""; print $0}' | awk '{$1 = $1; print}'
0358デフォルトの名無しさん
2010/05/18(火) 11:03:15ls -al | awk '{$5 = ""; print}' | awk '{$1 = $1; print}'
0359デフォルトの名無しさん
2010/05/18(火) 11:07:030360デフォルトの名無しさん
2010/05/18(火) 11:34:06$1=$1で代入してやると、$1, $2, ...を空白1個でつないだものが$0に代入されるので、
空白2個だったところが空白1個になる。
0361デフォルトの名無しさん
2010/05/18(火) 11:35:04空白2個なので$0を再構成すると空白1個区切りになる
0362デフォルトの名無しさん
2010/05/18(火) 12:21:12非常に解りやすいご説明、ありがとうございます。
なるほど代入することで解決するんですね。
勉強になりました。
0363デフォルトの名無しさん
2010/05/18(火) 15:08:38$1ってFSで区切られた一つ目だよね?
なんでそれ自身を自分に代入したらスペースが消えるん?
0364デフォルトの名無しさん
2010/05/18(火) 15:27:35$0の再構成とはいったんばらした$1,$2,...をOFSを挟んで
つなげ直すってことなので、何で区切られていたかは
保存されない。
0365デフォルトの名無しさん
2010/05/18(火) 15:41:56>$1=$1で代入してやると、$1, $2, ...を空白1個でつないだものが$0に代入される
って約束事を覚えておけってことかい?
0366デフォルトの名無しさん
2010/05/18(火) 15:42:39% echo a b | gawk '{OFS="-";$1=$1;OFS="=";print}'
a=b
再構成は$1=$1をやってすぐじゃなくて、次に$0が使われるとき、ってこと
なのかな?
0367365
2010/05/18(火) 16:27:59http://www.kt.rim.or.jp/~kbk/gawk-3.1/gawk.html
警告: 一部のバージョンのawkは NFを減じたときに$0の再構築を行わない。
結局のところ、awkにレコード全体の再構築を強制したときにはその時点で
フィールドの値とOFSが使われる。再構築を行うためには、何らかの無害な
代入を行う:
$1 = $1 # force record to be reconstituted
賢くなった。あんがと。
0368デフォルトの名無しさん
2010/05/18(火) 16:46:580369デフォルトの名無しさん
2010/05/19(水) 22:24:520370デフォルトの名無しさん
2010/05/24(月) 09:55:14勉強になった。
0371デフォルトの名無しさん
2010/05/24(月) 15:25:460372デフォルトの名無しさん
2010/05/29(土) 04:53:07E-mail:
内容:
cygwinだと
% cut -f1 -d, hoge.csv
より
% awk -F, '{print $1}' hoge.csv
の方が速かった。
#実行時間ね
#Perl?シラネ
0373デフォルトの名無しさん
2010/06/07(月) 11:45:38sed -e 's/,.*//'でもawkと同じくらいだから、cutの実装が遅いんだね。
cutが無駄にオプション多い所為じゃない?
0374デフォルトの名無しさん
2010/06/07(月) 12:04:05hoge.csvは6桁の乱数3つを「,]で区切って並べた100万行の
ファイルです。
% time cut -f1 -d, hoge.csv >/dev/null
cut -f1 -d, hoge.csv > /dev/null 0.21s user 0.01s system 99% cpu 0.222 total
% time awk -F, '{print $1}' hoge.csv >/dev/nulll
awk -F, '{print $1}' hoge.csv > /dev/nulll 1.52s user 0.03s system 99% cpu 1.558 total
ちなみにバージョンは
cut (GNU coreutils) 8.5
GNU Awk 3.1.7
0375デフォルトの名無しさん
2010/06/07(月) 12:22:48fgetc()とfgets()で時間を較べたときにfgetc()の方がずっと遅かった記憶がある。
0376デフォルトの名無しさん
2010/09/13(月) 14:14:54そのページがwell-formedか極悪かは私にとってどうでもよく、単に内容を得たいだけなので、文末まで処理し終えて欲しいのです。
どうにかならないでしょうか。
0377デフォルトの名無しさん
2010/09/25(土) 14:55:22アクションをヒアドキュメントで書く事は出来るでしょうか。
0378デフォルトの名無しさん
2010/09/27(月) 14:57:18データが
|1|aaa|
|2|bbb|
|3|ccc|
などとなっているとき
aaa
bbb
ccc
を取り出そうとして
awk 'FS="|"{print $3}' ファイル名
としたんですが、1行目だけがうまくとれません。
データファイルの1行目を空行にすれば解決できないことはないんですが、
空行を入れ忘れてしまう懸念があります。
どうすればいいんでしょうか?
0379デフォルトの名無しさん
2010/09/27(月) 15:01:460380デフォルトの名無しさん
2010/09/27(月) 15:08:38>>379
どうもありがとうございました。
0381デフォルトの名無しさん
2010/09/27(月) 18:42:12下記サイトでは、17番目まで普通に指定できるような事が書いてあるけど、
http://tounderlinedk.blogspot.com/2010/08/gensub-n-awk.html
gensub(pattern,"\\10","g",$2) とかくと
\\1(マッチ箇所)と0(文字)として解釈されちゃって上手くいなかい。
シェルスクリプト風かと思って、\\{10} も試したけどダメダッター。
GNU Awk 3.1.5です。
0382381
2010/09/27(月) 19:00:47実装によって違うのかなあ
パターンを動的に生成してマッチさせようとしてるから結構困る(´・ω・`)
http://www.linux.or.jp/JM/html/GNU_gawk/man1/gawk.1.html
0383デフォルトの名無しさん
2010/09/27(月) 19:04:47マニュアルには1から9までって書いてあるし
Within the replacement text s, the sequence \n, where n is a digit from 1 to 9, may be
used to indicate just the text that matched the n'th parenthesized subexpression.
ソースの該当箇所(builtin.cの2542行目あたりから)みても1桁限定のロジックだよ。(3.1.7調べ)
int dig = scan[1] - '0';
なんてやってる。
0384デフォルトの名無しさん
2010/09/27(月) 19:08:030386デフォルトの名無しさん
2010/09/27(月) 21:27:29なんでそこのひとは16までできたんだ?
0387デフォルトの名無しさん
2010/09/28(火) 00:32:520388デフォルトの名無しさん
2010/09/28(火) 03:15:24記念パピコ。
0389デフォルトの名無しさん
2010/09/28(火) 03:41:50気付いたらperlばっかりやっててawkすっかり忘れてしまったなぁ
今はperl捨てて専らpythonやってるけどawkもいいよね
0390デフォルトの名無しさん
2010/09/28(火) 09:40:13手軽であるにも関わらず、結構高度な処理もガリガリ書けるから好き。
Cとシェルスクリプトが好きだから、文法的にもしっくり来る。
上位互換のPerlも大好き。
0391デフォルトの名無しさん
2010/09/28(火) 14:37:590392デフォルトの名無しさん
2010/09/28(火) 14:52:08どれでも好きなのを選べ
1. xgawkを改造
2. エラーになるXMLを事前に修正してwell-formedにしてから食わせる
3. xgawkは捨てて別の言語、ライブラリを試す
0393デフォルトの名無しさん
2010/09/28(火) 17:23:080394デフォルトの名無しさん
2010/10/01(金) 11:21:26シェルスクリプト > awk >>> perl >>>>> python >>>>> ruby >>> haskel etc.
となるだろうな。
シェルスクリプトはシェル依存な部分が多く、perl ほど高機能なものも要らない。
そんな時、小さな端末でもスマートに動いてくれる awk にちんこ勃つ。
>>389
言語に捨てるも拾うもないよ。その時々に都合の良いものを組み合わせて使うのがUNIX的な発想。
0395デフォルトの名無しさん
2010/10/01(金) 15:33:40「一発やろう」ですね!
0396デフォルトの名無しさん
2010/10/09(土) 04:40:48これなら俺でも挫折しなくてすみそう
0397デフォルトの名無しさん
2010/10/09(土) 04:57:140398デフォルトの名無しさん
2010/10/21(木) 20:16:46/ー/{print}
を実行すると
awk:
awk: ^ 正規表現が終端されていません。
awk: 致命的: [ または [^ が対応しません。: /[/{print}/
のエラーになってしまいます。
ーの2バイト目が[なせいだと思いますが、どう対応したらいいでしょうか?
入力ファイルはsjisで書かれていて、文字コード変換はできません。
0399デフォルトの名無しさん
2010/10/21(木) 20:55:41環境の問題なんだから、実行環境くらいまともに書けよ。
0400デフォルトの名無しさん
2010/10/21(木) 21:38:24gawk を使う
0401デフォルトの名無しさん
2010/10/21(木) 22:52:57/bin/awkはシンボリックリンクで、実体はgawkでした。
0402デフォルトの名無しさん
2010/10/21(木) 23:49:35--help 嫁
0403デフォルトの名無しさん
2010/10/22(金) 01:41:070404デフォルトの名無しさん
2010/10/22(金) 02:19:300405398
2010/10/22(金) 07:32:34/\x81\[/{print}
0406デフォルトの名無しさん
2010/10/22(金) 09:41:36根本的な解決になってないけどねぇ。
0407デフォルトの名無しさん
2010/10/22(金) 13:52:100408398
2010/10/22(金) 19:55:530409デフォルトの名無しさん
2010/10/22(金) 20:03:18今あるのかどうか知らないけど。
0410デフォルトの名無しさん
2010/10/22(金) 20:28:38$ echo 'てすと' | gawk '/[ぁ-ん]/ { print length($0) }'
3
UTF-8ロケールでしか試してないけど
cygwinでも大丈夫
0411デフォルトの名無しさん
2010/10/23(土) 01:29:00gawkでいいかな
0412399
2010/10/23(土) 06:55:10問題は解決したのかもしらんが、一応。
以下2つのWin用バイナリは問題ないので、ソースもらってLinux上でコンパイルしてみたら?
ttp://gnuwin32.sourceforge.net/packages/gawk.htm
ttp://www.kt.rim.or.jp/~kbk/gawk-3.1/
0413398
2010/10/23(土) 10:53:14これにしたらsjisでも動くようになるのでしょうか?
0414デフォルトの名無しさん
2010/10/23(土) 12:27:19少なくとも自分が試したWindows2003上ではな。
▽tes.awk ※sjis
/ー/{print}
△
CentOS5.5上
$ gawk -f tes.awk readme.ja
awk: tes.awk:1:
awk: tes.awk:1: ^ 正規表現が終端されていません。
awk: tes.awk:1: 致命的: [ または [^ が対応しません。: /[/{print}/
Windows2003上
> gawk -f tes.awk readme.ja
⇒マッチした物が表示される
Linux上でロケールをsjis.japaneseとかにすればいいのかと思ったが、ロケール変更自体がうまくいかなかったわ。
困ってる事があるなら、最終的に何がしたいか言ったほうがいいよ。
0415398
2010/10/23(土) 12:40:31困っていたことは405で解決したので大丈夫です。
今は「根本的な解決」に興味があったのでお聞きした次第です。
0416初心者
2010/11/04(木) 22:14:100417デフォルトの名無しさん
2010/11/04(木) 23:14:10初心者だからマルチが許されるとでも思ったか?
0418初心者
2010/11/05(金) 06:32:09知りませんでした。
0419デフォルトの名無しさん
2010/12/15(水) 01:54:35length みたいなのは無い?
0420デフォルトの名無しさん
2010/12/15(水) 02:27:500421デフォルトの名無しさん
2010/12/15(水) 02:42:46と思ったらgawkにはあるのか
length([s]) Returns the length of the string s, or the
length of $0 if s is not supplied. Starting
with version 3.1.5, as a non-standard exten-
sion, with an array argument, length() returns
the number of elements in the array.
0422デフォルトの名無しさん
2010/12/15(水) 04:20:37作成するときに数えればいいんじゃね?
0423デフォルトの名無しさん
2010/12/15(水) 08:40:150424419
2010/12/25(土) 03:12:23って事が分かりますた
0425デフォルトの名無しさん
2010/12/28(火) 11:29:350426デフォルトの名無しさん
2010/12/28(火) 13:55:13翻すとUNIX文化そのものが
まあ、あくまでおれの主観ですがね
0427デフォルトの名無しさん
2010/12/28(火) 15:24:21awk大好きなオイラに喧嘩売るのかw
ウニックス文化最高!(NT系はUNIXのパクリ)
0428デフォルトの名無しさん
2010/12/28(火) 15:28:13全角英字使う奴が awk 大好きだとは到底思えん
0429デフォルトの名無しさん
2011/01/05(水) 23:22:550430デフォルトの名無しさん
2011/01/06(木) 00:22:04BEGIN{
if (ARGV[1]=="")
ARGV[1]="hoge.txt"
while (getline < ARGV[1] > 0) print "BEGIN\t"$0
}
ARGV[1]=="hoge.txt"{
print "BODY\t"$0
}
★質問
上記スクリプトを引数を付けた場合と付けない場合をそれぞれ実行しました。
▼gawk -f tes09.awk hoge.txt
BEGIN [email protected]
BEGIN [email protected]
BEGIN [email protected]
BODY [email protected]
BODY [email protected]
BODY [email protected]
▼gawk -f tes09.awk
BEGIN [email protected]
BEGIN [email protected]
BEGIN [email protected]
ここで、BEGIN句での ARGV[1]="hoge.txt" という代入を本編(?)でも有効にする為
にはどうすればいいでしょうか?
0431デフォルトの名無しさん
2011/01/06(木) 00:31:45質問の趣旨がわからん
0432430
2011/01/06(木) 06:20:53hoge.txtの中身は下記です。
▼
[email protected]
[email protected]
[email protected]
>>430はWin32のバイナリ「GNU Awk 3.1.7(windows special Nov 24 2009)」を使用した結果です。
下のほうの実行結果では、BEGIN句でのARGV[1]への代入はBEGIN句では有効ですが、
本編では有効になっていないので出力されていないように見えます。
ちなみに、CentOS5.5上の GNU Awk 3.1.5 では下記エラーになりました。
▼
gawk: tes09.awk:2: if (ARGV[1]=="")
gawk: tes09.awk:2: ^ 表現の char '・' は不正です。
0433デフォルトの名無しさん
2011/01/06(木) 08:57:49>gawk: tes09.awk:2: ^ 表現の char '・' は不正です。
これは全角スペース
0434デフォルトの名無しさん
2011/01/06(木) 09:12:00>BEGIN [email protected]
>BEGIN [email protected]
コレはgetlineで読んで出力したもの
>BODY [email protected]
>BODY [email protected]
>BODY [email protected]
コレはコマンドで指定したファイルから出力したもの
たとえば
{
print "BODY\t"$0
}
としてやれば明らか
0435デフォルトの名無しさん
2011/01/06(木) 13:46:53コマンドライン引数を追加したいという事ですか。
コマンドライン引数の配列は ARGV ですが、コマンドライン引数の
個数を格納する ARGC という組み込み変数があります。
ARGV配列を追加したら一緒に ARGC を修正してあげないと、awkは配列が
追加された事を認識しません。
BEGIN内でARGV配列を追加した分だけARGCをインクルメントしてあげれば
追加されたARGV配列で指定されたファイルも本文の処理に渡されます。
蛇足としては、
現在処理中のファイル名が格納されている配列 ARGV のインデックスを
示す組み込み変数は ARGIND です。
私のは Win版の gawkm115 です。スクリプト内でARGV/ARGCを操作しても
期待通り正常に動きますよ。
試してみてね。
0436430
2011/01/06(木) 23:56:01>>433
>これは全角スペース
お恥ずかしい限りです(汗) 出勤前に思いつきで試したもので、スレ用に書いた
物をそのままコピってました・・・
>>434
BEGIN句のgetlineではARGV[1]への代入ができているのに、本文では有効に
ならないという事を伝えたかったのです。
0437430
2011/01/06(木) 23:56:17自分の質問を見直してみると全く質問になっていなかったにも関わらずエスパー
してくださってありがとうございます。
ARGCについて理解できました。
BEGIN{
ARGV[1]="hoge.txt"
ARGC=2
}
ARGV[1]=="hoge.txt"{
print "BODY\t"$0
}
こんな感じで意図した通りに出力されました。
おかげさまで今までawkの補助としてshを使ってましたが、awkだけで書ける事が
多くなりました。
引数にワイルドカードを指定して、ARGIND で特定パターンのファイル名の
物のみ処理をするとかできそうですね。
0438デフォルトの名無しさん
2011/01/09(日) 22:38:39My Documents\2011\01\09(日)
というようにフォルダを切っていて、今日にcdするために、
today.bat
gawk -f today.awk > tmp.bat
tmp.bat
del tmp.bat
today.awk
BEGIN{year = strftime("%Y",systime()+9*60*60);
month = strftime("%m",systime()+9*60*60);
date = strftime("%d",systime()+9*60*60);
day = strftime("%a",systime()+9*60*60);
gsub(/(Sun)/, "(日)", day);
gsub(/(Mon)/, "(月)", day);
gsub(/(Tue)/, "(火)", day);
gsub(/(Wed)/, "(水)", day);
gsub(/(Thu)/, "(木)", day);
gsub(/(Fri)/, "(金)", day);
gsub(/(Sat)/, "(土)", day);
print "cd \"My Documents\" year "\" month "\" date day
}
というように処理しています。
これって、ひょっとして、gawkの内部からprintせずに実行することは可能でしょうか?
0439デフォルトの名無しさん
2011/01/09(日) 22:54:330440デフォルトの名無しさん
2011/01/09(日) 23:06:13とかではだめでした。
0441デフォルトの名無しさん
2011/01/10(月) 03:54:21なんか " と \ の数がおかしくね?
My Documents\2011\01\09(日)
↓
"My Documents\\2011\\01\\09(日)"
↓
"My Documents\\" year "\\" month "\\" date day
だよな?
0442デフォルトの名無しさん
2011/01/10(月) 11:42:11はい。
\はおっしゃるとおりですが、依然としてだめです。
today.batをコマンドプロンプトから実行すると、
printしてそのtmp.batを実行する438のパターンだと、
ちゃんとcdできて、今日のフォルダに移動するのですが、
system("cd \\"My Documents\\" year "\\" month "\\" date day);
だと、移動せずに終了してしまいます。
なんでだろーな。
0443デフォルトの名無しさん
2011/01/10(月) 12:32:20systemはshで動くっぽいので
rm /cygdrive/c/Documents\ and\ Settings/test.txt
みたいに書くとちゃんと消えるみたい
0444デフォルトの名無しさん
2011/01/10(月) 13:24:47438で書いてるgawkでやりたいことってのはバッチファイルでやってるのと同じこと?
だったら無理。
system() でcdしてもsystem()から返ってきたところで元に戻る。
0445デフォルトの名無しさん
2011/01/11(火) 01:15:490446デフォルトの名無しさん
2011/01/11(火) 09:05:01なるほど。gawk内部ではシステムを実行していても、gawkを出ると、それも終わっちゃうんですね。なるほど。
よくわかりました。ありがとうございます。
0447デフォルトの名無しさん
2011/01/19(水) 02:44:33非効率極まりない
0448デフォルトの名無しさん
2011/01/19(水) 15:27:120449デフォルトの名無しさん
2011/01/19(水) 21:03:100450デフォルトの名無しさん
2011/01/19(水) 23:56:54逆はsprintf("%c", 0x41)とか出来るのにな
0452デフォルトの名無しさん
2011/01/20(木) 09:05:02つord.awk
gawk付属のライブラリで、asciiの範囲の対応表作ってひくという
簡単な仕組み。
0453デフォルトの名無しさん
2011/01/20(木) 23:49:13↑のファイルを実行するとオプションが不正と言われて実行できないのですが
コマンドラインのオプションで指定する以外にやり方はありますか?
0454デフォルトの名無しさん
2011/01/21(金) 05:12:58無理にawkスクリプトにせずに
#!/bin/sh
awk '
#awkコード
'
っていうシェルスクリプトにしたらどうかな
0455デフォルトの名無しさん
2011/01/21(金) 08:45:02linuxだと空白を含んだ全ての文字列が一つの引数として
渡されるので、複数のオプションは渡せない。不便だけど
そういうものなのであきらめてください。素直にシェルを
間に入れるのがいいと思うよ。
0456デフォルトの名無しさん
2011/01/21(金) 12:45:00という処理で、20GBぐらいのin.txtを数百MBぐらいにスリムアップしてます。
問題は、その処理を10本ほど並行に作業させているんですが
topで見てみるとほとんどのgawkプロセスがsleepかstackedになっていて
あんまりもりもり働いてくれません。IOが律速なのでしょうか?
CPUもメモリも最大限積んでます。
0457デフォルトの名無しさん
2011/01/21(金) 12:50:020458デフォルトの名無しさん
2011/01/21(金) 13:26:09これって書き間違い?
0459デフォルトの名無しさん
2011/01/21(金) 13:47:33745_17_70_F3 4 * 0 0 * * 0 0 GGAGTGCCCCACACTTGGAGGCGAGCGCCCGGCAGACTTCCCCGCCGCC &+))8'1%+%-%%'((-)%%)8+,&+*7'+/%5''%%%%%-')-/'%/( XM:i:0
残るデータの例
745_377_43_F3 0 chr1 181855450 255 48M * 0 0 CATGTATGTGGCCAAAGGAACAACGCTATGTTTCCTAAAAGGCCTAGA G`[[`a`ab`^\ZYZ[SIR\Z[L7I_L>HU^bOKSDES[PO9-HNG7= XA:i:2 MD:Z:26C21 NM:i:1 CM:i:3
こういうのが80万行ぐらいあるようです。
0460デフォルトの名無しさん
2011/01/21(金) 13:52:48たぶん、データの格納場所がプログラム実行マシンと別のマシンの
ディスクなんじゃないかな。
ネットワークがビジー状態だと思う。
0461453
2011/01/21(金) 16:09:37ありがとうございました。
挙動を変える組み込み変数も無いようですね。
0462デフォルトの名無しさん
2011/01/21(金) 16:47:10確保されていることと、出力ファイルのサイズやタイムスタンプが徐々に
更新されていることを確認するくらいしかないんじゃないかな。
ローカルディスクでやればもっと早いと思うけど。
0463デフォルトの名無しさん
2011/01/21(金) 17:42:04なるほど。
xgridをつかって、2台のマシンで10本ずつほど並行してgawkを走らせておりました。
NFSをつかって5GBほどの(先ほどは20GBと書きましたが間違いです)in.txtの
のデータを読み込んで、処理後のデータをout.txtに書き出しているので、
ネットワークビジーになってしまうというわけですね。
ネットワークの問題とは。。。
一応、エラーでこけることなく、しゅくしゅくと処理は進むので気にしないことにします。
0464デフォルトの名無しさん
2011/01/21(金) 17:44:39一プロセスあたり5GBのファイルを読み込むので、ネットワークが悲鳴を上げていると。
0465デフォルトの名無しさん
2011/01/24(月) 21:31:500466デフォルトの名無しさん
2011/01/24(月) 21:46:54簡易言語として捉えるかツールとして捉えるかの違いじゃね〜
俺パールよりオークの方が好きだけど。
0467デフォルトの名無しさん
2011/01/24(月) 22:19:29なるほど。まぁ、そんなに複雑なことをこなすスキルを持ち合わせてないからもう暫くawkで遊んでみるか。
0468デフォルトの名無しさん
2011/01/24(月) 23:30:110469デフォルトの名無しさん
2011/01/25(火) 05:02:06言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
0470デフォルトの名無しさん
2011/01/25(火) 11:23:33perlユーザはすべてをperlだけでやろうとする。C/C++/Javaも使うユーザはawkの方を好む。
C/C++/Javaに手を延ばすつもりならむしろawkのほうがいいよ。perlだと自己完結してしまうから。
0471デフォルトの名無しさん
2011/01/25(火) 16:02:25今のawkの使い道はワンライナーをコマンドラインのパイプに混ぜる程度でしよ。
俺は、256倍本の長篇スクリプトをいくつか書いたけど、
当時はまだperlなんて使われてなかった。時代が違う。
0472デフォルトの名無しさん
2011/01/25(火) 18:11:52それは偏見だろ
autoconfなどの非常に基本的なツールでもPerlが使われているし
opensslのようにconfigureの(主にWindows用の)ポータビリティを上げるために
Perlを利用しているものもある
言語の適性をわかった上で適材適所で使えばいいんだよ
0473デフォルトの名無しさん
2011/01/25(火) 21:08:21「米ベル研究所特別名誉技師のデニス・リッチー博士(69)と米グーグル社特別技師のケン・トンプソン博士(67)」
毎日jp - 毎日新聞のニュース・情報サイト
http://mainichi.jp/select/science/news/m20110126k0000m040012000c.html
0474デフォルトの名無しさん
2011/01/25(火) 21:29:34>時代が違う。
時代と言う意味では、最近はデフォで Python が入っていたりするので
Perl を使うなら Python を選んじゃうな。
あんまり速さを競う仕事をしていないのと、ワンライナーを書く事が
多いので、awk も絶賛大活躍しているけど。
Perl がフルセットの言語なら awk は DSL みたいな物で、個人的には
awk の方が気安く書ける気がする。
0475デフォルトの名無しさん
2011/01/25(火) 21:57:07-cで引数に一応コマンド渡せるけど、インデントの問題があるし、
perlの-pや-nみたいに標準入力のループ渡せないから。
0476デフォルトの名無しさん
2011/01/25(火) 22:04:34次のようなテキストがあるとします
aaaaa 10 20 10 5
aaabb 5 10 10 10
aaabb 5 5 5 5
aabaa 5 20 20 30
aabbb 10 10 5 5
bbaaa 10 10 10 10
bbbaa 5 10 10 5
bbbbb 10 5 5 30
ここで、aaaaaなどは個人の名前でかつ、3文字目までが姓、4〜5文字目が名前、また数字が出費だとして
各世帯の出費を出力したいと考えています。
aaa 20 35 25 20
aab 15 30 25 35
bba 10 10 10 10
bbb 15 15 15 35
となって欲しい訳です。
0477デフォルトの名無しさん
2011/01/25(火) 22:18:47substr($1,1,3) で姓を判定して
同じ姓なら、世帯を加算して行く
違う姓になったタイミングで1つ前の家の家計を print して
さらに各出費を初期化する
次の行に移って同じ世帯なら加算
という感じでスクリプトを組みたいんですが根本的なところでやり方が不味いでしょうか?
0478デフォルトの名無しさん
2011/01/25(火) 22:34:21name[$1] += 1
0479デフォルトの名無しさん
2011/01/26(水) 01:13:08全て連想配列に溜め込んで、 最後で一気に出力した方が良くないか?
>>477 の方法だと、 出力を行う箇所が
"姓が変わったとき" と "テキストが終わったとき" に分散してしまう。
{
a = substr($1,1,3);
b[a] += $2;
c[a] += $3;
d[a] += $4;
e[a] += $5;
}
END {
for (f in e) print f,b[f],c[f],d[f],e[f];
}
0480デフォルトの名無しさん
2011/01/26(水) 20:18:53OS(Linux)をデフォだけで使うことはまずありえなくて、
何かしら追加パッケージが必要になるはずだから、
Pythonがデフォで入っている事は実用面で評価対象にはならんと思う。
自分はDebianをメインに使うけど、インストール時にはベースシステムだけを選び、
それにsshdとrubyを追加するのがデフォなんで気にならない。
MacならPython/Rubyともデフォで入ってるから無問題だし、
Winならどちらもデフォじゃ入っていないから同じ。
また日常的なプログラミングに関して、Rubyの場合は以下のようにリスト構造を
シェルのパイプライン感覚で書けるのが嬉しい。
hoge_list.select { |x| ....}.sort { |x,y| .... }.map { |x| .... }.inject(n) {|x, i| .... }
ブロック(クロージャ)の無いPyton/Perlでは、こういったお気軽な書き方はできない。
だから日常的な活躍度で比較すると、自分の場合は、bash > awk > ruby になる。
基本はbashで、面倒な文字列処理があればawkをワンライナーで埋め込むのがパターン。
で、色々と機能を追加してきてbashプログラミングが重荷に感じられるようになり、
なおかつ汎用性のある(再利用の可能性がある)ツールであれば、一気にrubyに書き換える。
Pythonは本格的な開発であれば(Rubyよりも)優れた面が多々あると思うけど、
(>>475の指摘も含めて)お手軽さ/お気軽さに限ると(Rubyよりも)使いづらく感じる。
もちろんbashスクリプト(or Makefile)に埋め込むワンライナーであれば、awk がベスト。
0481474じゃないけど
2011/01/26(水) 21:22:28業務で使う事が多いRHELは余計な物はほとんど入れてない。
Python、Perlがデフォで入ってる感じ。
昔、UNIXを扱ってた頃はPerlならデフォで入ってたので、覚えようとしたけど結局身につかず。
sh、sed、awkでがんばってた。
0482デフォルトの名無しさん
2011/01/27(木) 00:10:46デフォで入っているのが嬉しいのは、自分の環境だけでなく、他人の環境でも
使える事が保証されている事だよ。誰かに使ってもらう為のコードを書く時に、
パッケージの追加をお願いしなくて良いのはとても楽。特に、それが仕事で
使われている環境なら尚更。
サポートやトレーニングの仕事をした事がある人なら理解してもらえると思う。
0483デフォルトの名無しさん
2011/01/27(木) 03:47:360484デフォルトの名無しさん
2011/01/27(木) 05:04:18そのちょっと複雑版として使うならPerlかな。
組み込みライブラリがテキスト処理に特化してるから。
Pythonは正規表現が言語に組み込まれてなかったりと
テキスト処理は若干やりにくい印象が強い。
その分、テキスト処理以外なら結構使うけどね。
0485デフォルトの名無しさん
2011/01/27(木) 05:27:26ああ、それ分かるわ。業務マシンとして使う商用UNIX(HP-UX/Solaris/AIX)だと
RubyどころかPython/Perlすらデフォじゃ入っていないし、そういった
フリーソフトの類いは原則として一切インストール禁止という環境もある。
(Web/MailといったInternet系サーバは別ね。あくまで業務マシン限定の話。)
だから商用UNIXユーザは、デフォで入っているツールに長けることになる。
やっぱり本物のUNIXプロを自称するのなら、python/rubyではなくsh/awkだし、
emacs/vimではなくvi、latexではなくroffを選ぶべきだよね。
0486デフォルトの名無しさん
2011/01/27(木) 06:50:40>Pythonは正規表現が言語に組み込まれてなかったりと
へ?
0487デフォルトの名無しさん
2011/01/27(木) 07:07:12ん?言語には組み込まれてないだろ?ライブラリとして組み込まれてるだけで。
だから正規表現リテラルとか無いし、importなしには使えない。
0488デフォルトの名無しさん
2011/01/27(木) 07:10:470489デフォルトの名無しさん
2011/01/27(木) 07:13:350490デフォルトの名無しさん
2011/01/27(木) 07:16:170491デフォルトの名無しさん
2011/01/27(木) 09:03:47Solaris はデフォで Perl も Python も入ってるよ
もちろん入れない事も出来るけど
0492デフォルトの名無しさん
2011/01/28(金) 15:46:44それは簡易インストールで用途としてデスクトップあるいはインターネットサーバを
選択した場合の話じゃないのかな。基本システムにperl/pythonは含まれていないはず。
その簡易インストールも含めてデフォであるとするなら、Debianも同じ。
カテゴリでデスクトップを選べば「rubyもデフォ」でインストールされる。(RHLは知らん)
自分は余計な物は入れたくないから基本システムを選んでるけどね。
高可用性を要求される基幹業務システムの場合、自分はHP-UXを扱うケースが多いけど、
デフォでは基本システムを選び事前に設計したパッケージのみを追加するのが鉄則。
なぜならメーカのサポートが受けられない、あるいはあからさまに嫌な顔をされるから。
そんな環境だと、「真にデフォ」なsh/csh/sed/awkが大活躍していたりする。
0493デフォルトの名無しさん
2011/01/28(金) 17:06:59Solaris のデフォルトは "Entire Distribution" というパッケージのセットだよ。
インストーラーでデフォルトで選択されているのがこれだし、プリインストール
されているのもこれに近いもの。そこには Perl も Python も入ってる。
インストールする際の選択肢で "Core System" を選べば Perl や Python は
入らなかったと思うけど、これをデフォルトと呼ぶのはちょっと無理があると思うわ。
それと、簡易インストールとかカテゴリでデスクトップとか真にデフォと言った物は
Solaris には存在しない。Debian は知らん。
0494デフォルトの名無しさん
2011/01/28(金) 20:11:4015年くらい前のHP-UXだとPerlが入ってなかった記憶が。
0495デフォルトの名無しさん
2011/01/29(土) 00:42:190496デフォルトの名無しさん
2011/01/29(土) 00:47:550497デフォルトの名無しさん
2011/01/29(土) 07:33:120498デフォルトの名無しさん
2011/01/29(土) 10:56:30nawkとgawkの仕様差が結構あるので、awkは使いにくい。
0499デフォルトの名無しさん
2011/01/29(土) 13:15:510500デフォルトの名無しさん
2011/01/29(土) 13:40:550501デフォルトの名無しさん
2011/01/29(土) 14:15:090502デフォルトの名無しさん
2011/01/29(土) 16:56:120503デフォルトの名無しさん
2011/01/29(土) 18:47:153つ別々なのが入ってた気がするな。
で、一番まともなのが3番目なので、よそから持ってきたスクリプトは、先頭の#!を
書き換えないといけないという、カオスな状態じゃなかっただろうか。
0504デフォルトの名無しさん
2011/01/29(土) 19:23:53自分アカウントのパスは真っ先に /usr/xpg4/bin/を持ってきてたわ。
0505デフォルトの名無しさん
2011/01/29(土) 19:25:17他人のスクリプトを丸パクリする機会が無いのでカオスは感じた事が無い
0506デフォルトの名無しさん
2011/01/29(土) 19:32:53話の流れが>>497 >>498なので、可搬性が問題なんだよ。
0507デフォルトの名無しさん
2011/01/29(土) 19:39:080508デフォルトの名無しさん
2011/01/30(日) 05:43:19だろ常考
0509デフォルトの名無しさん
2011/02/01(火) 10:39:45複数の引数の扱いとか、環境変数をそこまで信用して良いものなのかとか
あと /usr/bin/ に env があることは本当に保証できるのかとか
/bin/sh を書いたほうが良いんじゃないかって思ってしまう
0510デフォルトの名無しさん
2011/02/01(火) 11:45:20>調べてみたら#!にインタープリタの引数を2つ以上与えたときの
>挙動はOSによって違うようだった。
>
>FreeBSD4.2: 2つ以上あっても渡る(/usrbin/env gawk -f foo)
>Linux(2.6.8): 空白を含めて1つの引数として渡る(/usr/bin/env "gawk -f" foo)
>Soraris(5.8): 2つめ以降の引数は無視(/usr/bin/env gawk foo)
>
>結局/usr/bin/env使った書き方はgawkのインストール位置の差を
>吸収しようとしてるんだろうが、動作はOSによっててんでばらばら
>なのであまりお勧めできないということだろうか。
0511デフォルトの名無しさん
2011/02/02(水) 00:12:39意味も判らず「おまじない」と称して使ってるうちに
都市伝説化していくんだな
0512デフォルトの名無しさん
2011/02/03(木) 22:33:59tr("A-Z","A-Z")とかしたいぞ
0513デフォルトの名無しさん
2011/02/04(金) 03:31:020514デフォルトの名無しさん
2011/02/04(金) 09:10:06BEGIN {
hankaku="0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z "
zenkaku="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
}
{
for (i=0; i<length(hankaku); i+=2) {
gsub(substr(hankaku,i+1,1),substr(zenkaku,i+1,2))
}
}
0515デフォルトの名無しさん
2011/02/04(金) 09:20:390516デフォルトの名無しさん
2011/02/04(金) 09:54:400517デフォルトの名無しさん
2011/02/04(金) 19:22:210518デフォルトの名無しさん
2011/02/05(土) 20:23:34A-Zあ-ん
こういう表記で置換する方法ある?
0519デフォルトの名無しさん
2011/02/05(土) 20:37:26tr 使えば?
0520デフォルトの名無しさん
2011/02/06(日) 03:05:39Ubuntu10.04に入ってるtr(GNU coreutils)7.4はどうやら2文字扱いにしちゃうらしいが
MacOSX10.5に入ってるtr(バージョン判らんがman見るとBSD系ぽい)は1文字扱いにしてくれた
0521デフォルトの名無しさん
2011/02/06(日) 05:00:06mbcs = バイト数
0522デフォルトの名無しさん
2011/02/07(月) 08:10:44gnome-terminalはユニコード設定のはずなんだが…
他にやらなきゃいけないことがあるってこと?
0523デフォルトの名無しさん
2011/02/09(水) 23:11:37http://awk.info/?doc/dsl/awkplusplus.html
0524デフォルトの名無しさん
2011/02/10(木) 14:20:51いろんな言語を触っては挫折・・・触っては挫折・・・を繰り返していました。
awkは何となくマスター出来そうな気がします。
これから頑張ります!!
256倍の本を今は読んでおります。
0525デフォルトの名無しさん
2011/02/16(水) 02:02:44{split($0, a);asort(a);for(i=1;i<NF;i++){printf("%s%s", a[i], FS);}printf("%s\n", a[NF]);}
よりもスマートな方法ある?
$1〜$NFが入った特殊配列みたいなのがあったらうれしいのだが。
0526デフォルトの名無しさん
2011/02/16(水) 07:22:58$iとか書けるし代入もできるから
$1〜を保存しなくていいのなら、後半は
for(i=1;i<=NF;i++){$i=a[i]} print
と書けばちょっと短くなるな。
0527デフォルトの名無しさん
2011/02/16(水) 12:11:40なるほど、そうできるのか。ありがとう。
0528デフォルトの名無しさん
2011/02/17(木) 01:07:36win32用gawkがいつの間にか公開停止になっていた。
wn32のgensubが使えて日本語が扱えて、
かつexeのみで稼動するのでインストール不要なのが便利で
公私にわたって愛用していたので、非常に悲しい・・・
0529デフォルトの名無しさん
2011/02/17(木) 02:14:57↑とは違うの?
0530デフォルトの名無しさん
2011/02/18(金) 11:30:36gawk-mbcs-win32-20090920.zip が手元にあるので必要なら再配布するが?
0531528
2011/02/19(土) 01:36:10もし私に言ってくれているのであれば、
exeのみだけど2009/11/24版が手元にあるので、
これを使い続けようと思う。ありがとう。
0532デフォルトの名無しさん
2011/02/19(土) 08:18:59欲しい人がいて、かつ再配布に問題無いという事がわかればどっかにうpするが。
しかしなんで配布やめちゃったんだろね。
どこからか拝借したコードとかのライセンス問題なのかな?
0533デフォルトの名無しさん
2011/02/19(土) 22:51:02.65http://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
awk++は面白そうだけど、現実にはawkでOOをやる人はほとんどいないだろう。
そもそもawk使いはOOを理解できない高齢者がほとんどだし。
でも、gawkがデフォルトでOOに対応すればawkでオブジェクト指向する人も増えるかもね。
0534デフォルトの名無しさん
2011/02/19(土) 23:05:51.24デフォでインストールされるawkでできる範囲のことしかやらないよ
0535デフォルトの名無しさん
2011/02/20(日) 00:59:51.51長めのスクリプトを書いた事があったのでOOあると便利と思うけど
わざわざインストールするならperl、ruby、pythonがあるしなぁ
0536デフォルトの名無しさん
2011/02/22(火) 10:31:51.000537デフォルトの名無しさん
2011/03/02(水) 23:14:41.35例えば「awkについて語るスレ」だったら
"について" "るスレ" を変数に入れたいのですが、いい方法ありますでしょうか?
0538537
2011/03/02(水) 23:17:39.070539デフォルトの名無しさん
2011/03/02(水) 23:27:45.29漢字も抜くのは難しいな。
それに、事実上変数は無限に生成するって事か。
0540デフォルトの名無しさん
2011/03/02(水) 23:58:57.500541デフォルトの名無しさん
2011/03/03(木) 13:28:46.50gsubの検索文字鉄には正規表現を使用することができるから、
ひらがなとカタカナ以外の文字をスペースに置き換える。
gsub(/[^ーぁ-んァ-ン]/," ")
ひらがなとカタカナ以外の文字は半角スペース2つに置き換わる。
あとはNFを見て表示したいように処理する。
注意すべきは、Windows版の新しいバージョンのものでは、
正規表現として、ひらがなを ぁ-ん で、カタカナを ァ-ン で
指定できないものがあります。
たしかマルチバイト拡張で壊された。
0542537
2011/03/03(木) 14:28:35.14まだ試してませんが、欲する文字以外を消してゴニョゴニョすればいけそうです。
>539-540さんもありがとうございました。
0543デフォルトの名無しさん
2011/03/03(木) 19:41:21.36str = "デンコ漢字ばんざい元気abcdeだから"
c = split(str, a, "[^ーァ-ンぁ-ん]")
for (i = c; i>=1; i--) {
if ( a[i] !~ /^$/ ) { print a[i] }
}
}
0544デフォルトの名無しさん
2011/03/03(木) 19:44:47.654行目は普通に
for ( i = 1; i <=c; i++) {
でOK。
0545デフォルトの名無しさん
2011/03/03(木) 22:55:52.84for (i in a){if (a[i]) print a[i]}
で間に合うような。
0546デフォルトの名無しさん
2011/03/04(金) 01:04:03.520547デフォルトの名無しさん
2011/03/04(金) 08:34:52.750548デフォルトの名無しさん
2011/03/07(月) 14:14:11.11b1 b1 b1 b1
c1
d1 d2 d2
....
のように、フィールド数がバラバラで、フィールドが一致する場合もあれば
一致しないデータがあるのですが、重複を
a1 a2 a3
b1
c1
d1 d2
のようにまとめあげるにはどうしたらよいでしょうか?
さすがにググってコピペという訳にもいかず。。。
0549デフォルトの名無しさん
2011/03/07(月) 14:31:25.16いろいろやり方はあると思うが
awk '{j=0;delete a;for(i=1;i<=NF;i++){if(!a[$i]++){$(++j)=$i}}NF=j;print}'
0550デフォルトの名無しさん
2011/03/07(月) 14:53:42.21それぞれ、4つ重複データのあったものは3つに、2つのものは1つにと減ったのですが
それ以上減ってません。同じコマンドを繰り返しかけてみたのですが、変化はなかったです。
a1 a1 a1 a1
b1 b1 b1
...の部分が
a1 a1 a1
b1 b1
にはなったという意味です。
もう少しおつきあいいただけないでしょうか。。。
0551デフォルトの名無しさん
2011/03/07(月) 15:06:41.15行ごとにフィールドの添字についてループするのと連想配列で出現チェックがキモ。
% cat hoge.txt
a1 a1 a1 a2 a2 a3
b1 b1 b1 b1
c1
d1 d2 d2
% awk '{j=0;delete a;for(i=1;i<=NF;i++){if(!a[$i]++){$(++j)=$i}}NF=j;print}' hoge.txt
a1 a2 a3
b1
c1
d1 d2
0552デフォルトの名無しさん
2011/03/07(月) 15:14:33.260610007C21Rik 0610007C21Rik 0610007C21Rik 0610007C21Rik 0610007C21Rik
こういう感じの文字列なんですが
a1とかb1で例えても大丈夫だったですか?
0553デフォルトの名無しさん
2011/03/07(月) 15:38:11.62出るようじゃもうすこし基礎を勉強しないとだめかもなぁ。
0554デフォルトの名無しさん
2011/03/07(月) 15:50:13.69UNIX環境なのかな〜
0555デフォルトの名無しさん
2011/03/07(月) 15:58:11.87>>551はそのままうまく動きました。
いま昇順で手動で作業してますが、まだzを抜けることができません。
もう手がつりそうです
0556デフォルトの名無しさん
2011/03/07(月) 16:04:33.750557デフォルトの名無しさん
2011/03/07(月) 16:21:10.50一応、ファイルをおいてみます。。。
http://www5.puny.jp/uploader/download/1299482386.zip
パスは1234です。
0558デフォルトの名無しさん
2011/03/07(月) 17:18:15.93ファイルの ^M が問題みたいだから
CRLFのファイル形式に変換して上の一行野郎で問題ないみたいだったよ。
0559デフォルトの名無しさん
2011/04/19(火) 03:07:46.46$11~/OUT/{ prev=$0; }
$11~/IN/{
if(prev!=""){ print prev; print; }
prev="";
}
0560デフォルトの名無しさん
2011/04/19(火) 15:55:50.78NR >= 2{
if($0 ~ /^>'=+/){
if($0 ~ /~$/){
print "A";
}else{
print "NAA";
}
}else if($0 ~ /^>\^(Q=)+/){
if($0 ~ /~~$/){
print "B";
}else{
print "NAB";
}
}else{
print "NAC";
}
}
7.txt
3
>'======#======~
>^Q=Q=Q=Q=Q=Q=Q=Q=~~
>'===#====~
NAA
NBB
NAA となる。何で?
A
B
A となってほしいのに・・・gawk 3.1.7です・・
0561デフォルトの名無しさん
2011/04/19(火) 16:30:51.01行末がらみだと改行コードが違ってたり見えない空白が
入ってたりというのがよくあるので確認してみ。
0562デフォルトの名無しさん
2011/04/19(火) 16:32:43.45あと
/^>'=+/
ってキャプチャとかしてるわけじゃないから+は無駄じゃないか。
0563デフォルトの名無しさん
2011/04/19(火) 16:45:20.75ありがとうございました。改行コードをunix形式にしたら出来ました。
今後ともよろしくお願い致します。
0564デフォルトの名無しさん
2011/04/19(火) 17:00:39.34INがあるときにしかprevがクリアされていないから、OUTが出現した以降に
複数行が経過してもINが出現するとprintされるスクリプトになっているよ。
0565559
2011/04/20(水) 01:08:11.06とかの入力をイメージしてたもので...
$11~/OUT/{ prev=$0; }
$11~/IN/{
if(prev!=""){ print prev; print; }
}
$11!~/OUT/{ prev=""; }
0566デフォルトの名無しさん
2011/05/01(日) 16:22:39.39#2列目の項目がdisk1〜4まで不足部分が埋まるようにし、不足していた部分の1列目には前の時間、3列目には0で埋めたい
BEGIN{ dt=prevDt="00:00:00"; }
NF>=3{ dt=$1; tgt=$2; n=$3; }
NF==2{ tgt=$1; n=$2; }
{ gapDisp(prevTgt,tgt); disp(dt,tgt,n); prevDt=dt; prevTgt=tgt; }
END{ gapDisp(tgt,"disk1"); }
function disp(dt,tgt,n){ print dt, tgt, n; }
function gapDisp(disk,endDisk, cnt)
{
for(cnt=add(getNo(disk)); cnt!=getNo(endDisk); cnt=add(cnt)) disp(prevDt, sprintf("disk%d", cnt), 0);
}
function add(cnt){ return ((++cnt>4)?(1):(cnt)); }
function getNo(disk){ sub(/disk/,"",disk); return disk; }
0567デフォルトの名無しさん
2011/05/01(日) 19:40:09.87NF == 2 { $3 = $2; $2 = $1; $1 = last_t }
{ last_t = $1 }
{ if ($2 < last_disk) { p(); reset() } last_disk = $2 }
{ n[$2] = $3 }
{ for(i in n) { if (i >= $2) { t[i] = $1 } } }
END { p() }
function p() {
for (i = 1; i <= 4; i++) {
d = "disk" i
print t[d], d, n[d]
}
}
function reset() {
for (i = 1; i <= 4; i++) {
d = "disk" i
t[d] = t["disk4"]
n[d] = 0
}
}
0568デフォルトの名無しさん
2011/05/03(火) 14:58:05.53しかも長くて美しくないよ
0569デフォルトの名無しさん
2011/05/03(火) 15:13:19.32...こんな感じかねぇ? awk -f sum.awk データ | sort
----- sum.awk -----
$1!~/商店名/{ tbl[$1 "," $2]+=$3; }
END{
for(key in tbl){
split(key, item, /,/);
print item[1], item[2], tbl[key];
}
}
-----
0570デフォルトの名無しさん
2011/05/03(火) 15:33:28.80NF==3 {
disp();
for(i=1;i<=4;i++) {
disk_time[i]=$1
disk_val[i]=0
}
disk_val[substr($2, 5, 1)]=$3
}
NF==2 {
disk_val[substr($1, 5, 1)]=$2
}
END{
disp()
}
function disp() {
for(i=1;i<=4;i++) {
if(i in disk_time) printf("%s disk%d %s\n", disk_time[i], i, disk_val[i])
}
}
0571デフォルトの名無しさん
2011/05/03(火) 16:12:56.67# 先頭がいきなり "disk2 15" のみで始まったりしなければ
# この初期化は不要。
a = "00:00:00";
}
NF == 3 {
if (NR > 1) put();
a = $1;
b[$2] = $3;
}
NF == 2 {
b[$1] = $2;
}
END {
put();
}
function put( i) {
for (i = 1; i <= 4; i++) {
print a, "disk" i, b["disk" i] + 0;
b["disk" i] = 0;
}
}
0572デフォルトの名無しさん
2011/05/03(火) 16:20:05.55先にsortしたらどうかな? sort データ | awk -f sum.awk
----- sum.awk -----
$1!~/商店名/{ if(store==$1 && item==$2) val+=$3; else{ disp(); store=$1; item=$2; val=$3; } }
END{ disp(); }
function disp(){ if(store!="" || item!="") print store, item, val; }
-----
0574デフォルトの名無しさん
2011/05/06(金) 00:54:22.24CYGWIN_NT-6.1 1.7.9(0.237/5/3)
$ awk --version
GNU Awk 3.1.8
この環境で、
awk 'BEGIN {for(i=j=1;i<50;++i) {print j; j*=10}}'
これ実行すると、jが23桁超えたあたりから、おかしくなるんだけど。
awkの整数って上限あるの?(ウチだけか?)
0575デフォルトの名無しさん
2011/05/06(金) 01:09:59.270576デフォルトの名無しさん
2011/05/06(金) 09:18:39.10おれのPCでは普通に 1 から 1e+048 まで表示されますが。。。
0578デフォルトの名無しさん
2011/05/06(金) 11:30:10.09本当ですか!よろしければ環境を教えてください。
>>577
ありがとう。ここawkも張れたんだ。結果が長すぎて困ってたのよ。
正にこんな結果になる。
POSIXで保障されてる精度は>>575ってこと?
てことは、awkは内部では、全ての数がdouble扱いなの?
0579デフォルトの名無しさん
2011/05/06(金) 14:20:04.87576です。WindowsXP + GNU Awk 3.0.6 + multi-byte extension 1.15 です。
0580デフォルトの名無しさん
2011/05/06(金) 18:58:28.81ありがとう。
あまり違いがないな。Win7は関係ないだろうし。
multi-byte extensionがその辺りも弄っているのか…
そういえば、1e+048みたいな指数で表示されるの?
出力のとき丸めるから、ちゃんと計算できてるように見えるのかな。
0581デフォルトの名無しさん
2011/05/06(金) 23:07:48.20ですからその精度である53bit分、大体15桁ちょっとを超えると正確な値を保持できません。
23桁あたりまで正しく表示できてるってのはよくわかりませんが、
3.0.6にしても出力時の書式指定が違うだけで内部的には同じように不正確な値に
なってしまってると思います。
0582デフォルトの名無しさん
2011/05/07(土) 01:38:55.530583デフォルトの名無しさん
2011/05/07(土) 11:11:15.94「実質」というのはどういう意味?
#define AWKNUM double
ってのがあるし、long double にしても仮数部は64bitだから23桁には足りないよ?
x87のレベルで拡張精度になってても、表示やらなんやらするところで倍精度に
丸められちゃうと思うんだけど。
0584デフォルトの名無しさん
2011/05/07(土) 13:09:06.68完全に一致。どう見ても double です。本当にありがとうございました
0585デフォルトの名無しさん
2011/05/07(土) 21:19:09.46あう、そうなのかー。ありがとうございます。困ったなぁ。
10進で実数扱えとまでは言わないけど、整数は欲しい。
数をいろんな型で扱える処理系なんてないか。
0586デフォルトの名無しさん
2011/05/07(土) 23:01:38.63あー、long doubleと言ったのが拙かったね。10の冪の場合は実質doubleを大きく越えた精度になっていると言いたかった。
10は2と5の積だから、10倍を繰り返すときに仮数部は5倍ずつにしかならない。
IEEEのdoubleの精度だと5の22乗で53ビットを使い果たすので、そこまでは誤差が生じない。
言い換えれば、10の場合は53ビット+22ビット、即ち75ビット分精度があるように見える。
まぁ、>584を10倍じゃなくて5倍にして、doubleをlong longにして%.fを%llxにしてビット数を数えてみればわかるでしょ。
0587デフォルトの名無しさん
2011/05/09(月) 21:13:05.37print "Serious error detected!" | "cat 1>&2"
という方法しかないとあります。
gawkは/dev/stderrを特別に扱うため、
print "Serious error detected!" > "/dev/stderr"
と書くのが適切とあります。
これには、どのような違いがあるのでしょうか?
/dev/stderrがあるOSなら、catのプロセスが生成される他は、違いはないのでしょうか?
環境や処理系を問わず動作させたいなら、上の書き方の方がよいのか、気になっています。
よろしくお願いします。
0588デフォルトの名無しさん
2011/05/10(火) 00:17:11.81/dev/stderrがあるOSって事ぢゃなくて、
gawkは特殊なファイル名として/dev/stderrとか使えるよ、って事だよ。
なので他のOSでも gawk だったらprintとかの出力先ファイル名として /dev/stderr 使えるって話だね。
/dev/stderrとかをサポートしていないgawk以外のawkでも動作させるなら パイプと"cat 1>&2"を使う方法しかない。が、Win系はcatだと...
0589デフォルトの名無しさん
2011/05/10(火) 09:20:21.36スクリプト言語で書いた方がいいんじゃないかな。こういう
どうでもいいところで悩まなくて済むよ。
awkはawkで手軽に書ける範囲なら他の追随を許さないと思うが
その枠をはみ出ようとすると途端に大変になる。そこが楽しいと
いうのなら無理には止めないけどw
0590デフォルトの名無しさん
2011/05/10(火) 14:35:51.09そう、それが楽しいんだ
0591デフォルトの名無しさん
2011/05/11(水) 00:36:20.77ありがとうございます。
catがない環境だと、どうしようもないですね…
>>589
コンマ区切りのデータを、シェルスクリプトで処理していたので、
それをawkに移植していました。一番手軽だったのです。
ちなみに、2時間半以上かかっていた処理が、1分以内に短縮されました。
ワラタ。 ワラタ…
0592デフォルトの名無しさん
2011/05/11(水) 10:19:43.160593デフォルトの名無しさん
2011/05/11(水) 12:14:45.46C言語とかではあんまり書きたくならんと思うぞw
0594デフォルトの名無しさん
2011/05/24(火) 10:19:27.540595デフォルトの名無しさん
2011/05/25(水) 20:17:22.020596デフォルトの名無しさん
2011/05/25(水) 21:58:46.38gawkの場合インデックスをSUBSEP(=\034がデフォルト)を挟んでシリアライズしたインデックスで多次元配列を表現する
a[0,0] = 1;
ならOKのはず。このときのインデックスは"0\0340"だから、a["0\0340"] == 1。
0597デフォルトの名無しさん
2011/05/26(木) 18:46:04.99ありがとう。始めからそれを意識して書いてたらよかったんだけどね。
god["name"] = "Kaname Madoka"
god["msg"] = "Mahoushoujo ha watashi dakede juubun dayo."
homerun["name"] = "Akemi Homura"
homerun["msg"] = "Madoka ha watashi no yome."
こんな風に書いていたのを、
puella_magi["god"] = god
puella_magi["homerun"] = homerun
みたいにまとめようとしたら、あばばばば
awkの配列って処理系によっては添え字が整数の場合、処理が最適化されて早くなったりするのかな?
構造体の代わりみたいに使いたかったのだが。
0598デフォルトの名無しさん
2011/05/27(金) 00:57:28.69msg["god"] = "Mahoushoujo ha watashi dakede juubun dayo."
name["homerun"] = "Akemi Homura"
msg["homerun"] = "Madoka ha watashi no yome."
でよくね?
0599デフォルトの名無しさん
2011/05/30(月) 21:25:51.88変数が一度も代入されていないことを判定するために、(x==0 && x=="")って書いて何か問題ない?
0600デフォルトの名無しさん
2011/05/30(月) 21:31:52.21評価されるときに変数が存在しなければ作成される。はず
配列の要素なら in で調べられるけど
変数自体となるとどうだろうね
0601デフォルトの名無しさん
2011/05/30(月) 21:32:47.76何度も代入した後、最後に 0 or "" を代入した変数と区別できない。
0602デフォルトの名無しさん
2011/05/30(月) 23:19:06.92ありがとう。区別できないって、どういう状態になるの?0を代入したら0か"0"に評価される。
ああ、""を代入したら0か""に評価されて駄目ってことか!?
0603デフォルトの名無しさん
2011/05/31(火) 00:05:27.970604デフォルトの名無しさん
2011/05/31(火) 06:28:27.99# 初期化直後 (未使用) の変数は数値 (0) と文字列 ("") の両方の型を持つ。
print x == 0, x == ""; # 両方とも真
x = 0;
print x == 0, x == ""; # 前者のみ真。
x = "";
print x == 0, x == ""; # 後者のみ真。
# 他の未使用の変数を代入すると "再初期化" できる。
x = y;
print x == 0, x == ""; # 両方とも真。
}
0605デフォルトの名無しさん
2011/05/31(火) 22:57:53.71IEEE Std 1003.1 の awk の EXTENDED DESCRIPTION の
Variables and Special Variables に書いてあるね。 uninitialized value というらしい。
POSIXに準拠してるawkならこうなるみたいだけど、オリジナルは知らん。
再初期化するなら$(NF+1)使うほうがいいかもね。未使用の変数を用意しなくていい。
だけど、それが必要な場面が思い浮かばないが。
関係ないけど、abs関数ってないんだね。別に良いけど、πや、
0より大きい最小の浮動小数点数は定義しててほしいなあ。
0606デフォルトの名無しさん
2011/06/02(木) 10:09:14.37> 再初期化するなら$(NF+1)使うほうがいいかもね。未使用の変数を用意しなくていい。
フィールド変数は常に文字列型で、 数値型は持たない。
0607デフォルトの名無しさん
2011/06/02(木) 22:47:31.10「0より大きい最小の浮動小数点数」ってどう定義していつ使うの?
0608デフォルトの名無しさん
2011/06/03(金) 13:48:37.95以下の3種類がある。
(1) 最小の正の非正規数
(2) 最小の正の正規数
(3) 1.0に足して丸めた結果が1.0より大きくなる最小の数
0609デフォルトの名無しさん
2011/06/03(金) 23:58:11.26あちゃ!そうでした。$で戻るのは文字列だった。
その仕様書読んでると、NFを拡張したとき、元々なかった所はuninitialized valueになるってあったので。
>>607
それでいいんだけど、PIとかで参照できたらもっといい、と思ったのです。
>>608
数値計算のために、CのDBL_EPSILONの代わりになる定数が欲しいなと。
任意の精度で丸められる関数もないですし。
0610デフォルトの名無しさん
2011/06/04(土) 09:41:48.63数値計算の基本なんだが。
0611デフォルトの名無しさん
2011/06/10(金) 21:49:33.34awkだと、C風が一般的なのでしょうか?
一番最初がVBAだったので、長い名前と省略が混ざってしまって
自分でイライラしています。
みなさんの、通常の変数はこう、配列はこう、定数はこう、文字型はこう・・・
というものを参考にしたいです。
0612デフォルトの名無しさん
2011/06/10(金) 22:10:28.97システムハンガリアンを採用するかどうか悩むほど大きなものをawkで書いたことが無い
0613かあた
2011/06/13(月) 18:37:34.880614デフォルトの名無しさん
2011/06/15(水) 21:51:26.93遅レスだが、型_内容の説明_名前みたくしてる。名前が一文字だとそのままだけど。
グローバル変数とローカル変数のどっち弄ってるのか分かりやすいように、ローカル変数は必ずlで始めるようにしてる。
d_per_shouhizei = 5.0とかね。
0615デフォルトの名無しさん
2011/06/20(月) 18:37:26.17入力されたバイナリーを16進ダンプして表示するにはどうしたらよいでしょうか?
od等の外部コマンドを使う意外に方法があればお教えください。
0616デフォルトの名無しさん
2011/06/20(月) 19:17:07.500617天使 ◆uL5esZLBSE
2011/07/05(火) 00:15:13.83お前らってどうみてもゴミだよな
0618デフォルトの名無しさん
2011/07/06(水) 14:04:55.240619デフォルトの名無しさん
2011/07/14(木) 23:55:15.84gawk4.0.0でa[0][0]=1も可能になったじゃないか
0620デフォルトの名無しさん
2011/07/30(土) 19:46:15.81aaa 10
bbb 20
ccc 30
aaa 30
bbb 30
aaa 15
ccc 30
ddd 20
以下のようにまとめたいのですが、どうしたらいいでしょうか?
aaa 55
bbb 50
ccc 60
ddd 25
0621デフォルトの名無しさん
2011/07/30(土) 19:53:38.97awk '{a[$1]+=$2} END {for (b in a) {print b " " a[b]}}' | sort
0622デフォルトの名無しさん
2011/07/30(土) 23:15:27.520623620
2011/07/30(土) 23:22:20.03ありがとうございます!うまくいきました。
0624デフォルトの名無しさん
2011/07/31(日) 15:24:48.760625デフォルトの名無しさん
2011/08/16(火) 22:48:21.640626デフォルトの名無しさん
2011/08/18(木) 01:56:26.630627デフォルトの名無しさん
2011/08/19(金) 00:53:44.39WIN32のEXE一つで、下のTEST.AWKがマトモに動くAWKを探しています。
これら以外にありますか?
http://hinadori.atnifty.com/~wills/program/gawkm115.zip
http://my.vector.co.jp/servlet/System.FileDownload/download/http/0/376460/pack/win95/util/text/awk/gawk-mbcs-win32-20051223.zip?ds
http://my.vector.co.jp/servlet/System.FileDownload/download/http/0/80308/pack/win95/util/text/awk/mw32r27.lzh?ds
Cygwin版も試したのですがダメでした。
TEST.AWK
{ gsub("[0-9]","x",$0) ; gsub("ソ","ソ",$0) ; gsub("T","T",$0) ; print }
TEST.DAT
アイウエオカキクケコサシスセソ
ココココサフサコココココ
ココココサフサココココ
ココココサフサコココココ
ココココサフサコココココ
サフサフサフサフサフサ
ココココサフサコココココ
ココココサフサココココ
ココココサフサコココココ
ココココサフサコココココ
サフサフサフサフサフサ
0628627
2011/08/19(金) 01:00:20.60専ブラのポップアップをコピペして下さい。
0629デフォルトの名無しさん
2011/08/19(金) 06:26:54.920630デフォルトの名無しさん
2011/08/19(金) 11:02:41.54cygwinのawk(GNU Awk 3.1.8)で動くけど、どうなるはずがどう動かないと言っている?
>627のtest.datなら、当然「ソ」だけが変換されるけど。
0631デフォルトの名無しさん
2011/08/19(金) 11:55:06.25事前にTEST.DATをnkf -wに通したら駄目かな。
0632629
2011/08/19(金) 21:59:57.43スクリプトもDATもSJISで試したけど、上記3つのうち、gawk-mbcs-win32-20051223.zipはダメだったよ。
1行目がこんなんなる。
アxxエオカキクxコサxxxソ
手持ちの
GNU Awk 3.1.7(windows special Nov 24 2009)
で、--ctype=SJISやっても同じ結果になるね。
スクリプト、DATをUTF-8にして、--ctype=UTF8やってリダイレクトしたファイルは正常な結果が出るよ。
リダイレクトしないでコマンドプロンプトに表示させると化けるけど。
0633デフォルトの名無しさん
2011/08/19(金) 23:18:25.140634デフォルトの名無しさん
2011/08/24(水) 08:07:37.54そろそろOOP対応してくれないかな。
awk++とかあるけど、標準でOOPできれは便利。
0635デフォルトの名無しさん
2011/08/24(水) 22:44:37.24...もはやawkでやる意味が無いw 他にいくらでもある別の言語でいいじゃん
0636デフォルトの名無しさん
2011/08/25(木) 01:14:17.45配列や関数への参照を値として取り出し格納したり
逆にその値から元の配列にアクセスしたり元の関数を呼んだり出来ると
相当に複雑なデータ構造が表現可能になる、それこそOOPっぽいことも可能だし
でもあんまりややこしいことやるならPerlでいいから必須ではないね
0637デフォルトの名無しさん
2011/08/25(木) 02:28:23.99変数の値を関数名として
var = "sage";
@var();
ってできるけど、それとは違うのん?
0638デフォルトの名無しさん
2011/08/25(木) 04:07:56.67最近のawkは分からねえ…ってことは、配列への参照を使って入れ子の配列とか既に作れちゃったりするのか?
0639デフォルトの名無しさん
2011/08/25(木) 10:56:54.360640デフォルトの名無しさん
2011/08/25(木) 19:51:33.840641デフォルトの名無しさん
2011/08/25(木) 20:52:51.07property name
property sex
property age
method new(x, y, z) {
name = x
sex = y
age = z
}
method say() {
printf("私は%s。%d歳の%sです。\n",name, age, sex)
}
}
class japanese : human {
property name
property sex
property age
method say() {
printf("私は%s。%d歳の%sです。国籍は日本です。\n", name, age, sex)
}
}
BEGIN {
alice = human.new("アリス", "女", 11)
taro = japanese.new("太郎", "男", 15)
yuka = japanese.new("由佳", "女", 18)
alice.say()
taro.say()
yuka.say()
}
0642641
2011/08/25(木) 20:58:10.41http://code.google.com/p/lawker/source/browse/fridge/lib/bash/awk%2B%2B/
これを使えばこの程度のOOPはどうにかできる。
本当にこの程度でいいからOOPに対応してほしい。
使う人はほとんどいないと思うが、全くできないのも困る。
0643デフォルトの名無しさん
2011/08/25(木) 22:07:53.460644デフォルトの名無しさん
2011/08/26(金) 06:00:04.19self["property___name"] = name
self["property___sex"] = sex
self["property___age"] = age
self["method___say"] = "Human___say"
}
function Human___say(self) {
printf "私は%s。%d歳の%sです。\n", self["property___name"], self["property___age"], self["property___sex"]
}
function Japanese(self,name,sex,age) {
Human(self,name,sex,age)
self["method___say"] = "Japanese___say"
}
function Japanese___say(self) {
printf "私は%s。%d歳の%sです。国籍は日本です。\n", self["property___name"], self["property___age"], self["property___gender"]
}
function methodcall(obj,methodname, m) {
m = obj["method___" methodname]
@m(obj)
}
BEGIN {
Human(alice, "アリス", "女", 11)
Japanese(taro, "太郎", "男", 15)
Japanese(yuka, "由佳", "女", 18)
methodcall(alice,"say")
methodcall(taro,"say")
methodcall(yuka,"say")
}
0645デフォルトの名無しさん
2011/08/26(金) 06:01:35.02とりあえず、こんな感じでgawk4でもOOP自体は出来るよって話
0646デフォルトの名無しさん
2011/08/27(土) 15:07:17.61なるほどねー
とても勉強になります
でも、やっぱりOOP用の構文が使えればベストですね
そのほうがわかりやすいと思います
0647デフォルトの名無しさん
2011/08/27(土) 15:58:44.090648デフォルトの名無しさん
2011/08/27(土) 16:10:36.72これの糖衣構文を用意してくれって投稿するといいんじゃね
switchも実装されてるし、欲しい人が居ると分かれば付けてくれるかもよ
0649デフォルトの名無しさん
2011/08/27(土) 16:25:08.65# -*- coding: utf-8 -*-
class human:
def __init__(self, name, sex, age):
self.name = name
self.sex = sex
self.age = age
def say(self):
print("私は" + self.name + "。" + str(self.age) + "歳の" + self.sex + "です。")
class japanese(human):
def __init(self):
super(human, self).__init__(self)
def say(self):
print("私は" + self.name + "。" + str(self.age) + "歳の" + self.sex + "です。国籍は日本です。")
if __name__ == "__main__":
alice = human("アリス", "女", 11)
taro = japanese("太郎", "男", 15)
yuka = japanese("由佳", "女", 18)
alice.say()
taro.say()
yuka.say()
0650デフォルトの名無しさん
2011/08/27(土) 16:26:25.23>>641と比べると特にわかりやすいわけでもないけど
>>644よりはわかりやすい
0651デフォルトの名無しさん
2011/08/27(土) 16:53:49.92あくまでシェルのお供でいいと思うんだ
そしてそこに高度なOOP機能は要るとは思えない
どちらかと言えばフィールド抽出とかをもっと便利にすべきだよ
0652デフォルトの名無しさん
2011/09/17(土) 15:34:39.290653デフォルトの名無しさん
2011/09/17(土) 16:28:58.780654デフォルトの名無しさん
2011/09/18(日) 08:02:36.95つhttp://www.klabaster.com/progs/gawk32.zip
0655デフォルトの名無しさん
2011/09/19(月) 13:00:55.06>653 awkの実行形式だけ入手すれば良いようにしたいのさ。
0656デフォルトの名無しさん
2011/09/19(月) 14:01:43.390657デフォルトの名無しさん
2011/09/19(月) 16:07:37.39cygwin1.dllだっけ?にパスが通ってれば大体使えたような気がする。
0658デフォルトの名無しさん
2011/09/19(月) 17:00:12.76コマンドによるけど
0659デフォルトの名無しさん
2011/10/24(月) 01:55:49.24http://www.gnu.org/s/gawk/manual/gawk.html#Array-Sorting-Functions
の asort(), asorti()で使うユーザー定義の比較関数について
3番目の引数とPROCINFO["sorted_in"]に設定するのと違うのか同じなのか?
それと
http://www.gnu.org/s/gawk/manual/gawk.html#String-Functions
に書いてある3番目の引数の説明("descending"とか)が両立してんの?
0660デフォルトの名無しさん
2011/10/24(月) 11:34:13.18As with PROCINFO["sorted_in"], this argument may be the name of a user-defined function, ....
http://www.gnu.org/s/gawk/manual/gawk.html#String-Functions
The third argument can also be a user-defined function name ....
第三引数の値と同名の関数が定義済みならそれを利用するとか、
そういう方法で区別してるんじゃないの
0661デフォルトの名無しさん
2011/10/24(月) 13:33:04.59比較関数の与え方はPROCINFO["sorted_in"]の場合と同じってことだろ。
自分で定義した関数の名前でもいいし、11.2.1.2に書いてあるようにすでに用意
されている@〜を使ってもいい。
0662デフォルトの名無しさん
2011/11/14(月) 21:59:05.28GAWKで呼ぶ関数をCで書ける機能が欲しいと思ってるんだけど、
ここ見る限り世間的にはあんまり需要ないんかねぇ。
まぁ、それやるくらいならGAWK自体に変更を加えて再コンパイルしろってことかもしれないけど。
0663デフォルトの名無しさん
2011/11/15(火) 01:44:31.010664デフォルトの名無しさん
2011/11/15(火) 01:58:32.43ttp://www.gnu.org/s/gawk/manual/html_node/Dynamic-Extensions.html
じゃダメ?将来的にさらに拡張される可能性はあるみたいだけど
0665デフォルトの名無しさん
2011/12/09(金) 00:35:09.18■ このスレッドは過去ログ倉庫に格納されています