X



awkについて語るスレ $2
レス数が1000を超えています。これ以上書き込みはできません。
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/
0006デフォルトの名無しさん
垢版 |
2007/02/25(日) 06:34:37
ローカル変数、。
0007デフォルトの名無しさん
垢版 |
2007/02/27(火) 21:39:18
クロージャを持ったawk実装とかないかね
0008デフォルトの名無しさん
垢版 |
2007/02/27(火) 23:45:59
コマンドプロンプトでちょちょっと使うことは頻繁にあるけど
気合い入れてプログラミングするってのは最近無くなった。
0010デフォルトの名無しさん
垢版 |
2007/03/01(木) 00:43:46
トッパンのプログラミング言語AWKがブックオフで105円で叩き売られてるのを見て
なんか悲しい気分になった
0011デフォルトの名無しさん
垢版 |
2007/03/01(木) 16:01:47
>>10
俺もオライリーの「sed & awk プログラミング」本が、図書館の「無料で持ってけー棚」
にあったので、即 GET した。まあ、かなり古い本(1991 年)だけど、内容はいい本だ。
定価 \3800 円のバカ高本で、 たぶん、新書では買わなかっただろう。

トッパンのプログラミング言語AWKって、いつごろの本だったけ。とりあえず、105円なら
欲しいっす。
0012デフォルトの名無しさん
垢版 |
2007/03/01(木) 21:49:42
>>11
赤い表紙の第1版だねきっと。
緑の表紙の第2版が手元にあるけど、gawkで拡張されている
正規表現の説明とか増えてて第2版のほうがお勧め。
ちなみに定価4100円なり。
001311
垢版 |
2007/03/01(木) 23:52:54
>>12
> 赤い表紙の第1版だねきっと。
そう、それそれ。 ほんで、
gensub がない。もちろん、
/inet/..... |& .... もない。

最近、/inet/..... |& .... がある(gawk3.1 から)ことを知って、gawk を見直している。
使い捨てのプログラムは gawk に汁!!。
0014デフォルトの名無しさん
垢版 |
2007/03/02(金) 02:09:03
>>11
トッパンの最初の本なら確か1990年の春頃だったと思う。
一応nawkレベルの記述のはずなんで、gawkなんかの固有の
拡張を除けば十分使えるでしょ。

105円は…ちと悲しいけどいい人に拾われて欲しいねえ。
0015デフォルトの名無しさん
垢版 |
2007/03/02(金) 02:27:22
>>13
gawkの /inet 拡張ってイマイチ使いづらくね?

汎用的なのかもしれないけど、お手軽にhttp経由でwebページの
内容取れればいいってときに記述が面倒。
002015
垢版 |
2007/03/04(日) 03:46:24
>>16
まあ wgetとかcurl使って標準入力から取れよという話もあるかもしれないけど、
http://ほげほげ は特別扱いしてくれるとうれしいなあと思ってる。

まあHTML読んでそれを解析する手間が次に待ってるけどさw
0021デフォルトの名無しさん
垢版 |
2007/03/04(日) 03:55:11
エンコーディング対応とか色々考えると、awkでHTMLを処理しようとするほうが
無理がある感じ。
素直にPではじまる言語とか使っとけば?みたいな。
002219
垢版 |
2007/03/04(日) 04:55:31
>>21
PとかR使えってのはまあそうなんだけど、HTMLの妥当性とかエンコーディングを気にしないで
いい使い道で考えてた(個人的にそういう需要がある)のでね。
HTMLに関してはきちんとしたドキュメントならxgawkでどうにかなる?


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

0024デフォルトの名無しさん
垢版 |
2007/03/14(水) 16:40:22
Visicalcと1-2-3はawkブームより昔からあったんだけどね。
UNIXって意外と古くないんだよね。
0025デフォルトの名無しさん
垢版 |
2007/04/14(土) 08:00:42
>10
発行所が新紀元社の「プログラミング言語AWK」を2005年に定価3465円(税込)で買いました。
奥付に「本書は1989年11月に株式会社トッパンより発行されました。この度、株式会社新紀元社より、原出版社、訳者の許可を得て再発行いたしました。」と書かれています。
0027デフォルトの名無しさん
垢版 |
2007/04/14(土) 13:42:47
大昔に通ってた高専の土木工学科にはawkの授業があった
実験のデータ処理にでも使ってほしかったんだろう
003028
垢版 |
2007/04/17(火) 08:45:33
>29
御回答ありがとうございます。
0037デフォルトの名無しさん
垢版 |
2007/09/04(火) 09:33:02
あー、ごめん、引数並べたやつがローカル変数になる。だった。
先に宣言すればいいんだから別によくね?
0039デフォルトの名無しさん
垢版 |
2007/09/14(金) 04:37:24
これからawkを勉強します。
0041デフォルトの名無しさん
垢版 |
2007/09/15(土) 01:03:04
みなさんawkは語らないのですね。
0047デフォルトの名無しさん
垢版 |
2007/09/19(水) 16:41:49
awkを勉強しているのですが、Perlに慣れているからか
awkでできることはPerlでワンライナーでやったほうが(少なくとも自分にとっては)速い気がしてなりません。
これについてawk熟練者である皆様はいかがお考えになりますか?
こういう時はawkのほうが便利!という例にはどんなものがありますか?
0048デフォルトの名無しさん
垢版 |
2007/09/19(水) 16:43:11
↑あっ速いというのは、コードを書くのが速いという意味です。
0050デフォルトの名無しさん
垢版 |
2007/09/19(水) 16:53:58
「コードを書くのが速い」という基準で、
「こういう時はawkのほうが便利」という例を他人に挙げさせても、
それはその人間にとっての速い気がする便利さであって、
意味のある一般的な議論にならないのではないか?
0051デフォルトの名無しさん
垢版 |
2007/09/19(水) 16:57:51
PerlもRubyもPythonも使うけど、特定のカラムだけに興味があるケースは
無意識にawkを使うこともある。

perl -a とか cutしてpasteとかもあるけど。
0052デフォルトの名無しさん
垢版 |
2007/09/19(水) 18:19:27
>>49 環境によらず入っているということですね。

>>50 そうですね。
なぜawkなのか、
一般的にはどういう時にawkが使われるのか、
というのがイマイチ自分のなかで分かっていないのです。

>>51 少し勉強した限りでは、確かにカラムの取り出しはawkが便利なのかもと思いました。

0053デフォルトの名無しさん
垢版 |
2007/09/19(水) 19:55:33
>>52
シェルスクリプトの中で、貧弱なシェルの計算能力を
補うために、ツールボックスの一つとして使われることが多い。

ので、シェルスクリプトを書く機会が多いのなら、やっておいて
損は無いと思うが、フットプリントが多少デカイこととやや移植性に
欠けることを気にしなければ、別にPerl使ったっていいわけだ
(どうせ今なら大抵は使えるだろうし、awkにしても一応Posix標準だが
色々変種がある)。

ま、単に便利なスクリプト言語が欲しいだけなら、今更awkをやる意味は
ほとんどないだろう。
フィールド分割だけならperl -aでawkの真似ができるしな。
0054デフォルトの名無しさん
垢版 |
2007/09/19(水) 20:06:52
>>53 丁寧なお返事ありがとうございます。
シェルの計算の補助ですか。
シェルスクリプトを書く機会は多少はあるので、多少は覚えておこうと思います。
0055デフォルトの名無しさん
垢版 |
2007/09/19(水) 21:00:04
awkとperl、処理速度はどっちが速いんだろ?
ってオマエが試せって言われそうだけどふと思ったんで書いてみた。
0057デフォルトの名無しさん
垢版 |
2007/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;}'
0058デフォルトの名無しさん
垢版 |
2007/09/19(水) 23:51:16
PerlにたいするAwkの現実的メリットはメモリ消費が少ないことくらいで
これは今の計算機では微々たる問題だ。
ESRのArt of UNIX Programmingを立ち読みしたら
Awkがメモリ節約のために仕様を制限したことが
早期に競争力をなくした理由と論じていた。
バッドな言語設計の見本って感じで、ちと不愉快だった
0059デフォルトの名無しさん
垢版 |
2007/09/22(土) 02:28:36
>>57
俺も時々やる。
その時は便利!と思って.cshrcとかにalias登録するけどすぐに忘れて同じ内容を手打ちしてたりする
その挙句にこれは便利!と思って.cshrc開くと既に登録してあるという…
0063デフォルトの名無しさん
垢版 |
2007/09/28(金) 01:20:24
むかし、「読書するプログラマ」をよんで、awkで会計をするのがかっこ良いと
おもってました。
でも確定申告をする身になったらEXCELを使っている。

「エンジニアのための事務作業 sed awk grep そしてTex」なんて書籍があれば食いつくのに...
0064デフォルトの名無しさん
垢版 |
2007/09/28(金) 02:53:12
awkで会計用スクリプトを書くより、会計のしくみを理解することの方が
俺には遥かに難しい
0068デフォルトの名無しさん
垢版 |
2007/10/02(火) 08:00:10
>>67
体型維持のために余儀なくされている人もいたようです。
指を喉に入れるようにするので、俗に言うげろだこが指にできます。
0069デフォルトの名無しさん
垢版 |
2007/10/03(水) 23:18:59
awkってなんでPerl風に正規表現置換できるようにならんの。独自拡張でもいいんだけどな。
0073デフォルトの名無しさん
垢版 |
2007/11/22(木) 06:36:33
xgawkで多倍長整数を使いたいんですが、
printf( "%ld\n", num );
では桁数は増えても精度は上がってないようです。
型宣言するにはどうするのでしょうか
0075デフォルトの名無しさん
垢版 |
2007/11/22(木) 07:34:48
xgawkは多倍長整数あるんですよね?
で、rubyのように無宣言で使えるかと思ったらそうではないらしいので、
どうするのかと。

http://home.vrweb.de/~juergen.kahrs/gawk/XML/xmlgawk.html
いまこのへん見てるんですが
0081デフォルトの名無しさん
垢版 |
2008/01/04(金) 14:24:54
>80
はじめsedみたいに 10,35{ みたいな感じに書いてダメだったので; }
普通に比較式書くんですね。10<=NR&&NR<=35{ で出来ました; }
ありがとうございます。
0083デフォルトの名無しさん
垢版 |
2008/01/14(月) 09:02:50
awk はオプションなしだとワンライナーのコードを書くことになると思いますが
実際 awk のワンライナーってどんな時に使いますか?
あまり見たことがなくて…
0084デフォルトの名無しさん
垢版 |
2008/01/14(月) 09:45:08
>>83
UNIXでは多くのファイルや出力が欄区切りテキストの形式になっているから
その場使い捨てワンライナーが本来の使い方なんだけど、
他のOSだと BEGIN を main 代わりに使うようなのばっかになるかもね。
0085デフォルトの名無しさん
垢版 |
2008/01/14(月) 09:46:06
>>83がsedをどう使っているのか気になる。
sedスクリプトファイルとか作って、スクリプトの引数に処理対象のファイルを渡してたりするのかな。
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:44
>>85
sedは単体の命令を見て「置換」「行の切り捨て」みたいな用途が
パッと見て思い付くので疑問は沸かないんです。

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:32
よく書く一行
du -k|awk '$1 > 10000'
でかいデレクトリをさがす
0094デフォルトの名無しさん
垢版 |
2008/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";}}
0096デフォルトの名無しさん
垢版 |
2008/02/02(土) 17:48:45
>>94
>↓のソースを書いていただいたのですが、

書いた人に聞く。

と答えると、わけのわからん理由を言ってごねるだろうから、
先に言っとくと、そんな見苦しい言い訳するな。

どうせ答えたって、今度は○○がわかりませんとか言い出すんだろ?
どっかからgawkを落として展開しろよ。全く、一生ググってろよカス
"C:\Program Files\WinRAR\UnRAR.exe" lt *.rar | "gawkのフルパス" -f rr.awk
0097デフォルトの名無しさん
垢版 |
2008/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

と集計したいんですが、どのようにすればいいでしょうか?
009997
垢版 |
2008/02/10(日) 20:22:03
>98さん、ありがとうございます!
情けないのですが、今まで便利なツールに頼っていて全然コマンドについて理解できていなかったので困っていました。
実はメールログで送信者がどれだけの通数を送信してるかを確かめるためにコマンドでできないか、で>97でつまづいていました。
何とか途中までできたんですが、非常にスーパーエレガントな1行コードでして…。

質問ついでで申し訳ないのですが、
(aaa in count) {print aaa count[aaa]}
のaaaについてはどう解釈すればいいのでしょうか?

0100デフォルトの名無しさん
垢版 |
2008/02/10(日) 20:33:27
>>99
bashとかのforとかと同じで適当な文字列ならなんでもいいです.例に出てきたaaaなんかにするからややこしくなってすみません.
for(hoge in list) {...}
で配列listのキーを片っ端からhogeに入れてループするって意味になるはずですよ.
0101デフォルトの名無しさん
垢版 |
2008/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を同じ名前にするのは意地悪だと思うよ

0102デフォルトの名無しさん
垢版 |
2008/02/10(日) 20:37:23
101です。すまんonz
0103≠98
垢版 |
2008/02/10(日) 20:39:44
あー、みんな書いているから私の書いたのは大幅に削るか。
そのENDブロック内は、
for (制御変数 in 連想配列) {...;}
というパターン。

その前段のcount[$1] += $2は一行目のとき
count["aaa"] += 1と解釈される。以下同様に。
このcountが連想配列として使われているということ。
010597
垢版 |
2008/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を並べたところで脳みそのバッファエラーを起こしました。

この処理の方法もエレガントなことは分かっていますが、恥は承知でお伺いした次第です…。
0107デフォルトの名無しさん
垢版 |
2008/02/14(木) 02:38:02
>>106
それはリテラルとして扱ってということかい?
なら全部エスケープすればいいと思うが何か問題があるの?
0108デフォルトの名無しさん
垢版 |
2008/02/16(土) 01:08:44
awkで現在時刻からn分前から以降のログだけを抜き出したいんですが、どうすればいいでしょうか…。
02 15 12:34:56 xxxxxxxxx
02 15 13:45:01 xxxxxxxxx
...
...
...
とかの形式なので、strftime()とかで現在とログの時刻を比較して抜き出す、とかを試したんですがダメでした…
0109デフォルトの名無しさん
垢版 |
2008/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
}
0110デフォルトの名無しさん
垢版 |
2008/02/16(土) 02:23:28
>109

ありがとうございます…素直に目が鱗でした…。

> chktime=substr($0, 1, 14)

なんですね…
perlが使えない環境なので、これが分かればいろいろ流用効くので助かりました。
ありがとうございます。もうちょっと精進します。。。
0111デフォルトの名無しさん
垢版 |
2008/02/18(月) 18:58:36
>>29
昨年6月に「AWKを256倍使うための本」が本屋の書棚にあったので買いました。
奥付に
1993年8月21日初版発行
2007年5月9日 第1版第16刷発行
と書かれています。
0116デフォルトの名無しさん
垢版 |
2008/03/28(金) 21:53:28
sed, awk, ruby を使う。
それぞれ適材適所で使うけど、
「sed だけ」「awk だけ」で済ませられると、
不思議な喜びを感じる。
0117デフォルトの名無しさん
垢版 |
2008/03/30(日) 14:05:33
>>116
うち、AIX使ってるんでksh+sed+awk+perlだな。
rubyが標準でインストールされてる環境ってあんまないと思う。
0119デフォルトの名無しさん
垢版 |
2008/04/06(日) 10:26:45
最近のgawkがネットワークにも使えると知ってちょっと驚いたw
カーニハンの本レベル(とか256倍)しか知らない人って多いと思う。
0120デフォルトの名無しさん
垢版 |
2008/04/06(日) 12:44:41
ノーマルのawkでXMLを字下げしたりしてうまく表示させるにはどうすればいいのかな・・・
0121デフォルトの名無しさん
垢版 |
2008/04/06(日) 17:09:18
sedだけで書けると、俺って頭イイかもって思う。

#!/bin/sed -f
0122デフォルトの名無しさん
垢版 |
2008/04/06(日) 17:16:17
文字列の単純な置換だけならawkより簡単に書けるんだけど。
awkに固執しないで臨機応変にsedを使うって意味でなら要領がいいという意味で賢いけど。
# awkで書いた方が簡単なことをsedで頑張って書いたのだとしたら、その意味では頭悪いなw
0124デフォルトの名無しさん
垢版 |
2008/04/06(日) 18:49:04
>>24
awkって表計算のような処理に特化してますよね。
その点が非常にユニークというか事務処理の言語だな、と。
visicalc(1979)awk(1977)ですからawkのほうが若干古いんですが、
表計算はセルに直接式を書くという発想が新しかった。うむむ。
0125デフォルトの名無しさん
垢版 |
2008/04/06(日) 19:26:56
VisiCalcの考案者Dan Bricklinによるアイデアの説明
ttp://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
はじめましてgawkの質問です
お手すきの時にでもご解答頂けましたら助かります

2chでお話していただいた方からgawkを教えて頂きました
正規表現でマッチした部分がいくつあっても全ての箇所を1アクションで保存できる優れものです
当方、言語は全く知らないので先ほどまでテスト実行しては驚いていました
この優れものを今後末永く使っていきたいのですが
下記の事項をググって見たのですがわかりませんでした
どなたかわかる方おられましたら教えて下さい

私のやりたいこと
・EUCを読み込んでS-JISを出力
・既存のテキスト末尾に追加書き込み保存
(教えて頂いたスクリプトは上書き保存なので出力先の内容が消えてしまいます)

気長に待っていますので何卒よろしくお願い致します
0127デフォルトの名無しさん
垢版 |
2008/04/07(月) 03:10:31
>>126
前者はawkでやるべきことではない。iconv, nkfなどそれ専用のツールがある。
後者も必ずしもawkは不要。コマンドラインが使える環境なら普通にできる。
例えば、Unix系なら cat append.txt >> original.txt で既存のファイルに追加できる。
DOS系でも、type append.txt >> original.txt でできる。
要は、awkのいいところはそれ単体でなんでもできる(或いはできない)ことではなく、
コマンドライン環境で力を発揮するツールであること。

例えば、正規表現でマッチした文字列を置換するだけならテキストエディタでもできる。
あーそうそう、エディタがあれば文字コードの変換もそれだけでできる。
所謂テキストエディタを使ったことがないなら、一度(正規表現検索機能、
文字コード変換機能のある)テキストエディタを触ってみるといいかもしれない。
0128デフォルトの名無しさん
垢版 |
2008/04/07(月) 03:32:54
>>127さん
>>126です
お疲れのところ早々のご解答誠にありがとうございます
コンバートは別のツールで行う
DOS環境ではtype append.txt >> 出力先ファイル名で追加書き込み
了解しました
エディターは秀丸エディターを使っています
コンバートは出来るのですが検索でマッチした文字列は1箇所ずつコピーなんです
sakuraエディターで一括コピーや切り取りが出来ると教えてくれた方もいてたのですが
sakuraエディターは試したことが無いんです
詳しくありがとうございました
0129デフォルトの名無しさん
垢版 |
2008/04/07(月) 03:56:33
AAA.txtを開き”東京(.+?)号室”を検索する
マッチした複数箇所を一括でコピーしてTEST.txtにペーストする

BBB.txtを開き”東京(.+?)号室”を検索する
マッチした複数箇所を一括でコピーしてTEST.txtの末尾にペーストする

CCC.txtを開き”東京(.+?)号室”を検索する
マッチした複数箇所を一括でコピーしてTEST.txtの末尾にペーストする

よろしくお願いします
0131デフォルトの名無しさん
垢版 |
2008/04/07(月) 06:48:34
>>130
質問に具体性がないから一般論を書いただけだけど。

>>129
awk '/東京(.+?)号室/ {print > "TEST.txt";}' AAA.txt
awk '/東京(.+?)号室/ {print >> "TEST.txt";}' BBB.txt
以下同様に。
0132デフォルトの名無しさん
垢版 |
2008/04/07(月) 12:02:34
>>131
レスありがと
gawk '/東京(.+?)号室/ {print > "TEST.txt";}' AAA.txt
gawk '/東京(.+?)号室/ {print >> "TEST.txt";}' BBB.txt
ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。
gawk3.16では使えない?

0136デフォルトの名無しさん
垢版 |
2008/04/07(月) 16:36:42
DOSの場合は空白を含む場合シングルクォートじゃダメだからな。
ダブルクォートで括って中のコードは
シングルクォートか、エスケープしてダブルクォート入れるか。

一番簡単なのは、ワンライナーでもファイルに起こしてしまうこと。
gawk -f myscript.awk AAA.txt
とやってしまえば、シングルクォートとかダブルクォートとか気にする必要はない。
0137デフォルトの名無しさん
垢版 |
2008/04/07(月) 18:22:15
>>132
二つ問題がある。
gawkの正規表現では.+?というのは使えない。
cmd.exeでは、シングルクォートを引数を
くくるのに使えない。

なんかよくわからんが、perlでテキストを丸飲みしてから
処理すればいいんじゃないのか?
0138デフォルトの名無しさん
垢版 |
2008/04/12(土) 19:00:42
VisiCalc といえば、出始めの頃に TRS-80 用 を Radio Shack で見せてもらったんだけど、学生だった私には価値がわからなかったなぁ。
まぁ、これに限らず、『なんでこんなコマンドやオプションがあるんだ?』ってのは多い。
使い方じゃなく、なぜそれがあるのかを包括的に解説した本や web site ってありますか。(たとえば多くの unix コマンドを網羅しているとか)
0141デフォルトの名無しさん
垢版 |
2008/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
0142141
垢版 |
2008/05/06(火) 02:56:02
と、方法を書いておいてアレだけど、
秀丸使ってるならgrepの実行で検索するファイルに(現在の内容)で
検索結果からファイル名と行番号を除去するのでもできそうな気がする。
盛大にスレ違いだけど。
0146デフォルトの名無しさん
垢版 |
2008/06/25(水) 02:17:58
質問です!

以下のファイルhogeからawkで、価格を抜き出して合計値を出したいと思っています。
ファイルの内容は、書籍名と価格です。価格は一番後ろの数字になります。

----------------------
$ cat hoge
それいけ!あんぱんまん 1000
メタボリックを撃退せよ 1000
下流社会 1000
上流社会と下流社会 日本のこれから 1000
論文 2008 日本の抱える問題 1000
論文 2007 日本の抱える問題 過去問題集 1000
----------------------

難しいのが、書籍名の2008や2007などの数値が含まれていることや空白が含まれていることです。
1行目の場合2列目が価格になりますが、2行目の場合4列目が価格となります。

このように一番最後の列(価格)を取得し、合計値を計算するにはどうすればよいでしょうか?

ご教示お願いいたします。


0153デフォルトの名無しさん
垢版 |
2008/06/29(日) 21:37:04
Windows 版の gawk-3.1.5 で`双方向パイプがうまく動作しません。以下、
http://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 では問題ありませんでした。
0158デフォルトの名無しさん
垢版 |
2008/07/02(水) 09:32:16
gawk.dllって、まだ誰かメンテしてくださってるんでしょうか?
最新版gawkのdllを探してるんですが、見つかりません。

または、ソースのtar.gzからdllを作る方法が載っているページを
御存知の方がいらっしゃいましたら、教えていただけると助かります。
0160デフォルトの名無しさん
垢版 |
2008/07/02(水) 10:42:47
http://ftp.gnu.org/gnu/gawk/ からダウンロードできるgawk-*.tar.gzのことですが。。
sourceからgawk.exeを作ったりしないのですか??

dllと書いているのでわかるかとは思いますが、
windows環境下での話です。普段はcygwinでmakeしたgawkを使っているのですが、
dllがあると他の言語から呼び出して使えるので便利かなーと思ってます。
0162デフォルトの名無しさん
垢版 |
2008/07/02(水) 11:53:32
>>160
昔あったDLL版は作者が独自に作ったものみたいで
本家に反映されてないから本家のソースからDLLを作るのは無理。
DLL版のソースを参考にして自力で作るか
できないなら作者に連絡して協力を求めるしかない。
0165155
垢版 |
2008/07/05(土) 15:47:31
>156
XP [Version 5.1.2600] でつ
0169デフォルトの名無しさん
垢版 |
2008/07/20(日) 00:40:48
AWK 使って15年? 30年前のコードが吐き出すデータをちょこっと処理しようとして…
FS=/[ ()]+/ は期待通りの動きをせず、FS="[ ()]+" と書かねばならない。
初めて知った。
 検索しても、これについて明快に書いてあるページがなかなか見つからなかったが
>正規表現定数がそれ自身として現れたとき、それはパターン中に現れたかのように、
>つまり`($0 ~ /foo/)' のようにみなされる。
<中略>
>言語のこの機能は、POSIX標準までドキュメント化されなかった。
orz
 これで1時間ぐらいムダにした。私が知らなかっただけですか??
0170デフォルトの名無しさん
垢版 |
2008/07/20(日) 00:58:40
『プログラミング言語AWK』には一応載ってるけどな
> (FSに代入される)文字列が1文字より長いときは,正規表現として扱われる
0172デフォルトの名無しさん
垢版 |
2008/07/20(日) 02:09:53
>>170
 ””で囲んだ文字列が正規表現として扱われる ということと
 //で囲んだ正規表現定数で書いてはいけない ということは同じではない。
実際、split関数の 第3引数に与える正規表現は どちらでも動く
 むむむ、ここでは($0~/foo/)に置き換えて評価されないんだ…
171の意見が正しいようだね チャンチャン

0173デフォルトの名無しさん
垢版 |
2008/07/21(月) 12:39:44
複数のファイルの読み込みってできますか?
print ファイル1の$2 ファイル2の$1
みたいな感じで
0174デフォルトの名無しさん
垢版 |
2008/07/21(月) 13:06:32
>>173
pasteで繋いじゃダメ?
私はよくやるけど。
仮にファイル1が5カラム固定なら、
paste ファイル1 ファイル2| awk '{print $2 $6;}'
てな感じで。
# カラム数可変ならもう一捻り必要だけどね。
0176デフォルトの名無しさん
垢版 |
2008/07/22(火) 18:37:52
awkすごい便利で、gnuplotと組み合わせてExcelから解放されつつあります。
上の方にあったDFAとNFA使ってる事からくる違いってなんですか?
0177デフォルトの名無しさん
垢版 |
2008/07/23(水) 02:40:07
>>176

一番の違いは、DFAだと後方参照ができないことかな。
とりあえず

DFA
前準備に手間を掛けるけど処理そのものは早い

NFA
即座に処理を始めるけど、処理に時間がかかる場合がある。

ぐらいに考えておけばいいと思う。
0179デフォルトの名無しさん
垢版 |
2008/08/02(土) 14:34:05
sh + awk は明らかに簡単だと思う。
sh + awk で出来ることを perl のみで記述する人の気持ちがどうしても理解出来ない。
ただ、ネットワークプログラミング以上になるとC, perl, ruby にならざるを得ないけど。

マシン単体での種々の手続き記述だと、
sh + awk がやっぱり一番完結になると思うんだけどな〜。
0180デフォルトの名無しさん
垢版 |
2008/08/02(土) 14:49:58
おれもawkでできることならawkでやる。
でもあまりにトリッキーなことになりそうだったらperlでやったりするかな。
0181あいちゃん
垢版 |
2008/08/03(日) 01:39:18
人に渡す可能性があるなら、awkは結構つらいことがある。
Perlでやれば基本的に問題ないから、Perlで書く癖がつく。
ShellScriptでいったん使うだけなら、awkは便利だけど。
0182デフォルトの名無しさん
垢版 |
2008/08/04(月) 01:23:58
>>180
俺も AWK でできるならAWK。
と考えると バイナリーのデータいじる以外はAWKでできるのでは…
(少なくとも 俺に日常のニーヅでは そうだ)
0183デフォルトの名無しさん
垢版 |
2008/08/04(月) 02:16:24
>>182
同感。ただバイナリは仕方ないにしても、
全半角混在の固定長フォーマットが扱いにくいんだよな。
ASCIIにすると全角のみ部分が処理しにくいし、
SJISとかにすると正しく切り出せないし・・・
あれはなんとかならんものかな。
0185デフォルトの名無しさん
垢版 |
2008/08/11(月) 15:38:13
ttp://www.kt.rim.or.jp/~kbk/gawk-3.1/
でダウソできるのがASCIIとSJISをうまく扱えるやつぢゃねの?
0186デフォルトの名無しさん
垢版 |
2008/08/13(水) 00:38:23
>>185
いや、そのgawk使ってるけど、全半角混在の固定長は困るはず。
両方別々なら問題なく扱えるけど、同時には扱えない。
例えば。SJIS1行5バイト+改行の固定長ファイルで
1行は2項目(a:全半角混在4バイト b:半角のみ1バイト)のファイルがあるとき。
asciiモードならa, bを切り分けられるがaの全角文字は処理できない。
sjisモードならa, bを切り分けられない。

悩ましいのは、項目を切り分けるスクリプトをascii オプションで起動して
出力結果をsjisで処理すれば(めんどくさいけど)現状で処理できてしまう。
ので、マニュアルに書いてある通り、作者をおねがいすれば可能性はあるかもしれないが、
お願いするのが躊躇われる感じなのね。
0188デフォルトの名無しさん
垢版 |
2008/08/15(金) 02:08:00
UTF-8の場合でも固定長は半角幅しか対応できてない。
文字数とバイト数と表示幅とか、日本語は面倒だのう。

length()とかでバイト数を拾えないから自前で処理もやりにくい。
0189デフォルトの名無しさん
垢版 |
2008/08/19(火) 22:37:59
>>188
一瞬納得しかけたけど。
冷静に考えると、そもそも1文字が可変長であるUTF8を
固定長ファイルの文字コードに使おうと考えた奴を締め上げて
泣くほど問い詰める方が先だと思うのは俺だけ?

考えても考えてもメリットが思いつかないよ…
0190デフォルトの名無しさん
垢版 |
2008/08/21(木) 00:40:10
>>189
ほとんどの文字コードが可変長だからなあ。
相対的に見ればマシな方に入るんじゃない?
ホストが絡むと文字コード周りは悲惨だよ…
ホストじゃないならそもそも固定長じゃなくて良いんだけどね。
0191デフォルトの名無しさん
垢版 |
2008/08/23(土) 01:53:25
あるフィルタスクリプトをgawkで書いているのですが
文字のコードを整数値に変換しようとしてうまくいきません
たとえば「c」という文字のコードを整数値にしようとして
BEGIN {
 testChar = "c";
 printf("testChar=%d\n",testChar);
}
のようにしても「testChar=0」と表示されてしまいます
良い方法があればお教えください
0192デフォルトの名無しさん
垢版 |
2008/08/23(土) 03:21:15
>>191

awklib に ord ってユーザー定義のライブラリ関数があるからそれを使う。
自前で作ってもいいけどね。

くわしくは info gawk で調べて。
0193191
垢版 |
2008/08/23(土) 03:28:08
>>192
ありがとうございます
早速検討してみます
0194191
垢版 |
2008/08/23(土) 10:56:41
>>192
ttp://www.kt.rim.or.jp/~kbk/gawk-30/gawk_16.html
にあったものを試してみました.期待どおりの動作をしてくれます.
どうもありがとうございました.
0195デフォルトの名無しさん
垢版 |
2008/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で分割するしか無いですかね…。
0196デフォルトの名無しさん
垢版 |
2008/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で割った余りは元のままだからな。
0197デフォルトの名無しさん
垢版 |
2008/09/15(月) 14:18:55
>196
いやあくまで例題なので内容は深く考えないでください…orz

普通にif文とは言うものの、折角awkが標準で備えてる便利な機能を無視して冗長な書き方するのも難だし
かと言って.awkファイル複数個とバッチで、パイプでつなげて処理するのも…う〜ん、となってしまう。
良い書き方無いかなぁと思ったので聞いてみたのですが、ifとsplitで頑張ります。
0198デフォルトの名無しさん
垢版 |
2008/09/16(火) 02:58:54
質問がよくわからんのだが、BEGIN部で生成したファイルを処理部で扱いたいということかな?
例えば、
gawk 'BEGIN{ ARGV[1]="in_file.txt"; ARGC=2; }{ print }'
ってやったら in_file.txt を表示できるぞい
0199デフォルトの名無しさん
垢版 |
2008/09/16(火) 09:51:03
>198
!!!
目から鱗です。

そっか、ファイル生成しちゃえば一発で行けるのか…やってみます
0200デフォルトの名無しさん
垢版 |
2008/09/16(火) 15:07:48
うげ、一旦ファイルを作るのはありなのかよ。
ifを使うのは冗長なのに、ファイルを作るのは冗長じゃないってどんなセンスなんだ。
0201デフォルトの名無しさん
垢版 |
2008/09/16(火) 17:48:16
>200
入力データは規則性のあるもので、生成してしまえるけど
それに対しての分岐は多い…という場合
ifやsplitを羅列するよりも、awkが元々持ってる
パターンとフィールド分割を使った方が
スッキリすると思うのですが間違ってるでしょうか…。
0202デフォルトの名無しさん
垢版 |
2008/09/16(火) 19:39:26
>>201
別にいいんじゃね?
巨大な中間ファイルを作るってわけでもないんだろうし。
まぁ、次の理由で私は中間ファイルを作るのは避けるけどね。
・フルパスを指定しない場合、カレントディレクトリに書き込み権限がある保障がない。
・そもそも同名ファイルが存在していて書き込み権限がないかも知れない。
・つーか、同時に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
>202
う〜ん、言われてみればそうかも。
一応、今回のは仕事で使うわけでもなければ他人に使ってもらう予定もない
完全な個人用スクリプトなのでどうにでもなりますが
これが業務や自分以外も使うものであれば素直にifなんでしょうね。
0205デフォルトの名無しさん
垢版 |
2008/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}
とべた書きしてもだめ。
ど忘れ中。ヘルプミー。
0208デフォルトの名無しさん
垢版 |
2008/10/10(金) 19:41:51
質問です。
入力中のファイル名はFILENAMEにセットされますが、
入力中のファイルのパスを取得するにはどうしたらよいですか。
0209デフォルトの名無しさん
垢版 |
2008/10/10(金) 22:13:43
>>208
FILENAMEで得られる情報が全て。フルパスが欲しいということなら、
cwdを取得してそこからの相対パスがFILENAME。
0210デフォルトの名無しさん
垢版 |
2008/11/12(水) 19:19:08

awkの結果を set か setenv の変数に代入したいです。

awk '{ print $1+ $3 }' test.txt
で数値が出ます。
この結果を変数に代入するにはどうしたらいいんでしょうか?

set tmp=`awk '{ $1+ $3 }' test.txt`

これだと上手くいきません。print はそのままでいいのでしょうか?
0215デフォルトの名無しさん
垢版 |
2008/11/18(火) 11:28:33
カンマ区切りのデータファイルがあり、その中で、第1フィールドと第3フィールド内にもし
子音、子音、子音、母音が存在すればその行だけ抜き出すオークのスクリプトファイルをつくりたいのですがどうすればよいですか
0217デフォルトの名無しさん
垢版 |
2008/11/18(火) 11:50:40
こんな感じです
takeshi,fiad,fdjioaf,fdjsoafds(←該当なし)
dddacea,fsaofsa,rrra,fjisaofdjsa(dddaとrrraが該当)
aexxxu,dsoifsa,yyyuo,fjsaofa(xxxuとyyyuが該当)
0218びぎなぁ
垢版 |
2008/11/18(火) 12:12:55
オークスクリプトを実行すると情報を表示するようにしたのですが1行目と最後の行だけを表示しないようにするには
END内に何て書けば宜しいでしょうか
0219デフォルトの名無しさん
垢版 |
2008/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
0221デフォルトの名無しさん
垢版 |
2008/11/18(火) 13:53:22
>>218
1行ずつバッファリングして、次の行の入力で前の行を出力すれば最後の行は消えてなくなる。
awk 'NR > 2 {print buffer;} NR > 1 {buffer = $0;}'
0222デフォルトの名無しさん
垢版 |
2008/11/18(火) 14:20:29
>>215
gawkなら
awk -F "," -v r="[bcdfghj-np-tv-z]{3}[aiueo]" --posix '$1 ~ r && $3 ~ r'
$1と$3どちらか一方にあればいいなら&&を||に変えてね
0224びぎなぁ
垢版 |
2008/11/18(火) 16:46:03
出来ました ありがとうございます
0225デフォルトの名無しさん
垢版 |
2008/11/19(水) 23:48:41
込み入ってて整理できないので教えてください。
・対象のテキストは2行目がない(1行目しかない)かつ
・1行目はひらがなカタカナ漢字で15文字以内
という条件を書くのって、次のようにしたのですが、うまくヒットしません。
どう書けばいいでしょう?

NR==2 && length($0) == 0 && NR==1 && /[ぁ-んァ-ヶ亜-腕]{1,15}/
0227デフォルトの名無しさん
垢版 |
2008/11/19(水) 23:54:54
awkは行を1行ずつ処理するから、事前にトータル行数を知ることはできない。
トータル行数が1行であることを保証したいなら、ENDブロックで処理するしかない。
0229デフォルトの名無しさん
垢版 |
2008/11/20(木) 00:28:19
>>228
どうやって? 対象がファイルである保証があるならwcでも呼べばいいけどそれならawkでやる必要さえないよね。
0231デフォルトの名無しさん
垢版 |
2008/11/20(木) 23:58:06
どなたか、任意ビット幅の2の補数HEXをDECに変換するプログラムを書いてもらえませぬか?
0236デフォルトの名無しさん
垢版 |
2008/12/13(土) 04:23:45
awkからsystem()でgrepとかsedとか呼んだりする癖が付いている
シェルスクリプトにする方がむしろ違和感
0239デフォルトの名無しさん
垢版 |
2009/01/10(土) 22:10:41
gawk 3.1.4 mb のwindows版のEXEファイルが欲しい…
0241デフォルトの名無しさん
垢版 |
2009/01/11(日) 12:16:04
>なんでそんな古いバージョンが欲しいの?
lengthとかsubstrで、「j」付き文字列関数があるからです。
3.1.5以降だと、同じスクリプトファイル内で、バイト単位処理と
キャラクター単位処理の混在が難儀なのです。
0242240
垢版 |
2009/01/11(日) 15:01:36
3.1.5で文字の扱いが変わったのはその通りだけど、3.1.4のWindows版て
jlengthやらあったっけ?
なかったと思うんだけど。
0243デフォルトの名無しさん
垢版 |
2009/01/11(日) 15:48:22
>なかったと思うんだけど。
えっ。3.1.4以前のはバイト単位オンリーって事ですか?
…それでも2バイト換算で扱えばいいから、まだマシかも。

j付きが追加されていたけど、動作変更に伴って廃止された…
と思っていました。
記憶にあるのは、どなたかの独自拡張別Verだったのか…?
0244240
垢版 |
2009/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ベースのにはなかったという話だったと思う。
それぞれやってる人が違う。
0245デフォルトの名無しさん
垢版 |
2009/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さん、どうもでした。
0247デフォルトの名無しさん
垢版 |
2009/01/11(日) 22:30:39
>あるよ。3.0.6のやつ。
おお。 ありがとうございます。
>3.0.6→3.1.xで増えた機能でも使ってんの?
いつ何が増えたのかよく把握していないんですが、
gensubとかmktimeとかswitch-caseとか…ありますかね。
まあ、代替手段はあるので試してみます。どうもです。
0248デフォルトの名無しさん
垢版 |
2009/02/23(月) 08:11:12
awkで、組み合わせの全てを作る、という事はできるのでしょうか?
いわゆるnCrの、個数ではなくて、中身を知りたいという事なのですが・・・。
(mawkを使っています)
0250sage
垢版 |
2009/03/04(水) 15:23:19
248です。
なんとかできました。249さんどうもです。
0253デフォルトの名無しさん
垢版 |
2009/03/23(月) 12:41:00
丸め誤差でしょう。
切り捨て前に0.5足すとか工夫してみては如何でしょうか。
詳しくは、IEEEと丸め誤差辺りのキーワードで検索のこと。
0255デフォルトの名無しさん
垢版 |
2009/04/13(月) 21:36:16
gawkで掲示板作りたいんですけど、
gawkが使える無料鯖どこかにありませんか?
0256デフォルトの名無しさん
垢版 |
2009/04/13(月) 21:58:14
Linuxが入ってるレンタル鯖なら入ってるんじゃないかなぁ?
レンタル鯖板できいてみたら。
さくらのFreeBSDはFreeBSDのawk(!=gawk)だった。
0257デフォルトの名無しさん
垢版 |
2009/04/13(月) 22:07:10
>>256
さくらはgawkですか。
Windowsじゃないレンタル鯖ならawkが使えても良さそうですけど、
無料ではなかなか見つからないんですよね。
perl,ruby,phpは多いんですけどねぇ。。
0258257
垢版 |
2009/04/13(月) 22:14:30
失礼。
さくらはgawkじゃないawkですか。
0259デフォルトの名無しさん
垢版 |
2009/04/18(土) 13:07:13
わらうw
ttp://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
>>259
同じくウケた
awkは永続的に使っていて,C-->C++-->Javaと乗り継いできたが,awkはこれらコンパイラ言語を使う上で
良い学習材料になってきたと思い感謝している(もちろん未だにscriptのawkをawkで書いている).
唯一awkで勉強できなかったのがOOPだったから,学習材料としてのawkがこういう方向に活路を見いだすのは
良いことかもしれない.ただし実用に向けて考えてみると,個人的にはOOPが本領を発揮するのは頭の中でalgorithmを
把握しきれなくなる程度に大きなシステムを組み上げる場合なので,果たしてそれをawkで書くかといわれると….
0261260
垢版 |
2009/04/18(土) 13:57:19
s/algorithm/データ構造/
0262デフォルトの名無しさん
垢版 |
2009/05/09(土) 23:49:39
最近rubyの勉強始めたんだが、
「rubyがあればAWKいらね」とは思えん。
逆にAWKの便利さを再認識した。

やっぱり、簡単なテキスト処理は
AWKでやったほうが簡単だ。
0265デフォルトの名無しさん
垢版 |
2009/05/10(日) 01:20:35
JavaScriptが動く HTML実験部屋
ttp://homepage2.nifty.com/tomoarai/java/exper.html
0266デフォルトの名無しさん
垢版 |
2009/05/14(木) 08:38:05
jawkの話題が全然出ないね。
使ってる人少ないの?
0269デフォルトの名無しさん
垢版 |
2009/06/08(月) 01:31:39
ttp://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_167
Geocoding - 住所から緯度経度を検索 だって。何これおもろい。
0270デフォルトの名無しさん
垢版 |
2009/06/21(日) 16:39:12
{if(miso<$1){printf($1)}} miso=30
を実行すると$1が1桁の数字のときにうまくいかないんですけどなぜ?
0276デフォルトの名無しさん
垢版 |
2009/06/21(日) 22:46:46
>>275
出てしまう理由が気になります...なんででしょう
やっぱり271さんの言うとおり文字列比較してるんでしょうか?
0277デフォルトの名無しさん
垢版 |
2009/06/21(日) 22:54:47
>>276
awk のバージョン(種別)が分からない
何を食わせてるのか分からない
スクリプトは一行で書いてるのかファイルにしてるのか分からない
一行で書いているならシェルに何を使っているのか
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:07
$awk -W version
mawk 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
>>279をマネさせてもらった
$ 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
0282270 のが再現できない...
垢版 |
2009/06/23(火) 01:02:55
gawkは
コマンドラインで指定されたファイル名が 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
固定長で改行なしのファイル(6MB超)を処理することになり、
他のソフトで「改行ありの固定長」にしてから、awkで処理していたのですが…

データファイルによく出てくる文字をとりあえずRSに見立てて読み込み
→RSに指定した文字を連接
→固定長の1行分より長かったらその部分を切り出し

していくと「改行ありの固定長」、できちゃいました。
RSに指定した文字がしばらく出てこなければ変数パンクしちゃうし、大分危なっかしいの
ですが、とりあえずawkでできたのが少しうれしい。
0285デフォルトの名無しさん
垢版 |
2009/06/26(金) 11:29:46
>>283
>284みたいな読解力ない馬鹿が湧かないように、判り易く書きましょう。
つーか、具体的なコードも出さずに「awkでできてうれしい」なんてのはチラシの裏にどうぞ。
0287デフォルトの名無しさん
垢版 |
2009/07/13(月) 09:52:52
正規表現で空白で区切られたテキストをHTMLでいうtableにしたいです。
例)

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
>>287
正規表現を使うほどのことではない
コアの部分だけ書くとこれだけ
for(i=1;i<=NF;i++) printf("<td>%s</td>", $i)
0290hogehoge
垢版 |
2009/07/17(金) 16:37:34
split や asort したらどうして添字が1からになるんだ!
なんでだ!
仕様書読み飛ばしててデータ欠落させるところだった(´・ω・`)

>>287
sed でええやん
0292デフォルトの名無しさん
垢版 |
2009/07/26(日) 15:10:31
ttp://www.kt.rim.or.jp/~kbk/gawk-3.1/
ここのgawkで>>17のサンプルを試したが動かなかった。

gawk: test.awk:4: 致命的: 入出力用の双方向ソケット `/inet/tcp/0/www.yahoo.com/80' が開けません (No such file or directory)。
0293hogehoge
垢版 |
2009/07/27(月) 11:13:15
それはそこのサイトの人に言えよ
0296デフォルトの名無しさん
垢版 |
2009/08/06(木) 10:22:37
7月7日→[[7月7日|07月07日]]
7月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:13
↑間違いました。
7月7日→[[7月7日|07月07日]]
7月28日→[[7月28日|07月28日]]
11月3日→[[11月3日|11月03日]]
12月16日→[[12月16日|12月16日]]
0299デフォルトの名無しさん
垢版 |
2009/08/06(木) 11:13:12
{
gsub(/月|日/," ");
printf("%02d月%02d日\n",$1,$2);
}
とか.
フィールドセパレータがデフォルト(半角スペース)の場合ね.
0300デフォルトの名無しさん
垢版 |
2009/08/06(木) 11:15:10
>296
Perlで簡単に書けるなら、一旦Perlコード晒してくれるか?
どうも仕様がよく解らんのだ…
0301デフォルトの名無しさん
垢版 |
2009/08/06(木) 11:54:28
print gensub(/0([0-9])([0-9])/, "\\1\\2", "g", gensub(/([0-9]+)/, "0\\1", "g",
$1))

我ながら汚ねぇなぁ(´・ω・`)
>>299の方がいいな
0302デフォルトの名無しさん
垢版 |
2009/08/06(木) 12:27:22
>>298,300 置換しないで変えたいとこだけ出力するならこういう意味です。
#!/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
なんか素直にPerlでやったほうが楽そうだなあ、それ。
ちなみに、そのコードじゃ無限ループするぞ。
#!/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";
        }
    }
}
0305デフォルトの名無しさん
垢版 |
2009/08/06(木) 14:47:14
7月7日
という文字列を
[[7月7日|07月07日]]
と置き換える、ってことでしょ。
なんで分からんかなぁ。そっちのが分からん。
0306デフォルトの名無しさん
垢版 |
2009/08/06(木) 14:53:30
入力が07月07日だったら,
出力は[[07月07日|07月07日]]になるよね?これはOK?
そもそも,そういう入力は起こりえないの?
0307デフォルトの名無しさん
垢版 |
NGNG?2BP(0)
>>305
そんな感じです。
目的を言っていないので、何がやりたいのかよくわからないのだと思います。
早い話、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日]]
のように処理したいです。
0309デフォルトの名無しさん
垢版 |
2009/08/06(木) 21:17:06
# gawk による match 関数の拡張を使っている.
# 一行に複数回現れた場合は無視.

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:15
# 訂正.

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日]]", 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
>>310 完璧です。今度からこれを使います有難うございました。

$ 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日
0313デフォルトの名無しさん
垢版 |
2009/08/07(金) 11:45:35
ここの住人がコーディング好きだからって甘えやがって(´・ω・`)

> perlならわりと簡単なのですが、awkで簡単にいきますか?
って言ってるんだから、「いきます」って答えりゃいいんだよな
0317222.248.109.70
垢版 |
2009/08/17(月) 17:45:07
自動焼人 ★ = 自動保守 ◆KAWORUKOFI = 自動保守#K9K?_D[L

名言集 その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:04
最後の10行を処理したくない場合、どう書けば良いでしょうか?
0319デフォルトの名無しさん
垢版 |
2009/10/24(土) 18:19:03
最後まで読まずに最後の10行かどうか判定する方法は無いだろうな
処理対象がファイルなら、事前にwc -lか何かで行数調べて awk に渡してみては
0321デフォルトの名無しさん
垢版 |
2009/10/24(土) 19:15:52
とりあえず、こんな感じにしました
BEGIN {
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
>>321 考え方は同じだけど、forが気になったので
リングバッファで処理するようにしてみた。

BEGIN {
  SKIPTAILS = 10
  ringpos = SKIPTAILS
}
{
  ringpos = (ringpos + 1) % SKIPTAILS
  line = buf[ringpos]
  buf[ringpos] = $0
}
NR > SKIPTAILS {
  # lineを処理
}
0325デフォルトの名無しさん
垢版 |
2009/11/23(月) 12:06:14
質問です
gawkで
{
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
にするにはどうしたらよいでしょうか?
0328デフォルトの名無しさん
垢版 |
2009/12/21(月) 13:53:34
年末にパソコンを買い換えようと思って機種選びをしていてふと気づいた、
あれ、vaioのOSがWindows7 64bitバージョンに・・・
ダメじゃん!gawkが使えなくなってしまう・・・
うーん、、、またXPを買うべきか・・・悩む・・・
0330デフォルトの名無しさん
垢版 |
2010/01/14(木) 03:52:20
プログラミング言語AWK復刊だってね。
ttp://slashdot.jp/developers/article.pl?sid=10/01/06/0345207

多分必要性を感じない程度には使ってるから、買わないけど嬉しい。
布教用に買うってのもちょっとな。

0331デフォルトの名無しさん
垢版 |
2010/02/28(日) 11:08:56
AAA BBB CCC … -O ZZZ YYY XXX …

awk新参です。
-O(オプション)を検索し、
-Oとそれ以降をリダイレクトしたいのですが…
良い方法、ありますでしょうか
0332デフォルトの名無しさん
垢版 |
2010/02/28(日) 15:36:31
リダイレクトってどういう意味で使ってる?

その AAA で始まる文字列も一体どういうものなの。
コマンドライン引数なのか、ファイルから読み込んでくるのとか。

用語と状況はきちんと書いてくれ。
0333デフォルトの名無しさん
垢版 |
2010/02/28(日) 16:19:07
D:\My Documents\gawk\331>type 331.txt
AAA 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:04
Q: make spits out errors like Makefile.awk:256: fatal: match() cannot have 3 arguments

A: 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:38
{print substr($0, match($0, " -O .*")+1);}
0337331
垢版 |
2010/02/28(日) 20:03:12
>>336
出来ました。まさか本日中に解決できるとは思いませんでした。
ありがとうございます。大変勉強になりました。
0339デフォルトの名無しさん
垢版 |
2010/03/04(木) 15:04:38
gsub()とかで引数に変数を利用したいのですがどうすればいいのでしょうか?
gsub(str1,str2)みたいに。
0340デフォルトの名無しさん
垢版 |
2010/03/04(木) 21:44:52
>>339
man 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().)
0342デフォルトの名無しさん
垢版 |
2010/03/17(水) 22:07:37
時々awkだと遅いのでperlに書き換えるという人がいますが、
実際のところ速くなるんでしょうか?
私の環境では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
0345デフォルトの名無しさん
垢版 |
2010/03/20(土) 01:03:01
カーニハンとパイクの『プログラミング作法』にawkとperl
(とCとC++とJAVA)の比較があるな

今のマシン使って書き換えなきゃならないほど遅いって
どんな処理なんだろう?
0346デフォルトの名無しさん
垢版 |
2010/03/21(日) 13:44:10
>342
awk 等を組み合わせて実行するとプロセス起動のコストがかかるので perl で一つに纏める、という話じゃないの?
0347デフォルトの名無しさん
垢版 |
2010/03/22(月) 17:35:11
文字コードのコードを変数にして文字列を操作することってできますか?
文字列中の全角文字を半角文字に変える華麗な方法を模索しています。
0349デフォルトの名無しさん
垢版 |
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
Excelで
全角半角変換は ASC()
半角全角変換は JIS()
0351デフォルトの名無しさん
垢版 |
2010/03/25(木) 08:34:11
>>347
1. EUC-JPにして(nkfとか)kakasi で、戻す
2. それだったら最初から、nkf -Z
3. gawk前提で、文字毎に処理(LANGを指定して子プロセス起動)

awkの中で閉じてやるのはめんどくさそう
0352デフォルトの名無しさん
垢版 |
2010/03/29(月) 23:34:27
gawk 3.1.6
system(cmd) を使うと、アンチウィルスソフト(kaspersky)の
アプリケーション履歴にバッチファイルが登録されるのを発見。
close(cmd) しても同じ。

while(cmd|getline>0){}
で代用すると残らなくなった。??
0356デフォルトの名無しさん
垢版 |
2010/05/18(火) 10:51:40
awkのprintについてご教示下さい。

下のような出力が有った場合、例えば
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
$nに代入があると、その時点で$0が再構成される。

区切りの空白が$5のあったところだけ2個になるのが気にならなければ、
ls -al | awk '{$5 = ""; print}'
とすればよい。

空白2個を修正するならこうする。
ls -al | awk '{$5 = ""; print $0}' | awk '{$1 = $1; print}'
0360デフォルトの名無しさん
垢版 |
2010/05/18(火) 11:34:06
なにもしないと、$0は読み込んだそのままなので空白2個は空白2個のまま。
$1=$1で代入してやると、$1, $2, ...を空白1個でつないだものが$0に代入されるので、
空白2個だったところが空白1個になる。
0361デフォルトの名無しさん
垢版 |
2010/05/18(火) 11:35:04
2つめのawkに食わせた時点で$n (n>0)は詰まるけど$0は入力行そのまま
空白2個なので$0を再構成すると空白1個区切りになる
0362デフォルトの名無しさん
垢版 |
2010/05/18(火) 12:21:12
>>357-358
非常に解りやすいご説明、ありがとうございます。
なるほど代入することで解決するんですね。
勉強になりました。
0363デフォルトの名無しさん
垢版 |
2010/05/18(火) 15:08:38
$1 = $1 ってイマイチよく解らん

$1ってFSで区切られた一つ目だよね?
なんでそれ自身を自分に代入したらスペースが消えるん?
0364デフォルトの名無しさん
垢版 |
2010/05/18(火) 15:27:35
$0の再構成が行われるからって説明されてるだろ。

$0の再構成とはいったんばらした$1,$2,...をOFSを挟んで
つなげ直すってことなので、何で区切られていたかは
保存されない。
0365デフォルトの名無しさん
垢版 |
2010/05/18(火) 15:41:56
>>364
>$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:59
解った

http://www.kt.rim.or.jp/~kbk/gawk-3.1/gawk.html

警告: 一部のバージョンのawkは NFを減じたときに$0の再構築を行わない。
結局のところ、awkにレコード全体の再構築を強制したときにはその時点で
フィールドの値とOFSが使われる。再構築を行うためには、何らかの無害な
代入を行う:

$1 = $1 # force record to be reconstituted


賢くなった。あんがと。
0372デフォルトの名無しさん
垢版 |
2010/05/29(土) 04:53:07
名前:
E-mail:
内容:
cygwinだと
% cut -f1 -d, hoge.csv
より
% awk -F, '{print $1}' hoge.csv
の方が速かった。
#実行時間ね
#Perl?シラネ
0373デフォルトの名無しさん
垢版 |
2010/06/07(月) 11:45:38
>>372
sed -e 's/,.*//'でもawkと同じくらいだから、cutの実装が遅いんだね。
cutが無駄にオプション多い所為じゃない?
0374デフォルトの名無しさん
垢版 |
2010/06/07(月) 12:04:05
手元のlinux環境だとcutの方が速いという普通の結果でしたが。
hoge.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:48
あーなるほど、なんか判った。cygwinのfgetc()が遅いからじゃないかな。
fgetc()とfgets()で時間を較べたときにfgetc()の方がずっと遅かった記憶がある。
0376デフォルトの名無しさん
垢版 |
2010/09/13(月) 14:14:54
xgawk (gawkでなく)にとあるwebページを食べさせると、XMLERRR (not well-formed)で中断します。
そのページが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行目を空行にすれば解決できないことはないんですが、
空行を入れ忘れてしまう懸念があります。
どうすればいいんでしょうか?
0381デフォルトの名無しさん
垢版 |
2010/09/27(月) 18:42:12
gensub()にて、マッチした10番目以降のグループの指定の仕方を教えてください。
下記サイトでは、17番目まで普通に指定できるような事が書いてあるけど、
http://tounderlinedk.blogspot.com/2010/08/gensub-n-awk.html

gensub(pattern,"\\10","g",$2) とかくと
\\1(マッチ箇所)と0(文字)として解釈されちゃって上手くいなかい。

シェルスクリプト風かと思って、\\{10} も試したけどダメダッター。

GNU Awk 3.1.5です。
0383デフォルトの名無しさん
垢版 |
2010/09/27(月) 19:04:47
>>381
マニュアルには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';

なんてやってる。
0385381
垢版 |
2010/09/27(月) 19:12:31
>>383
どうもありがとうございます。

>>384
ちょっと見栄え悪くなるけどそうする(´・ω・`)
0389デフォルトの名無しさん
垢版 |
2010/09/28(火) 03:41:50
15年以上前だけどawkの勉強始めて同時にperlの勉強もしてたら
気付いたらperlばっかりやっててawkすっかり忘れてしまったなぁ
今はperl捨てて専らpythonやってるけどawkもいいよね
0390デフォルトの名無しさん
垢版 |
2010/09/28(火) 09:40:13
Busyboxに組み込めば、それこそ炊飯器や冷蔵庫でも動くからなあ。
手軽であるにも関わらず、結構高度な処理もガリガリ書けるから好き。

Cとシェルスクリプトが好きだから、文法的にもしっくり来る。
上位互換のPerlも大好き。
0392デフォルトの名無しさん
垢版 |
2010/09/28(火) 14:52:08
>>391
どれでも好きなのを選べ

1. xgawkを改造
2. エラーになるXMLを事前に修正してwell-formedにしてから食わせる
3. xgawkは捨てて別の言語、ライブラリを試す
0394デフォルトの名無しさん
垢版 |
2010/10/01(金) 11:21:26
動く環境の多さ順にインタプリタを選ぶんなら、

シェルスクリプト > awk >>> perl >>>>> python >>>>> ruby >>> haskel etc.

となるだろうな。

シェルスクリプトはシェル依存な部分が多く、perl ほど高機能なものも要らない。
そんな時、小さな端末でもスマートに動いてくれる awk にちんこ勃つ。

>>389
言語に捨てるも拾うもないよ。その時々に都合の良いものを組み合わせて使うのがUNIX的な発想。
0398デフォルトの名無しさん
垢版 |
2010/10/21(木) 20:16:46
sjisで書いた
/ー/{print}
を実行すると

awk:
awk: ^ 正規表現が終端されていません。
awk: 致命的: [ または [^ が対応しません。: /[/{print}/

のエラーになってしまいます。
ーの2バイト目が[なせいだと思いますが、どう対応したらいいでしょうか?
入力ファイルはsjisで書かれていて、文字コード変換はできません。
0401デフォルトの名無しさん
垢版 |
2010/10/21(木) 22:52:57
環境はCentOS-5.5-x86_64でGNU Awk 3.1.5です。
/bin/awkはシンボリックリンクで、実体はgawkでした。
0405398
垢版 |
2010/10/22(金) 07:32:34
こうすることで対応できました。
/\x81\[/{print}
0408398
垢版 |
2010/10/22(金) 19:55:53
根本的な解決するとしたら文字コードを変えることでしょうか?
0409デフォルトの名無しさん
垢版 |
2010/10/22(金) 20:03:18
日本語の文字コードに対応してるawkを使う、という方法もある。
今あるのかどうか知らないけど。
0410デフォルトの名無しさん
垢版 |
2010/10/22(金) 20:28:38
今のgawkは普通にUnicode対応してるみたい

$ echo 'てすと' | gawk '/[ぁ-ん]/ { print length($0) }'
3

UTF-8ロケールでしか試してないけど
cygwinでも大丈夫
0412399
垢版 |
2010/10/23(土) 06:55:10
>>405

問題は解決したのかもしらんが、一応。
以下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
>>413
少なくとも自分が試した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
Windows2003だとちゃんと動くんですね。
困っていたことは405で解決したので大丈夫です。
今は「根本的な解決」に興味があったのでお聞きした次第です。
0416初心者
垢版 |
2010/11/04(木) 22:14:10
awkでシェルのPATH変数をマッチさせるときにスラッシュ//を使わない方法を教えていただけませんか?
0418初心者
垢版 |
2010/11/05(金) 06:32:09
ごめんなさい!
知りませんでした。
0419デフォルトの名無しさん
垢版 |
2010/12/15(水) 01:54:35
配列の要素数を調べるなら、ループ処理しないと分からない?
length みたいなのは無い?
0421デフォルトの名無しさん
垢版 |
2010/12/15(水) 02:42:46
そんなもんねぇよw
と思ったら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
むしろ配列が存在するってことはその配列を作成する過程があるだろ?
作成するときに数えればいいんじゃね?
0424419
垢版 |
2010/12/25(土) 03:12:23
function で処理する時、配列だけではダメで要素数まで必要なんだかなぁ、
って事が分かりますた
0425デフォルトの名無しさん
垢版 |
2010/12/28(火) 11:29:35
function に渡すだけなら要素数なんていらないんじゃない?
0426デフォルトの名無しさん
垢版 |
2010/12/28(火) 13:55:13
$1 = $1みたいなトリックを見る度に奥が深いと言うよりは糞に見えてきます
翻すとUNIX文化そのものが
まあ、あくまでおれの主観ですがね
0430デフォルトの名無しさん
垢版 |
2011/01/06(木) 00:22:04
▼tes09.awk
BEGIN{
  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  arima_yuuichi@example.com
BEGIN  ooizumi_sadawo@example.com
BEGIN  taguchi_kenji@example.com
BODY  arima_yuuichi@example.com
BODY  ooizumi_sadawo@example.com
BODY  taguchi_kenji@example.com

▼gawk -f tes09.awk
BEGIN  arima_yuuichi@example.com
BEGIN  ooizumi_sadawo@example.com
BEGIN  taguchi_kenji@example.com

ここで、BEGIN句での ARGV[1]="hoge.txt" という代入を本編(?)でも有効にする為
にはどうすればいいでしょうか?
0432430
垢版 |
2011/01/06(木) 06:20:53
分かり辛くてすみません。
hoge.txtの中身は下記です。

arima_yuuichi@example.com
ooizumi_sadawo@example.com
taguchi_kenji@example.com

>>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
入力レコードが1件も無いからでしょ

>gawk: tes09.awk:2: ^ 表現の char '・' は不正です。
これは全角スペース
0434デフォルトの名無しさん
垢版 |
2011/01/06(木) 09:12:00
>BEGIN  arima_yuuichi@example.com
>BEGIN  ooizumi_sadawo@example.com
>BEGIN  taguchi_kenji@example.com
コレはgetlineで読んで出力したもの

>BODY  arima_yuuichi@example.com
>BODY  ooizumi_sadawo@example.com
>BODY  taguchi_kenji@example.com
コレはコマンドで指定したファイルから出力したもの

たとえば
{
  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
>>435
自分の質問を見直してみると全く質問になっていなかったにも関わらずエスパー
してくださってありがとうございます。

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:39
質問です。
My 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せずに実行することは可能でしょうか?
0441デフォルトの名無しさん
垢版 |
2011/01/10(月) 03:54:21
>440
なんか " と \ の数がおかしくね?
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:20
cygwinを入れてやってみた

systemはshで動くっぽいので
rm /cygdrive/c/Documents\ and\ Settings/test.txt
みたいに書くとちゃんと消えるみたい
0444デフォルトの名無しさん
垢版 |
2011/01/10(月) 13:24:47
>>438,442

438で書いてるgawkでやりたいことってのはバッチファイルでやってるのと同じこと?
だったら無理。
system() でcdしてもsystem()から返ってきたところで元に戻る。
0446デフォルトの名無しさん
垢版 |
2011/01/11(火) 09:05:01
>>444
なるほど。gawk内部ではシステムを実行していても、gawkを出ると、それも終わっちゃうんですね。なるほど。
よくわかりました。ありがとうございます。
0447デフォルトの名無しさん
垢版 |
2011/01/19(水) 02:44:33
とりあえずAWKで書いた巨大なスクリプトを、鯖で回し続けるのはやめてください。
非効率極まりない
0450デフォルトの名無しさん
垢版 |
2011/01/19(水) 23:56:54
文字から文字コード取り出せないのが残念
逆はsprintf("%c", 0x41)とか出来るのにな
0451430
垢版 |
2011/01/20(木) 00:40:40
>>447
効率のいいプログラムで書き直してやればいいじゃない。
0453デフォルトの名無しさん
垢版 |
2011/01/20(木) 23:49:13
#!/bin/gawk --re-interval -f

↑のファイルを実行するとオプションが不正と言われて実行できないのですが
コマンドラインのオプションで指定する以外にやり方はありますか?
0455デフォルトの名無しさん
垢版 |
2011/01/21(金) 08:45:02
#!でインタプリタに渡す引数の扱いは実装依存だからな。
linuxだと空白を含んだ全ての文字列が一つの引数として
渡されるので、複数のオプションは渡せない。不便だけど
そういうものなのであきらめてください。素直にシェルを
間に入れるのがいいと思うよ。
0456デフォルトの名無しさん
垢版 |
2011/01/21(金) 12:45:00
gawk '$3!="*"' in.txt>out.txt
という処理で、20GBぐらいのin.txtを数百MBぐらいにスリムアップしてます。
問題は、その処理を10本ほど並行に作業させているんですが
topで見てみるとほとんどのgawkプロセスがsleepかstackedになっていて
あんまりもりもり働いてくれません。IOが律速なのでしょうか?
CPUもメモリも最大限積んでます。
0458デフォルトの名無しさん
垢版 |
2011/01/21(金) 13:26:09
'$3!="*"'
これって書き間違い?
0459デフォルトの名無しさん
垢版 |
2011/01/21(金) 13:47:33
削られるデータの例
745_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
>454-455

ありがとうございました。
挙動を変える組み込み変数も無いようですね。
0462デフォルトの名無しさん
垢版 |
2011/01/21(金) 16:47:10
とりあえず df コマンドで作業ディレクトリと /var/tmp の空き領域が
確保されていることと、出力ファイルのサイズやタイムスタンプが徐々に
更新されていることを確認するくらいしかないんじゃないかな。
ローカルディスクでやればもっと早いと思うけど。
0463デフォルトの名無しさん
垢版 |
2011/01/21(金) 17:42:04
>>460
なるほど。
xgridをつかって、2台のマシンで10本ずつほど並行してgawkを走らせておりました。
NFSをつかって5GBほどの(先ほどは20GBと書きましたが間違いです)in.txtの
のデータを読み込んで、処理後のデータをout.txtに書き出しているので、
ネットワークビジーになってしまうというわけですね。
ネットワークの問題とは。。。
一応、エラーでこけることなく、しゅくしゅくと処理は進むので気にしないことにします。
0464デフォルトの名無しさん
垢版 |
2011/01/21(金) 17:44:39
2台のマシンで20本でした(10+11)。。。
一プロセスあたり5GBのファイルを読み込むので、ネットワークが悲鳴を上げていると。
0465デフォルトの名無しさん
垢版 |
2011/01/24(月) 21:31:50
今年、gawkを大学で習って色々弄ってるんだけど、perlとかより自由度が低いと言われた。そんなに差があるの?
0466デフォルトの名無しさん
垢版 |
2011/01/24(月) 21:46:54
>>465
簡易言語として捉えるかツールとして捉えるかの違いじゃね〜
俺パールよりオークの方が好きだけど。
0467デフォルトの名無しさん
垢版 |
2011/01/24(月) 22:19:29
>>466
なるほど。まぁ、そんなに複雑なことをこなすスキルを持ち合わせてないからもう暫くawkで遊んでみるか。
0469デフォルトの名無しさん
垢版 |
2011/01/25(火) 05:02:06
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。

アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。

                  京都大学霊長類研究所
0470デフォルトの名無しさん
垢版 |
2011/01/25(火) 11:23:33
>>467
perlユーザはすべてをperlだけでやろうとする。C/C++/Javaも使うユーザはawkの方を好む。
C/C++/Javaに手を延ばすつもりならむしろawkのほうがいいよ。perlだと自己完結してしまうから。
0471デフォルトの名無しさん
垢版 |
2011/01/25(火) 16:02:25
perlよりawkの方が速い事ってないじゃん。
今のawkの使い道はワンライナーをコマンドラインのパイプに混ぜる程度でしよ。
俺は、256倍本の長篇スクリプトをいくつか書いたけど、
当時はまだperlなんて使われてなかった。時代が違う。
0472デフォルトの名無しさん
垢版 |
2011/01/25(火) 18:11:52
>>470
それは偏見だろ
autoconfなどの非常に基本的なツールでもPerlが使われているし
opensslのようにconfigureの(主にWindows用の)ポータビリティを上げるために
Perlを利用しているものもある

言語の適性をわかった上で適材適所で使えばいいんだよ
0474デフォルトの名無しさん
垢版 |
2011/01/25(火) 21:29:34
>>471
>時代が違う。

時代と言う意味では、最近はデフォで Python が入っていたりするので
Perl を使うなら Python を選んじゃうな。

あんまり速さを競う仕事をしていないのと、ワンライナーを書く事が
多いので、awk も絶賛大活躍しているけど。

Perl がフルセットの言語なら awk は DSL みたいな物で、個人的には
awk の方が気安く書ける気がする。
0475デフォルトの名無しさん
垢版 |
2011/01/25(火) 21:57:07
pythonは、コマンドラインで使いにくい。
-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:47
で今考えている方法としては

substr($1,1,3) で姓を判定して
同じ姓なら、世帯を加算して行く
違う姓になったタイミングで1つ前の家の家計を print して
さらに各出費を初期化する
次の行に移って同じ世帯なら加算

という感じでスクリプトを組みたいんですが根本的なところでやり方が不味いでしょうか?
0479デフォルトの名無しさん
垢版 |
2011/01/26(水) 01:13:08
>>476-477
全て連想配列に溜め込んで、 最後で一気に出力した方が良くないか?
>>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:53
>>474
OS(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
>>474と全く同じ意見だわ。

業務で使う事が多いRHELは余計な物はほとんど入れてない。
Python、Perlがデフォで入ってる感じ。

昔、UNIXを扱ってた頃はPerlならデフォで入ってたので、覚えようとしたけど結局身につかず。
sh、sed、awkでがんばってた。
0482デフォルトの名無しさん
垢版 |
2011/01/27(木) 00:10:46
>>480
デフォで入っているのが嬉しいのは、自分の環境だけでなく、他人の環境でも
使える事が保証されている事だよ。誰かに使ってもらう為のコードを書く時に、
パッケージの追加をお願いしなくて良いのはとても楽。特に、それが仕事で
使われている環境なら尚更。

サポートやトレーニングの仕事をした事がある人なら理解してもらえると思う。
0484デフォルトの名無しさん
垢版 |
2011/01/27(木) 05:04:18
AWKの活躍する場面は、やっぱりテキスト処理だと思う。
そのちょっと複雑版として使うならPerlかな。
組み込みライブラリがテキスト処理に特化してるから。

Pythonは正規表現が言語に組み込まれてなかったりと
テキスト処理は若干やりにくい印象が強い。
その分、テキスト処理以外なら結構使うけどね。
0485デフォルトの名無しさん
垢版 |
2011/01/27(木) 05:27:26
>>482
ああ、それ分かるわ。業務マシンとして使う商用UNIX(HP-UX/Solaris/AIX)だと
RubyどころかPython/Perlすらデフォじゃ入っていないし、そういった
フリーソフトの類いは原則として一切インストール禁止という環境もある。
(Web/MailといったInternet系サーバは別ね。あくまで業務マシン限定の話。)

だから商用UNIXユーザは、デフォで入っているツールに長けることになる。
やっぱり本物のUNIXプロを自称するのなら、python/rubyではなくsh/awkだし、
emacs/vimではなくvi、latexではなくroffを選ぶべきだよね。
0487デフォルトの名無しさん
垢版 |
2011/01/27(木) 07:07:12
>>486
ん?言語には組み込まれてないだろ?ライブラリとして組み込まれてるだけで。
だから正規表現リテラルとか無いし、importなしには使えない。
0492デフォルトの名無しさん
垢版 |
2011/01/28(金) 15:46:44
>>491
それは簡易インストールで用途としてデスクトップあるいはインターネットサーバを
選択した場合の話じゃないのかな。基本システムにperl/pythonは含まれていないはず。
その簡易インストールも含めてデフォであるとするなら、Debianも同じ。
カテゴリでデスクトップを選べば「rubyもデフォ」でインストールされる。(RHLは知らん)
自分は余計な物は入れたくないから基本システムを選んでるけどね。

高可用性を要求される基幹業務システムの場合、自分はHP-UXを扱うケースが多いけど、
デフォでは基本システムを選び事前に設計したパッケージのみを追加するのが鉄則。
なぜならメーカのサポートが受けられない、あるいはあからさまに嫌な顔をされるから。
そんな環境だと、「真にデフォ」なsh/csh/sed/awkが大活躍していたりする。
0493デフォルトの名無しさん
垢版 |
2011/01/28(金) 17:06:59
>>492
Solaris のデフォルトは "Entire Distribution" というパッケージのセットだよ。
インストーラーでデフォルトで選択されているのがこれだし、プリインストール
されているのもこれに近いもの。そこには Perl も Python も入ってる。
インストールする際の選択肢で "Core System" を選べば Perl や Python は
入らなかったと思うけど、これをデフォルトと呼ぶのはちょっと無理があると思うわ。

それと、簡易インストールとかカテゴリでデスクトップとか真にデフォと言った物は
Solaris には存在しない。Debian は知らん。
0494デフォルトの名無しさん
垢版 |
2011/01/28(金) 20:11:40
Solaris2.6あたりのデフォでPerlは入ってた記憶がある。
15年くらい前のHP-UXだとPerlが入ってなかった記憶が。
0497デフォルトの名無しさん
垢版 |
2011/01/29(土) 07:33:12
と言うわけで、UN*Xサーバ管理者の場合はawkを使えるようになっておけば間違いありませんね。
0498デフォルトの名無しさん
垢版 |
2011/01/29(土) 10:56:30
環境を選ばないサーバ管理だったら、sh,grep,sed,tr,cut,paste,sort,uniqあたりで。
nawkとgawkの仕様差が結構あるので、awkは使いにくい。
0503デフォルトの名無しさん
垢版 |
2011/01/29(土) 18:47:15
Solarisは、/usr/bin/awk /usr/bin/nawk /usr/xpg4/bin/awk
3つ別々なのが入ってた気がするな。
で、一番まともなのが3番目なので、よそから持ってきたスクリプトは、先頭の#!を
書き換えないといけないという、カオスな状態じゃなかっただろうか。
0505デフォルトの名無しさん
垢版 |
2011/01/29(土) 19:25:17
スクリプトを組む時はだいたい nawk を使う
他人のスクリプトを丸パクリする機会が無いのでカオスは感じた事が無い
0507デフォルトの名無しさん
垢版 |
2011/01/29(土) 19:39:08
ウチは RHEL と Solaris だけ考えれば良いから、awk で問題がある時は Perl か Python で済ますわ
0509デフォルトの名無しさん
垢版 |
2011/02/01(火) 10:39:45
shebang行に /usr/bin/env 書くのってあんま良いと思えないんだよなあ
複数の引数の扱いとか、環境変数をそこまで信用して良いものなのかとか
あと /usr/bin/ に env があることは本当に保証できるのかとか
/bin/sh を書いたほうが良いんじゃないかって思ってしまう
0510デフォルトの名無しさん
垢版 |
2011/02/01(火) 11:45:20
この話題も定番だな。前スレの558-564でもやってたぞ。とりあえず結論だけを引用しとくわ。

>調べてみたら#!にインタープリタの引数を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
ruby 界隈でも流行ってるな
意味も判らず「おまじない」と称して使ってるうちに
都市伝説化していくんだな
0514デフォルトの名無しさん
垢版 |
2011/02/04(金) 09:10:06
>>512

BEGIN {
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))
}
}
0516デフォルトの名無しさん
垢版 |
2011/02/04(金) 09:54:40
同じ事じゃん
0520デフォルトの名無しさん
垢版 |
2011/02/06(日) 03:05:39
tr コマンドって環境によってマルチバイトの扱いが違わね?ウチの場合
Ubuntu10.04に入ってるtr(GNU coreutils)7.4はどうやら2文字扱いにしちゃうらしいが
MacOSX10.5に入ってるtr(バージョン判らんがman見るとBSD系ぽい)は1文字扱いにしてくれた
0522デフォルトの名無しさん
垢版 |
2011/02/07(月) 08:10:44
んーと、どゆこと?
gnome-terminalはユニコード設定のはずなんだが…
他にやらなきゃいけないことがあるってこと?
0524デフォルトの名無しさん
垢版 |
2011/02/10(木) 14:20:51
最近、awkの存在を知りました。
いろんな言語を触っては挫折・・・触っては挫折・・・を繰り返していました。
awkは何となくマスター出来そうな気がします。
これから頑張ります!!
256倍の本を今は読んでおります。
0525デフォルトの名無しさん
垢版 |
2011/02/16(水) 02:02:44
gawkでフィールドをソートして表示したいんだが
{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
>>525
$iとか書けるし代入もできるから
$1〜を保存しなくていいのなら、後半は

for(i=1;i<=NF;i++){$i=a[i]} print

と書けばちょっと短くなるな。
0528デフォルトの名無しさん
垢版 |
2011/02/17(木) 01:07:36
http://www.kt.rim.or.jp/~kbk/gawk-3.1/ に置いてあった
win32用gawkがいつの間にか公開停止になっていた。

wn32のgensubが使えて日本語が扱えて、
かつexeのみで稼動するのでインストール不要なのが便利で
公私にわたって愛用していたので、非常に悲しい・・・
0531528
垢版 |
2011/02/19(土) 01:36:10
>>530
もし私に言ってくれているのであれば、
exeのみだけど2009/11/24版が手元にあるので、
これを使い続けようと思う。ありがとう。
0532デフォルトの名無しさん
垢版 |
2011/02/19(土) 08:18:59
俺の手元に、gawk-mbcs-win32-20091124.zip があった。
欲しい人がいて、かつ再配布に問題無いという事がわかればどっかにうpするが。

しかしなんで配布やめちゃったんだろね。
どこからか拝借したコードとかのライセンス問題なのかな?
0533デフォルトの名無しさん
垢版 |
2011/02/19(土) 22:51:02.65
AWK++によるオブジェクト指向入門
http://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でオブジェクト指向する人も増えるかもね。
0535デフォルトの名無しさん
垢版 |
2011/02/20(日) 00:59:51.51
同感。>デフォでできる範囲
長めのスクリプトを書いた事があったのでOOあると便利と思うけど
わざわざインストールするならperl、ruby、pythonがあるしなぁ
0537デフォルトの名無しさん
垢版 |
2011/03/02(水) 23:14:41.35
gawkで平仮名・カタカナの部分を抜き出したいと思ってます。
例えば「awkについて語るスレ」だったら
"について" "るスレ" を変数に入れたいのですが、いい方法ありますでしょうか?
0538537
垢版 |
2011/03/02(水) 23:17:39.07
「について」と「るスレ」はそれぞれ別の変数に入れたいと思っています
0539デフォルトの名無しさん
垢版 |
2011/03/02(水) 23:27:45.29
アルファベット以外の部分だったら、アルファベットをFSに指定してwhileで回せばいいけど、
漢字も抜くのは難しいな。
それに、事実上変数は無限に生成するって事か。
0541デフォルトの名無しさん
垢版 |
2011/03/03(木) 13:28:46.50
$0,$1...$NFを壊してもいいんだったら、私ならこうします。

gsubの検索文字鉄には正規表現を使用することができるから、
ひらがなとカタカナ以外の文字をスペースに置き換える。

gsub(/[^ーぁ-んァ-ン]/," ")

ひらがなとカタカナ以外の文字は半角スペース2つに置き換わる。
あとはNFを見て表示したいように処理する。

注意すべきは、Windows版の新しいバージョンのものでは、
正規表現として、ひらがなを ぁ-ん で、カタカナを ァ-ン で
指定できないものがあります。
たしかマルチバイト拡張で壊された。
0542537
垢版 |
2011/03/03(木) 14:28:35.14
>541
まだ試してませんが、欲する文字以外を消してゴニョゴニョすればいけそうです。
>539-540さんもありがとうございました。
0543デフォルトの名無しさん
垢版 |
2011/03/03(木) 19:41:21.36
BEGIN {
str = "デンコ漢字ばんざい元気abcdeだから"
c = split(str, a, "[^ーァ-ンぁ-ん]")
for (i = c; i>=1; i--) {
if ( a[i] !~ /^$/ ) { print a[i] }
}
}
0547デフォルトの名無しさん
垢版 |
2011/03/04(金) 08:34:52.75
for ( i = 1; i in a ; i++) って書き方もできるよ
0548デフォルトの名無しさん
垢版 |
2011/03/07(月) 14:14:11.11
a1 a1 a1 a2 a2 a3
b1 b1 b1 b1
c1
d1 d2 d2
....

のように、フィールド数がバラバラで、フィールドが一致する場合もあれば
一致しないデータがあるのですが、重複を
a1 a2 a3
b1
c1
d1 d2
のようにまとめあげるにはどうしたらよいでしょうか?
さすがにググってコピペという訳にもいかず。。。
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.26
0610005C13Rik 0610005C13Rik 0610005C13Rik
0610007C21Rik 0610007C21Rik 0610007C21Rik 0610007C21Rik 0610007C21Rik

こういう感じの文字列なんですが
a1とかb1で例えても大丈夫だったですか?
0553デフォルトの名無しさん
垢版 |
2011/03/07(月) 15:38:11.62
空白で区切られた文字列ならなんでもいいが、そのレベルの質問が
出るようじゃもうすこし基礎を勉強しないとだめかもなぁ。
0554デフォルトの名無しさん
垢版 |
2011/03/07(月) 15:50:13.69
シングルクオーテーション使用のサンプルで問題ないと言う事は〜
UNIX環境なのかな〜
0555デフォルトの名無しさん
垢版 |
2011/03/07(月) 15:58:11.87
Mac OSXのターミナルを使ってます。
>>551はそのままうまく動きました。
いま昇順で手動で作業してますが、まだzを抜けることができません。
もう手がつりそうです
0558デフォルトの名無しさん
垢版 |
2011/03/07(月) 17:18:15.93
まだやってるのか〜
ファイルの ^M が問題みたいだから
CRLFのファイル形式に変換して上の一行野郎で問題ないみたいだったよ。
0559デフォルトの名無しさん
垢版 |
2011/04/19(火) 03:07:46.46
#複数行の入力中、先の行の11カラム目にOUTが含まれているかつ次の行の11カラム目にINが含まれている2行が揃った時、2行を出力
$11~/OUT/{ prev=$0; }
$11~/IN/{
if(prev!=""){ print prev; print; }
prev="";
}
0560デフォルトの名無しさん
垢版 |
2011/04/19(火) 15:55:50.78
# 7.awk
NR >= 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
俺の手元のgawk 3.1.7では期待通りの結果になるなあ。

行末がらみだと改行コードが違ってたり見えない空白が
入ってたりというのがよくあるので確認してみ。
0563デフォルトの名無しさん
垢版 |
2011/04/19(火) 16:45:20.75
>>561
ありがとうございました。改行コードをunix形式にしたら出来ました。
今後ともよろしくお願い致します。
0564デフォルトの名無しさん
垢版 |
2011/04/19(火) 17:00:39.34
>>559

INがあるときにしかprevがクリアされていないから、OUTが出現した以降に
複数行が経過してもINが出現するとprintされるスクリプトになっているよ。
0565559
垢版 |
2011/04/20(水) 01:08:11.06
http://okwave.jp/qa/q6672025.html
とかの入力をイメージしてたもので...

$11~/OUT/{ prev=$0; }
$11~/IN/{
if(prev!=""){ print prev; print; }
}
$11!~/OUT/{ prev=""; }
0566デフォルトの名無しさん
垢版 |
2011/05/01(日) 16:22:39.39
http://okwave.jp/qa/q6660984.html
#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.87
BEGIN { reset() }
NF == 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
間違ってるよ
しかも長くて美しくないよ
0570デフォルトの名無しさん
垢版 |
2011/05/03(火) 15:33:28.80
>>566
NF==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
BEGIN {
    # 先頭がいきなり "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
>>569 awkの配列ってどれくらい確保可能なの?
先に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.24
$ uname -sr
CYGWIN_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の整数って上限あるの?(ウチだけか?)
0576デフォルトの名無しさん
垢版 |
2011/05/06(金) 09:18:39.10
>>574
おれのPCでは普通に 1 から 1e+048 まで表示されますが。。。
0578デフォルトの名無しさん
垢版 |
2011/05/06(金) 11:30:10.09
>>576
本当ですか!よろしければ環境を教えてください。

>>577
ありがとう。ここawkも張れたんだ。結果が長すぎて困ってたのよ。
正にこんな結果になる。

POSIXで保障されてる精度は>>575ってこと?
てことは、awkは内部では、全ての数がdouble扱いなの?
0579デフォルトの名無しさん
垢版 |
2011/05/06(金) 14:20:04.87
>>578
576です。WindowsXP + GNU Awk 3.0.6 + multi-byte extension 1.15 です。
0580デフォルトの名無しさん
垢版 |
2011/05/06(金) 18:58:28.81
>>579
ありがとう。
あまり違いがないな。Win7は関係ないだろうし。
multi-byte extensionがその辺りも弄っているのか…

そういえば、1e+048みたいな指数で表示されるの?
出力のとき丸めるから、ちゃんと計算できてるように見えるのかな。
0581デフォルトの名無しさん
垢版 |
2011/05/06(金) 23:07:48.20
awkでは数値はすべてdoubleで扱います。
ですからその精度である53bit分、大体15桁ちょっとを超えると正確な値を保持できません。

23桁あたりまで正しく表示できてるってのはよくわかりませんが、
3.0.6にしても出力時の書式指定が違うだけで内部的には同じように不正確な値に
なってしまってると思います。
0583デフォルトの名無しさん
垢版 |
2011/05/07(土) 11:11:15.94
>>582
「実質」というのはどういう意味?

#define AWKNUM double

ってのがあるし、long double にしても仮数部は64bitだから23桁には足りないよ?
x87のレベルで拡張精度になってても、表示やらなんやらするところで倍精度に
丸められちゃうと思うんだけど。
0585デフォルトの名無しさん
垢版 |
2011/05/07(土) 21:19:09.46
>>581
あう、そうなのかー。ありがとうございます。困ったなぁ。
10進で実数扱えとまでは言わないけど、整数は欲しい。
数をいろんな型で扱える処理系なんてないか。
0586デフォルトの名無しさん
垢版 |
2011/05/07(土) 23:01:38.63
>>583
あー、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.37
gawkのユーザガイドに、他の処理系では、標準エラーを使うため、
 print "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
他の処理系って、他のawkって事だよ。

/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
そこまでのことをするならPerl/Ruby/Python等のちゃんとした
スクリプト言語で書いた方がいいんじゃないかな。こういう
どうでもいいところで悩まなくて済むよ。

awkはawkで手軽に書ける範囲なら他の追随を許さないと思うが
その枠をはみ出ようとすると途端に大変になる。そこが楽しいと
いうのなら無理には止めないけどw

0591デフォルトの名無しさん
垢版 |
2011/05/11(水) 00:36:20.77
>>588
ありがとうございます。
catがない環境だと、どうしようもないですね…

>>589
コンマ区切りのデータを、シェルスクリプトで処理していたので、
それをawkに移植していました。一番手軽だったのです。

ちなみに、2時間半以上かかっていた処理が、1分以内に短縮されました。
ワラタ。   ワラタ…
0593デフォルトの名無しさん
垢版 |
2011/05/11(水) 12:14:45.46
つーてもawkとかその他のスクリプトでサクッと書けるような文字列処理を
C言語とかではあんまり書きたくならんと思うぞw
0596デフォルトの名無しさん
垢版 |
2011/05/25(水) 21:58:46.38
>>595
gawkの場合インデックスをSUBSEP(=\034がデフォルト)を挟んでシリアライズしたインデックスで多次元配列を表現する
a[0,0] = 1;
ならOKのはず。このときのインデックスは"0\0340"だから、a["0\0340"] == 1。
0597デフォルトの名無しさん
垢版 |
2011/05/26(木) 18:46:04.99
>>596
ありがとう。始めからそれを意識して書いてたらよかったんだけどね。

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.69
name["god"] = "Kaname Madoka"
msg["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
awkって *どの実装でも* 一度も使ったことがない変数の内容って、スカラなら0か""になってるの?
変数が一度も代入されていないことを判定するために、(x==0 && x=="")って書いて何か問題ない?
0600デフォルトの名無しさん
垢版 |
2011/05/30(月) 21:31:52.21
>>599
評価されるときに変数が存在しなければ作成される。はず
配列の要素なら in で調べられるけど
変数自体となるとどうだろうね
0602デフォルトの名無しさん
垢版 |
2011/05/30(月) 23:19:06.92
>>600-601
ありがとう。区別できないって、どういう状態になるの?0を代入したら0か"0"に評価される。
ああ、""を代入したら0か""に評価されて駄目ってことか!?
0603デフォルトの名無しさん
垢版 |
2011/05/31(火) 00:05:27.97
あれ?試したらどっちを代入しても599の式は0に評価されたよ。区別できないケースってどういう場合?
0604デフォルトの名無しさん
垢版 |
2011/05/31(火) 06:28:27.99
BEGIN {
    # 初期化直後 (未使用) の変数は数値 (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.71
> 初期化直後 (未使用) の変数は数値 (0) と文字列 ("") の両方の型を持つ。
IEEE 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
>>605
> 再初期化するなら$(NF+1)使うほうがいいかもね。未使用の変数を用意しなくていい。
フィールド変数は常に文字列型で、 数値型は持たない。
0607デフォルトの名無しさん
垢版 |
2011/06/02(木) 22:47:31.10
πはatan2(0,-1)でいいとして
「0より大きい最小の浮動小数点数」ってどう定義していつ使うの?
0608デフォルトの名無しさん
垢版 |
2011/06/03(金) 13:48:37.95
「0より大きい最小の浮動小数点数」というのが何を希望しているかによる。
以下の3種類がある。

(1) 最小の正の非正規数
(2) 最小の正の正規数
(3) 1.0に足して丸めた結果が1.0より大きくなる最小の数
0609デフォルトの名無しさん
垢版 |
2011/06/03(金) 23:58:11.26
>>606
あちゃ!そうでした。$で戻るのは文字列だった。
その仕様書読んでると、NFを拡張したとき、元々なかった所はuninitialized valueになるってあったので。

>>607
それでいいんだけど、PIとかで参照できたらもっといい、と思ったのです。
>>608
数値計算のために、CのDBL_EPSILONの代わりになる定数が欲しいなと。
任意の精度で丸められる関数もないですし。
0611デフォルトの名無しさん
垢版 |
2011/06/10(金) 21:49:33.34
変数名など、自前であっても規則を意識している方いますか?
awkだと、C風が一般的なのでしょうか?
一番最初がVBAだったので、長い名前と省略が混ざってしまって
自分でイライラしています。
みなさんの、通常の変数はこう、配列はこう、定数はこう、文字型はこう・・・
というものを参考にしたいです。
0613かあた
垢版 |
2011/06/13(月) 18:37:34.88
、5なわやあふぉt( ())
0614デフォルトの名無しさん
垢版 |
2011/06/15(水) 21:51:26.93
>>611
遅レスだが、型_内容の説明_名前みたくしてる。名前が一文字だとそのままだけど。
グローバル変数とローカル変数のどっち弄ってるのか分かりやすいように、ローカル変数は必ずlで始めるようにしてる。
d_per_shouhizei = 5.0とかね。
0615デフォルトの名無しさん
垢版 |
2011/06/20(月) 18:37:26.17
gawkでBINMODEを設定すればバイナリーの入出力ができるのはわかるのですが、
入力されたバイナリーを16進ダンプして表示するにはどうしたらよいでしょうか?
od等の外部コマンドを使う意外に方法があればお教えください。
0617天使 ◆uL5esZLBSE
垢版 |
2011/07/05(火) 00:15:13.83
二度と話かけんなよ
お前らってどうみてもゴミだよな
0620デフォルトの名無しさん
垢版 |
2011/07/30(土) 19:46:15.81
超初心者の質問で申し訳ありません。以下のようなデータを
aaa 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.97
ddd 20 ではないかと思うがこんな感じかな
awk '{a[$1]+=$2} END {for (b in a) {print b " " a[b]}}' | sort
0623620
垢版 |
2011/07/30(土) 23:22:20.03
>621
ありがとうございます!うまくいきました。
0627デフォルトの名無しさん
垢版 |
2011/08/19(金) 00:53:44.39
生きていることを願って質問を。
WIN32の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
TEST.DATは、空白が入っています。
専ブラのポップアップをコピペして下さい。
0630デフォルトの名無しさん
垢版 |
2011/08/19(金) 11:02:41.54
>>627−628
cygwinのawk(GNU Awk 3.1.8)で動くけど、どうなるはずがどう動かないと言っている?
>627のtest.datなら、当然「ソ」だけが変換されるけど。
0631デフォルトの名無しさん
垢版 |
2011/08/19(金) 11:55:06.25
(CygwinならUTF8じゃないとうまく動かないけど)Shift JISで動作させたいってことかな?
事前にTEST.DATをnkf -wに通したら駄目かな。
0632629
垢版 |
2011/08/19(金) 21:59:57.43
>>627
スクリプトも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やってリダイレクトしたファイルは正常な結果が出るよ。
リダイレクトしないでコマンドプロンプトに表示させると化けるけど。
0634デフォルトの名無しさん
垢版 |
2011/08/24(水) 08:07:37.54
gawkはガンガン機能を拡張してるけど、
そろそろOOP対応してくれないかな。
awk++とかあるけど、標準でOOPできれは便利。
0636デフォルトの名無しさん
垢版 |
2011/08/25(木) 01:14:17.45
awkに在ると便利かもと思うのは参照値くらいかな

配列や関数への参照を値として取り出し格納したり
逆にその値から元の配列にアクセスしたり元の関数を呼んだり出来ると
相当に複雑なデータ構造が表現可能になる、それこそOOPっぽいことも可能だし

でもあんまりややこしいことやるならPerlでいいから必須ではないね
0637デフォルトの名無しさん
垢版 |
2011/08/25(木) 02:28:23.99
> 関数を呼んだり

変数の値を関数名として
var = "sage";
@var();
ってできるけど、それとは違うのん?


0638デフォルトの名無しさん
垢版 |
2011/08/25(木) 04:07:56.67
およ、もうあるのかw
最近のawkは分からねえ…ってことは、配列への参照を使って入れ子の配列とか既に作れちゃったりするのか?
0641デフォルトの名無しさん
垢版 |
2011/08/25(木) 20:52:51.07
class human {
  property 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()
}
0644デフォルトの名無しさん
垢版 |
2011/08/26(金) 06:00:04.19
function Human(self,name,sex,age) {
self["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
ごめん一部genderになってるからsexに直しといて

とりあえず、こんな感じでgawk4でもOOP自体は出来るよって話
0646デフォルトの名無しさん
垢版 |
2011/08/27(土) 15:07:17.61
>>644
なるほどねー
とても勉強になります

でも、やっぱりOOP用の構文が使えればベストですね
そのほうがわかりやすいと思います
0648デフォルトの名無しさん
垢版 |
2011/08/27(土) 16:10:36.72
本当に欲しいんなら、gawkのMLにこうすればOOP実現できることを発見したんだけど、
これの糖衣構文を用意してくれって投稿するといいんじゃね
switchも実装されてるし、欲しい人が居ると分かれば付けてくれるかもよ
0649デフォルトの名無しさん
垢版 |
2011/08/27(土) 16:25:08.65
#! /usr/bin/env python
# -*- 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()
0651デフォルトの名無しさん
垢版 |
2011/08/27(土) 16:53:49.92
そりゃawkはOOPLではないからな
あくまでシェルのお供でいいと思うんだ
そしてそこに高度なOOP機能は要るとは思えない
どちらかと言えばフィールド抽出とかをもっと便利にすべきだよ
0652デフォルトの名無しさん
垢版 |
2011/09/17(土) 15:34:39.29
cygwin以外でgawk4.0をwindowsで使おうと思ったら、バイナリはどこで入手できもうすかね?
0657デフォルトの名無しさん
垢版 |
2011/09/19(月) 16:07:37.39
物によっては使えたような気がする。
cygwin1.dllだっけ?にパスが通ってれば大体使えたような気がする。
0659デフォルトの名無しさん
垢版 |
2011/10/24(月) 01:55:49.24
教えてください。英語得意な人

http://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.18
http://www.gnu.org/s/gawk/manual/gawk.html#Array-Sorting-Functions
As 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
>>659
比較関数の与え方はPROCINFO["sorted_in"]の場合と同じってことだろ。

自分で定義した関数の名前でもいいし、11.2.1.2に書いてあるようにすでに用意
されている@〜を使ってもいい。

0662デフォルトの名無しさん
垢版 |
2011/11/14(月) 21:59:05.28
個人的には、GAWKにはあと、Cで書いた関数の呼び出しというか
GAWKで呼ぶ関数をCで書ける機能が欲しいと思ってるんだけど、
ここ見る限り世間的にはあんまり需要ないんかねぇ。

まぁ、それやるくらいならGAWK自体に変更を加えて再コンパイルしろってことかもしれないけど。
0664デフォルトの名無しさん
垢版 |
2011/11/15(火) 01:58:32.43
>>662
ttp://www.gnu.org/s/gawk/manual/html_node/Dynamic-Extensions.html
じゃダメ?将来的にさらに拡張される可能性はあるみたいだけど
0666デフォルトの名無しさん
垢版 |
2011/12/22(木) 16:57:35.32
ttp://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_271
ここに書いてある通りにしても日本語に翻訳されません
どうしてですか?
環境は LinuxMint12 、 GNU Awk 3.1.8 です
0668デフォルトの名無しさん
垢版 |
2011/12/22(木) 18:07:45.38
>>667
poは作成しましたし、moも所定のディレクトリにあります。
poは自分で編集しても、そのサイトの内容をコピペしてもダメでした。

$ cat gettext.po
#: gettext.awk:10
msgid "********** Count Prime Number **********"
msgstr "========== 素数を数える =========="

#: gettext.awk:14
msgid "2 is a prime number."
msgstr "2 は素数です。"

#: gettext.awk:24
msgid "%d is a prime number.\n"
""
msgstr "%d は素数です。\n"

$ ls ja_JP/LC_MESSAGES/
gettext.mo
0669デフォルトの名無しさん
垢版 |
2011/12/22(木) 18:10:02.43
結果はこの通りです。

$ LC_ALL=ja_JP gawk -f gettext.awk 10
********** Count Prime Number **********
2 is a prime number.
3 is a prime number.
5 is a prime number.
7 is a prime number.
0670デフォルトの名無しさん
垢版 |
2012/01/12(木) 13:56:36.33
ずいぶんawkから離れていて久しぶりに使ったら
nawkに日本語のバグがあることにしばらく気づかなかった
substr()でutf-8のテキストを切り出すとおかしな値になる
gawkでは直っている
0672デフォルトの名無しさん
垢版 |
2012/01/13(金) 00:28:07.37
ttp://blog.livedoor.jp/corbie/archives/cat_94960.html
残念ながら、シフトJIS、UTF-8両方で正常に動作しそうなWindows版gawkは候補の中にありませんでした。
0674デフォルトの名無しさん
垢版 |
2012/04/29(日) 21:07:39.93
ファイル名が"*.txt"の一覧を取得するとき、"\.txt"でマッチさせると、任意の一文字.(ドット)と解釈されてしまうんですが、いい方法無いでしょうか?
0675デフォルトの名無しさん
垢版 |
2012/04/29(日) 22:04:14.36
GNU Awk 3.1.7だとドットにマッチしたけどそもそもawkの話?
具体的にコマンドがほしいな
0676デフォルトの名無しさん
垢版 |
2012/04/29(日) 22:08:23.01
昭和の頃覚えたアセンブラとC言語
これがあったから
いまだに自分が損な業界で飯を食ってる
0679674
垢版 |
2012/04/30(月) 18:07:43.22
>>675
ls | awk '{ if( match($0,"\.txt") > 0) print $0 }'
↑会社のサーバ上でこんな感じのことやろうとしてたんですが、
「gawk: 警告: エスケープシーケンス `\.' は `.' と同等に扱われます」
とメッセージが出力され、ドットが任意の一文字?と解釈されて困っていましたが、
自己解決しました。(自宅のLinuxPCで動作確認しました。GAWK3.1.7及び4.0.1)
"\.txt"では無くて、".txt"で良かったんですね。
お騒がせしました。

もしかしたら、会社のサーバ(RHEL)のGAWKが古くて解決できてないかもしれませんが。
0680デフォルトの名無しさん
垢版 |
2012/04/30(月) 20:27:16.48
>>679
match() の第二引数に文字列を与えた場合は事前に正規表現への型変換が行われるが、
その際にエスケープが外れて /.txt/ と同等になってしまう、 ということかと。
つまり "\\.txt" とするか、 正規表現の /\.txt/ を与えればよい。

The GNU Awk User's Guide にもこの現象についての説明はあるが、
~ !~ 演算子についてしか触れられていない。
ttp://www.kt.rim.or.jp/~kbk/gawk-30/gawk_5.html#SEC32
0682デフォルトの名無しさん
垢版 |
2012/07/12(木) 02:26:40.35
FIFOな感じの先入れ先出しのバッファには何使えばいい?
というか、
Arrayで、たとえばA[3] からA[8]までのデータをA[1]からA[6]に動かすには何が一番早い?
できれば配列は1つしか使いたくないのだが、無理だろうか…
0683デフォルトの名無しさん
垢版 |
2012/07/12(木) 09:23:22.92
速さを求めるなら毎度全要素ずらすより、読み出し位置と書き込み位置の添字持って
管理した方がたいてい速い
0686デフォルトの名無しさん
垢版 |
2012/07/14(土) 22:27:17.73
>>682
BEGIN{
 QMAX=3
 QTopPos=0;QTailPos=0;QNum=0;
 deQ();
 enQ("1");deQ();
 enQ("a");enQ("b");enQ("c");enQ("x");deQ();deQ();deQ();deQ();
}
function enQ(PushVal){
 if (QNum+1 > QMAX){print "おなかいっぱい"; return;}
 nextPos = (QTopPos+1) % QMAX;
 queue[QTopPos] = PushVal;
 QTopPos=nextPosQNum++;
}
function deQ(){
 if (QNum < 1){print "からっぽ"; return}
 QNum--; TailVal=queue[QTailPos]
 QTailPos = (QTailPos +1) % QMAX;
 print TailVal;
 return TailVal;
}
0687686
垢版 |
2012/07/14(土) 22:54:06.64
↑の結果はこんな感じ。
>からっぽ
>1
>おなかいっぱい
>a
>b
>c
>からっぽ

>>685の書いているリングバッファ実装です。
enqueue,dequeue回数が多いならリングバッファで良いと思う。
大抵の場合はQMAXに大きな値を設定すれば事足りるハズだけど
上限が決定できない等の事情があればdelete arrayを使った単純な配列管理かな。
ただ添え字が数値上限を超えない様な工夫は必要だね。
0688デフォルトの名無しさん
垢版 |
2012/07/15(日) 21:09:36.15
リングでも上限を定めると入力ストリームの上限が不明な場合まずいことになるので、現在は
A=入力Array,C一時保管,i,k,n,p
  k=1;C[0]=0;
  for(i=1;i<=A[0];i++){n=0;while(k<i && A[k++]=C[n+=1]);if(n){
  delete C[C[0]+1];C[0]-=n;p=0;while(C[p+=1]=C[n+=1]);}p=1;
  while(match(substr(A[i],p),re)){p+=RSTART-1;n=substr(A[i],p,RLENGTH);
  if(k<i){A[k++]=n;}else{C[C[0]+=1]=n;};p+=RLENGTH;}};n=1;
  while(A[k++]=C[n]){delete C[n++];};A[0]+=C[0]-1;C[0]=0;
を使っている。
re=regexpとして、Array Aに一致するデータがあれぼそれを取得、結果をArray Aに出力、A[0]に合計が記載。

これ以上(コードサイズ、ある程度の速度、メモリの使用量を極力少なく)という条件で最適化できるだろうか…
だれか頼む。
入力と出力先が同じでも、別でも作動するコードなら尚のこと良いのだが…
0690デフォルトの名無しさん
垢版 |
2012/07/17(火) 22:03:00.62
基本的に一度作って後は必要に応じてコピペだがらな。他には
function grep( o, re, p, B, this, a ){
B[0]=0;if(o~"-v"){while((getline v < p)>0){if(!match(v,re))B[B[0]+=1]=v;}return B[0];};
if(o~"-o"){while((getline v < p)>0){a=v;while(match(a,re)){B[B[0]+=1]=substr(a,RSTART,RLENGTH);
a=substr(a,RSTART+RLENGTH);}};return B[0];};while((getline v < p)>0){if(match(v,re))B[B[0]+=1]=v;}return B[0];
}
なんかも良く使う。grep("-o","pattern","/var/log",data);みたいな感じで。前のはagrep("-v",pattern,B,C)の一部分。
日ごろのメンテでちょっとした手作業じゃめんどいの組むときに、ほぼ数分で組みあがるのが楽なんだよ。
サブプロセスとしてgrep呼び出すのがコストかかる時とか、perlが破損した状況でのリカバリースクリプトとして組んだのが元だけど。
カーネルさえ生きていれば後はawkバイナリ流し込めば使え、shが半分死んでいてもなんとか動くし。
0691686
垢版 |
2012/07/21(土) 23:12:03.74
>>688
BEGIN{
 QMAX=9007199254740991
 QTopPos=QTailPos=QNum=0;
 hitTop=0;
 A[++z]="hoge";
 A[++z]="1 2 3 4 5";
 A[++z]="fuga";
 A[0]=z;
 for(i=1;i<=A[0];i++){
  p=1;
  while(match(substr(A[i],p),/[0-9]+/)){
   p+=RSTART-1;
   enQ(substr(A[i],p,RLENGTH));
   p+=RLENGTH;
  }
  if(QNum>0){
   while(QNum && hitTop<i)A[++hitTop]=deQ();
  }else{
   delete A[i];
  }
 };
 if(QNum>0) while(QNum)A[++A[0]]=deQ();
 for(z=1;z<=A[0];z++)print "A[" z "]:" A[z];
}
0692686
垢版 |
2012/07/21(土) 23:44:24.03
691の続き
ちなみに、A[1]〜A[A[0]]をgrepして結果はA[1]〜A[?]に戻すスクリプトね。
複数件マッチする事があるので未処理行を上書きしないようにキュー使ってる。
function enQ(PushVal){
 if (QNum+1 > QMAX){print "Queue Overflow"; exit;}
 nextPos = (QTopPos+1) % QMAX;
 QBody[QTopPos]=PushVal;
 QTopPos=nextPos
 QNum++;
}
function deQ(){
 if (QNum<1){print "Illigal dequeue"; exit;}
 QNum--;
 TailVal=QBody[QTailPos];
 delete QBody[QTailPos];
 QTailPos=(QTailPos +1) % QMAX;
 return TailVal;
}
リングバッファの上限超えたら終了させてるけど>>688の実装も上限超えたらバグるし許して。
計ってないけどループがない分早い筈。コードサイズはお察し。
メモリはA[]にデータ抱えてる時点でアウトな感じだけどA[]を適宜消すようにしといた。
出力先を別にしたいならA[]にdeQ()せず別変数にすればおk。
これで良い?
0693688
垢版 |
2012/07/22(日) 09:36:17.43
>QMAX=9007199254740991
ワロタwww
俺のも確かにwhile(C[p+=1]=C[n+=1]);の部分で保持してるのすべて消費分だけ上に移動させてるのが無駄なので
そのループが無い分は確かに早いはず。

あと、恥ずかしながら尋ねたいのですが、俺>>688の実装で上限超えたらバグるをkwsk
なんか見落としてたのか今更ながら心配になってきた。
昔作ったやつなんで、結構な頻度使ってきたのだが今までバグに気づかなかった

しかしデータをメモリ上に展開するからどうしても上限が出てくるな…
awkで10GBぐらいの扱う時はgetlineでなんとかなるけど、やはりメモリマップやポインタが使えたら便利だよなぁ
パッチ作ったら需要あるかな?
0694デフォルトの名無しさん
垢版 |
2012/07/22(日) 11:41:46.83
>>693
691、ちょっと訂正。無駄にキュー使う分、元スクリプトから劣化してた。
>    p+=RSTART-1;
>-   enQ(substr(A[i],p,RLENGTH));
>+   if(hitTop+1<i){
>+    A[++hitTop]=substr(A[i],p,RLENGTH)
>+   }else{
>+    enQ(substr(A[i],p,RLENGTH));
>+   }
>    p+=RLENGTH;
あと、良く考えたら出力先を別にするなら、そもそもキュー不要。

バグってのは687で数値上限云々と書いたとおり、
”C[0]+=1”がawkの整数の精度誤差なし演算可能上限を考慮していないだけ。
どのawkも多分そうだと思うけど、手元の環境下での実行結果↓
C:\>gawk --version
GNU Awk 3.1.7(windows special Nov 24 2009)
C:\>gawk "BEGIN{print 9007199254740990+1}" nul
9007199254740991
C:\>gawk "BEGIN{print 9007199254740991+1}" nul
9007199254740992
C:\>gawk "BEGIN{print 9007199254740992+1}" nul
9007199254740992

実際は(hddやメモリが先に死ぬので)
一行でこれだけ正規表現がhitする事は事実上無いし、
仮に発生しても検索結果が潰れるだけで、気付かない筈。
0695688
垢版 |
2012/07/22(日) 13:39:49.16
>9007199254740992
理論上、8192ペタバイトの同じデータ[aaa...]でregexp="."とすれば、発生するな…
IEEE 754の52bit制限だから、これ以上のでかい数字扱うならbig numbert対応のライブラリか,
"bc -q" |& で動かすか、xgawk、dnawkあたり使うべきだなぁ

昔誰かがbignumのawkスクリプト書いて放流していた覚えがあるのだが、
ググッても見つからん。手元にあるのはビット演算のやつだけだわ
いつかそれだけのデータをメモリ上に保持できるマシンを扱ってみたいものだ…
0696デフォルトの名無しさん
垢版 |
2012/08/03(金) 02:35:23.75
awkってabsとかacosなどの基本的な算術関数が用意されてないんですね
今後も実装されることはないんでしょうか?

パイプでサクッとつないでワンラインで処理するのに重宝してたんですが・・・
代わりとなると、何使うのがよろしいですか?
できればperlは使いたくないです(どうしても好きになれない
0697デフォルトの名無しさん
垢版 |
2012/08/03(金) 06:48:38.25
absは自分で書けばいいし、acos(x)はatan2(x, √(1.0 - x*x))と書けるから、
どちらも基本的ではないと判断して組み込みじゃないんだと思うけど。

PythonかRubyでいいんじゃない? ワンライナー向きではないけど。
0700デフォルトの名無しさん
垢版 |
2012/08/03(金) 20:21:59.43
昔それでベクトル演算して遊んだな
0701デフォルトの名無しさん
垢版 |
2012/08/04(土) 09:23:47.83
Rubyはそこそこワンライナーも書ける感じがする、awkやPerlほどじゃないけどね
Pythonは流石にコード起こさないと辛いことが多いが
0707デフォルトの名無しさん
垢版 |
2012/08/05(日) 09:56:26.63
デバッグ大変過ぎて死ぬる
$ cat witch.awkpp
class Witch {
var spell
method new() { spell = "mahalic mahalita" }
method perform() { print spell }
}
class Samantha : Witch {
method perform() { print "twitch" }
}
BEGIN {
# wife = Witch.new() エラー要因行
wife = Samantha.new()
wife.perform()
}
$ gawk -f awkpp -r witch.awkpp
gawk: -:10: () エラー要因行
gawk: -:10: ^ syntax error
gawk: -:10: () エラー要因行
gawk: -:10: ^ 表現の char '?' は不正です。
0708デフォルトの名無しさん
垢版 |
2012/08/22(水) 00:09:49.86
size: 656 byte, supports -o -v option. Array A and B can be the same (NEW)
function xagrep( o, re, A, B, this, a, i,k ){
k=0;B[0]=A[0];if(o~"-v"){for(i=1;i<=A[0];i++){if(!match(A[i],re)) B[k+=1]=A[i];}B[0]=k;return k};
if(o~"-o"){B[B[0]+1]=0;for(i=1;i<=A[0];i++){a=A[i];if(i==k){i=i-B[B[0]+1]+1;B[B[0]+1]=k;k=B[0]+2;
while(i<=B[B[0]+1]){B[i++]=B[k];delete B[k++];}i=B[B[0]+1];k=i;B[B[0]+1]=0;}while(match(a,re)){
if(i>k){B[k+=1]=substr(a,RSTART,RLENGTH);}else{B[B[0]+1+(B[B[0]+1]+=1)]=substr(a,RSTART,RLENGTH);
k++}a=substr(a,RSTART+RLENGTH)}}if(i<k){i=k-i;k=B[0]+1;B[0]=i+B[B[0]+1];while(i<B[0])B[i+=1]=B[k+=1];
while(i<k)delete B[i+=1];}return B[0]}for(i=1;i<=A[0];i++){if(match(A[i],re))B[k+=1]=A[i];}B[0]=k;return k;
}
これ以上削れるところ無いかな? 
高速化+サイズ優先で、変数はできるだけ使う数を少なくとの条件で
0709デフォルトの名無しさん
垢版 |
2012/08/22(水) 09:51:11.01
>>708
その3つの条件の優先度がわからんな。

結構同じ部分式があるので変数に入れた方が変数は増えるけど短くなるし
場合によっては速度も速いとかありそうだけどどうなん?

例えばB[0]は特別な用途っぽいけどxとか1文字変数にしてreturnの直前に
書き戻した方が文字数は稼げる。

あと細かいがhoge+=1より++hogeの方が1文字短いとか、いらない「;」が
残ってるとか詰めが甘いところがまだあるね。
0710デフォルトの名無しさん
垢版 |
2012/09/30(日) 22:45:00.64
以下のようなデータの処理について質問いいでしょうか。
$1に経過時間(時刻)、$2に「速度」があれば$3の数値は速度を、$2$3に
「up a」「down a」などとあればその時刻での行動を示します。

このデータからup、downの場所を求めたいと思います。
つまり、下の例で移動開始からの距離3でup a、距離3.5でup b、という具合です。
経過時間と速度から場所を計算するだけですが。速度を変更するタイミング・
回数は不定、速度データと行動データはともに経過時間順に記録されています。
速度変更をどう扱えばいいのか、ちょっと頭が回りません。

---元データ例---
0 速度 10
50 速度 20
200 速度 25
30 up a
35 up b
40 down a
40 down b
50 up a
70 down a
200 up c
250 down c

---処理後---
3 up a
3.5 up b
4 down a
4 down b
5 up a
6 down a
12.5 up c
14.5 down c
0711デフォルトの名無しさん
垢版 |
2012/10/01(月) 11:28:30.42
疑問を提示。
$1が常に時刻で$2が速度のときの$3が速度なら、
30 up aのときに30 * 10で300 up aになるんじゃないだろうか。
同じように、70 down aのときに50 * 10 + (70 - 50) * 20で900 down aになるんじゃないだろうか。

$3が速度(単位時間当たりの移動量)ではなく単位移動量当たりの所要時間なのであれば、
30 up aで30 / 10 = 3、70 down aで50 / 10 + (70 - 50) / 20 = 6になるんだけどね。
0712デフォルトの名無しさん
垢版 |
2012/10/01(月) 13:21:34.21
実装してみた。速度が途中に出てきてもいいようにposを毎回計算するから効率悪いけど。
--
BEGIN {
sCount = 0;
}
$2 == "speed" {
sTime[sCount] = $1;
sSpeed[sCount] = $3;
++sCount;
next;
}
{
pos = 0;
for (ic = 1; ic < sCount; ++ic) {
if (sTime[ic] > $1) break;
pos += (sTime[ic] - sTime[ic - 1]) / sSpeed[ic - 1];
}
pos += ($1 - sTime[ic - 1]) / sSpeed[ic - 1];
print pos, $2, $3;
}
0713デフォルトの名無しさん
垢版 |
2012/10/01(月) 20:30:33.48
>>711
すみません、前者ですね。なんだろう、恥ずかしい。

>>712
なので、アクション部の / を * に変えればよさそうです。

お二方、ありがとうございます。
0720デフォルトの名無しさん
垢版 |
2013/02/06(水) 03:49:18.86
“任意の記号”を含んだシェル変数をawkに渡すことは可能ですか?たとえば

[user@localhost ~]$ var='hoge'
[user@localhost ~]$ echo "hoge" | awk -v var="$var" '
$0 ~ var {print var}
END {print var}
'
hoge
hoge

ここで、varに$を含ませると

[user@localhost ~]$ var='hoge$fuga'
[user@localhost ~]$ echo "hoge" | awk -v var="$var" '
$0 ~ var {print var}
END {print var}
'
hoge$fuga

とうまくマッチしませんでした。var自体は渡されているはずですが、何が原因でしょうか?
0721デフォルトの名無しさん
垢版 |
2013/02/06(水) 11:23:41.42
>>720
いちぎょうめのひだりがわの var は、ひょうかのさいに
せいきひょうげんへのかたへんかんがおこなわれる。

$0 ~ /hoge$fuga/ {print "hoge$fuga"}
END {print "hoge$fuga"}

めたもじとなってしまうものは、じぜんあるいはこーどのなかで
えすけーぷするひつようがある。
0722デフォルトの名無しさん
垢版 |
2013/02/06(水) 11:29:22.31
~(チルダ)の右辺は正規表現として解釈されるから、"hoge" ~ /hoge$fuga/ でマッチするわけがない。
逆に寧ろ、"hoge$fuga" ~ /hoge/ ならマッチする。
0724720
垢版 |
2013/02/06(水) 15:09:21.72
すいません、echo "hoge"ではなくecho "$var"でした。
ただ、結果は>>720と同じです。

要は入力ファイル内の「メタ文字込みの任意の文字列」を、別の「メタ文字と改行込みの任意の文字列」で置換する、
というのをメタ文字のエスケープ等の面倒な処理をせずにサクッとやりたいのですが、できますか?
0725デフォルトの名無しさん
垢版 |
2013/02/07(木) 05:01:43.19
ムリ

予め「メタ文字と言っても $ しか出てこない」とか判ってるなら大したこと無いけど
一般化すればするほど面倒になる
0726720
垢版 |
2013/02/07(木) 22:14:56.21
>>725
やはりそうですか。
今までこういった処理はsedでしこしこエスケープしてやってたんですが、いい加減面倒になったので、
たとえばfgrepみたいに正規表現をオフにして処理する方法はないかと探しているんですが、
awkでは無理ですか・・・。
0727デフォルトの名無しさん
垢版 |
2013/02/08(金) 11:20:14.98
>>726
単に一致なら正規表現なんか使わずに比較すればいいじゃん。
fgrepで事が足りるのならawkからfgrepを起動すればいいじゃん。
0729720
垢版 |
2013/02/09(土) 15:32:27.55
>>727
>単に一致なら正規表現なんか使わずに比較すればいいじゃん。
意味が分からないんですが、awk上の話ですよね?

>>728
index()の引数は文字列だから、これをうまく使えば目的の処理ができる・・・のかな?

でもなんかawkでごちょごちょやるより、メタ文字をエスケープする前処理をかますなり
何なりしたほうが素直な気がしてきた・・・。たとえばこんな感じで

$ var='hoge$fuga'
$ var2=$( echo "$var" | sed 's/\$/\\\\$/g' ) ←エスケープ処理
$ echo "$var" | awk -v var="$var2" '
$0 ~ var {print var}
END {print var}
'
hoge\$fuga
hoge\$fuga
0730デフォルトの名無しさん
垢版 |
2013/02/09(土) 17:49:52.25
/bin/shでごちょごちょやるのが好みなら、awkもfgrepも使わず、case文でやりゃいいんじゃないの。
0732デフォルトの名無しさん
垢版 |
2013/02/10(日) 14:31:49.57
>729
いや、その方法でも結局 ' はエスケープが必要でしょ。
ダイレクトにシェル変数に入れる方法か、
ファイルなどに吐き出しておく方法の方が安定。
まぁそれでも改行とか制御文字入れられるともにょる場合があるけどな。
0736デフォルトの名無しさん
垢版 |
2013/03/11(月) 10:05:12.56
#
# text converter ( Mac to MS-DOS on Windos/MS-DOS machine)
# convert CR to CR+LF
#
BEGIN{ RS = "\r" }
{ print }
0737デフォルトの名無しさん
垢版 |
2013/03/15(金) 08:05:25.28
#
# Line(行数)を数える
#

END { FNR }
0738デフォルトの名無しさん
垢版 |
2013/03/20(水) 19:07:17.00
# text to html converter
# usage: awk -f txt2htm.awk infile1.txt > outfile2.html

BEGIN{
print("<html>"); print("<head>")
print("<titile> My favorite URLs </titile>")
print("</head>"); print("<h1> </h1>"); print("<body>");
}

/^[:space:]*http/ { print "<A HREF=\""$1"\">"$1"</A><BR>"}

END{
print("</body>")
print("</html>")
}
0739UNIX(LF) to DOS(CR+LF) conversion
垢版 |
2013/03/21(木) 21:15:00.86
awk 1 infile1 > outfile2.txt
0740デフォルトの名無しさん
垢版 |
2013/03/21(木) 22:10:08.07
# awk -f add.awk
BEGIN {
  s1 = "323524855"
  s2 = "4972560"

  reverse(a2, s2)
  size = reverse(a1, s1) # s1 > s2
  carry = 0

  for(k = 1; k <= size; k++) { # s1 > s2
    d = a1[k] + a2[k] + carry
    if(d >= 10) {
      e[k] = d - 10
      carry = 1
    } else {
      e[k] = d
      carry = 0
    }
  }

  if(carry == 1) {
    e[k] = 1
    size = k
  }

  g = produce_string(e, size)
  printf("%s + %s = %s\n", s1, s2, g)
  printf("%f\n", s1 + s2)
  exit
}
0741デフォルトの名無しさん
垢版 |
2013/03/21(木) 22:11:11.39
# >>740のつづき
function reverse(a, s, k, i) {
  k = 1;
  size = length(s)
  for(i = size; i >= 1; i--) {
    a[k++] = substr(s, i, 1)
  }

  return size
}
function produce_string(a, size, i) {
  g = ""
  for(i = size; i >= 1; i--) {
    g = g a[i]
  }

  return g
}
0743grepをawkで
垢版 |
2013/03/22(金) 13:32:02.74
# usage: awk -f grep.awk char1 file1 file2

BEGIN{
pattern = ARGV[1]
ARGV[1] = ""
}
$0 ~ pattern {print($0" File name=" FILENAME)}
0744デフォルトの名無しさん
垢版 |
2013/11/30(土) 12:16:25.95
$ echo 10 20 30 | awk '{for(i=0;i<4;)print _$++i}'
10
20
30

_$++iでも$++iでもどちらでもいけるのですが、アンダースコアが付いて何故大丈夫なのでしょうか?
0749デフォルトの名無しさん
垢版 |
2014/04/19(土) 13:45:38.45ID:Db2IzPol
とあるgawkスクリプトの先頭で
{last_hoge=hoge; hoge=$ 3}
ってやってるんだけど、
hoge=$ 3はhoge=$3の間違い? それともこういう記法がある?
0754デフォルトの名無しさん
垢版 |
2014/04/20(日) 15:12:13.25ID:k3tDznaJ
今はじめて知った。haskellの$は演算子だって知ってたけど、awkでも演算子だったんだね。
0757デフォルトの名無しさん
垢版 |
2014/10/21(火) 15:46:10.36ID:TQsAGJgk
質問させてください

今ディレクトリ内のファイルの名称とサイズのリストを作りたいと思っています
コマンドとしてはls -lを実行していますがこれをさらにawkにパイプしています
ただしファイル名にスペースが含まれているため以下のような苦肉の策をとっておりますが

ls -l | awk '{print $5 "\t" $9$10$11$12$13$14$15$16$17$18$19}'

10個以上で区切られてる可能性もあるため根本的な対応をしたいと考えていますが
よい案はありますでしょうか
0758デフォルトの名無しさん
垢版 |
2014/10/21(火) 17:25:55.68ID:EsuQiv22
# ファイル名に「"」が含まれていたら知らね。
ls -Ql |awk '{split($0, foo, "\x22"); print $5 "\t" foo[2]}'
0762デフォルトの名無しさん
垢版 |
2014/12/14(日) 00:00:31.34ID:7YfznIJB
どちらも非可読文字ですね。そしてそうなるとスレ違い。
awkと絡むのなら具体的にどうぞ。
0763デフォルトの名無しさん
垢版 |
2015/02/03(火) 10:36:52.13ID:Dvc0nyMp
Terastationのファイル・ホルダ名に使うとファイルレプリケーションでエラーが起こる文字があって、それを変換するバッチを生成する時にこのマイナー言語が大活躍した。
約80万件のファイルホルダ名から抽出するのに10分程度だった。
0764デフォルトの名無しさん
垢版 |
2015/05/26(火) 00:18:03.33ID:Y5HiR/XE
Gawk4.1.2が出たなあ、と思ってたらすぐ4.1.3が出た。
素人には違いがあまり分からんのだが。
0766デフォルトの名無しさん
垢版 |
2015/06/03(水) 20:45:34.22ID:vBAc8MUN
>>765
買ってきた。まだ最初の方と最後の方を眺めただけだけど。

ページiv(「はじめに」)でawkの表記について「本書内では、いずれの
場合もすべて小文字のawkという表現に統一しております」と
あるのに、書名がAWK。

巻末のリファレンスで気になったところ。
演算子の優先順位に触れていない、フィールド演算子が
「特別な意味を持つな変数」の中に入れられている。

参考書や文献がないけど、今時は「ネットでググれ」かな。
0767デフォルトの名無しさん
垢版 |
2015/07/06(月) 22:02:56.12ID:Wnwr3Nh9
Mono: Playback -9707 [5%] [-97.07dB] [on]
上の行からパーセントを除いた数字(上の例だと5)を取得したいのですがどのようにしたらよいでしょうか?
パーセントの値は0から100の整数だと思います
0771デフォルトの名無しさん
垢版 |
2015/07/10(金) 10:45:11.15ID:VcZTZ3UB
テンプレである筈の1が読めないんだが、このスレ的にはPOSIXで書くのが
正統?普段はGawkしか使わないので一応確認。
0772デフォルトの名無しさん
垢版 |
2015/10/10(土) 22:36:33.12ID:1AEUTcmG
awk の a は、aho の a

ただし、エイホと読むらしい
へぇーーーーー
0774デフォルトの名無しさん
垢版 |
2016/02/18(木) 00:13:16.92ID:E3KgV2Kz
普通は x[3]=5 と書くが、=なしの
x[3]
だけでもエラーとならず、x を配列として確保し、length(x)=1 になるのを発見
まあ、あまり必要ないけど
0778デフォルトの名無しさん
垢版 |
2016/02/28(日) 01:02:06.47ID:Atbyv4Wk
IGNORECASE=1
をBEGIN の前に置いてもエラーにならず、不可解動作
セキュリティ的にやばくないの
0779デフォルトの名無しさん
垢版 |
2016/02/28(日) 02:01:41.85ID:2mMmSiU+
>>778
BEGIN セクションを先頭に書けとは何処にも書いてない。

BEGIN を最後に書いても END を最初に書いても問題は無い。
何処に書いても、実際には先頭行読み込み前、各行読み込み時、最終行読み込み後にそれぞれ
パターンマッチが行われている。
ただマッチする条件が特殊だから、先頭か最後でしか中の文が実行されないだけ。
0780デフォルトの名無しさん
垢版 |
2016/03/29(火) 09:03:58.15ID:/c8bAcK4
サッカーブッシュ日本代表日程ぷあたん(しゅっちょうまいくろ教育長交代)春文執行40代売上差額シュガーチョコ
https://www.youtube.com/watch?v=NDq1QoJY0nY宇ドナルドアナリストパワーストーンコーチングとしまえん
サッカーブッシュ日本代表日程古本屋よしたけしゅっちょうちょこしゅがー
ディーラー税務署天才開発者死亡詰みヨミドクターマイクロサービス不足
サッカーブッシュ日本代表日程ぷあたんシフト光金さかい強制バイト人権侵害問題
春分資源執行ニューヨーク低原価ぼったステーキソルトレイク福岡横浜新橋奴隷課金パチシフト強制バイト問題新潟米センター生残
コスメ24チャリティー隠れ40代生活保護プレイボーイバイトレードいたりあん接待問題
マスコミKARDローンケーオーサービス不足婚活パーティー寄付金執行原発ビジネス
FBIチャイニーズタイホテル売上事務所ガチャ決算ガチャキャンペーン(販売報道陣過激派組織向携帯最新情報提供終了
校長発言細心注意ノートン産廃エラー(著作権クレーム中国反応融資高額教育費)(中国捕鯨団体40代社員サッカーコメント
高額入学金ヤフウ新橋大学ヤフウ新橋理事長FX経費 おじや50代資産ガリバズフィード40代エリート
0781awk命
垢版 |
2016/05/10(火) 10:11:56.15ID:qP72K9YB
mawk32.exeで「multibyte char」のメッセージがでて困ってます、何が原因でしょう?
抑止する方法はありますか?
multibyte指定のコマンドラインオプションは無いようなのですが?
0783awk命
垢版 |
2016/05/11(水) 00:10:08.64ID:EkexSAUH
>782

データもプログラムもSJISです。
何に反応して multibyte charが出続けるのか不明です。
gawk高速なので満足なのですが、STDERRに multibyte charがで続けるのでうざいし、この出力ぶんだけ速度も低下?
0784デフォルトの名無しさん
垢版 |
2016/05/11(水) 00:13:30.76ID:Qn6YFszJ
入力にSJISでない文字が混在していることない?
nkf -s 入力ファイル | awk
で変換したら
0785デフォルトの名無しさん
垢版 |
2016/05/11(水) 03:47:08.47ID:6KznZIvs
コードを教えて下さい。
チャレンジしましたが、これではダメです。。
(for i=1, i<=NF, i++){
if $i<0{$i=0}
}
print $0


したいことは、下記のような行列の数字があって、負の値をゼロに置換したいです。

▼元の行列
3 15 6 1
-5 4 0 2
8 9 -7 11

▼やりたい変換後の行列イメージ
3 15 6 1
0 4 0 2
8 9 0 11
0786デフォルトの名無しさん
垢版 |
2016/05/11(水) 04:14:37.49ID:gi9ycYMA
構文がぜんぜん駄目。
{for(i=1;i<=NF;i++)if($i<0){$i=0};print $0;}

「したいことは、〜したいです。」の構文も駄目。典型的なねじれ文。
0790デフォルトの名無しさん
垢版 |
2016/05/13(金) 01:56:22.83ID:VtzDMLxe
awk じゃなくてもいいんなら

$ sed 's/-[0-9][0-9]*/0/g' ...

GNU sed なら

$ sed -r 's/-[0-9]+/0/g' ...

でええんちゃう?
0791デフォルトの名無しさん
垢版 |
2016/06/22(水) 00:21:13.08ID:X+fwM1CQ
かまぷ 「『シェル芸』に効く AWK処方箋」

エイホ先生「AWKって使い捨ての言語(中略)プラスアルファの処理がやりたいよね。
ただその処理はとても簡単な処理でいい。そこに対して新しいプログラム言語を作っていきたい」

AWKブーム第1世代は「アイドル辞書」で学んだ――日本GNU AWKユーザー会 斉藤さん (1/5):CodeZine(コードジン)
http://codezine.jp/article/detail/9478
2016/06/15 14:00
0792デフォルトの名無しさん
垢版 |
2016/06/22(水) 23:46:54.12ID:P+7nG182
やたらと続きは登録して読めと言われてもなあ。
このスレが立った頃からJGAUCのHPが更新されていないってのも凄い。
0793デフォルトの名無しさん
垢版 |
2016/08/27(土) 09:20:46.26ID:2q8s4uQl
Windows版のgawkで遊んでたら
for (i=0; i<n; i++) より
for (i=0; i<n; i+=1) のほうが
実行時間が短くなることに気づいた
なんだこりゃ
0794デフォルトの名無しさん
垢版 |
2016/09/13(火) 23:56:36.77ID:mfLTwPLq
for(i=1;i<=1000000;i++){a[i]=1}

for(i=1;i<=1000000;i++){a[i]=sprintf("1")}
結果は同じはずなのに、後者は異常にメモリを食う!ふしぎ!
0795デフォルトの名無しさん
垢版 |
2016/09/14(水) 00:22:19.58ID:YCeX8Gov
同じじゃないぞ。数値と文字列だ。
ところで、君が使ってる awk はどれ?

apropos awk

ってやってみたら、こんなん出てきた。

gawk (1) - パターン検索・処理言語
igawk (1) - インクルードファイルを使う gawk
a2p (1) - Awk to Perl translator
awk (1) - pattern scanning and text processing language
English (3perl) - use nice English (or awk) names for ugly punctuation v...
mawk (1) - pattern scanning and text processing language
nawk (1) - pattern scanning and text processing language
0796デフォルトの名無しさん
垢版 |
2016/09/14(水) 22:01:59.31ID:DqYC5LBT
>>795
例が悪くてスマソ、Cygwin上でgawk4.1.4使って
for(i=1;i<=1000000;i++){a[i]="1"}

for(i=1;i<=1000000;i++){a[i]=sprintf("1")}
でループ脱出直後のメモリ使用量を比較すると
上が60MBytes、下が600MBytesとかになった

cmdで動くgawkの3.1.7でも同じような差がでた
Linuxは試していないけど、もし大丈夫ならWindows版の問題かも
0797デフォルトの名無しさん
垢版 |
2016/09/14(水) 22:50:10.30ID:PWB0Awgu
>>796
OSX El Capitan
gawk 4.1.4

それぞれBEGIN{}に入れたスクリプトを読み込ませて実行。
で前者数十MB、後者3GB超までメモリ使った(アクティビティモニタ)。
0798795
垢版 |
2016/09/14(水) 23:40:38.22ID:YCeX8Gov
やってみたよ。環境は Debian jessie。
テストプログラム

#!/usr/bin/perl -w
use strict;
{
my $do_ps = 'system("ps p $PPID o pid,sz,args")';
foreach ( 1,'sprintf("1")'){
system('gawk',"BEGIN { for(i=1;i<=1000000;i++){a[i]=$_} $do_ps;}");
}
}

実行結果

PID SZ COMMAND
7389 7693 gawk BEGIN { for(i=1;i<=1000000;i++){a[i]=1} system("ps p $PPID o pid,sz,args");}
PID SZ COMMAND
7392 158116 gawk BEGIN { for(i=1;i<=1000000;i++){a[i]=sprintf("1")} system("ps p $PPID o pid,sz,args");}

KB 単位らしいから 8MB と 160MB 。ただごとじゃない差だね。
1 を "1" に変更してもこんな感じだから数値と文字列の差というわけではなさそう。
0799デフォルトの名無しさん
垢版 |
2016/09/14(水) 23:49:14.48ID:YCeX8Gov
ごめん、書き忘れた。

GNU Awk 4.1.1, API: 1.1 (GNU MPFR 3.1.2-p3, GNU MP 6.0.0)
Copyright (C) 1989, 1991-2014 Free Software Foundation.
0800デフォルトの名無しさん
垢版 |
2016/09/17(土) 08:30:37.61ID:didBD5ba
よく考えたら、メモリの使用量自体じゃなくて、それがどれだけ増えたかが重要だね。
そして、連想配列の構造体とキーに必要な量はどのケースでも同じと考えられる。
つまり、連想配列の要素のための量がどれだけ違うかを直接知ることができるはず。
というわけで、もう一回テスト。

https://ideone.com/mRuFj7
0801デフォルトの名無しさん
垢版 |
2016/09/17(土) 08:32:42.20ID:didBD5ba
実行結果

element before after diff
1 5685 7691 2006
i 5685 29226 23541
sprintf("%d",i) 5685 158124 152439
sprintf("%d",i) + 0 5685 29221 23536
sprintf("%d",i) "" 5685 37026 31341

1000000 要素の配列で 2MB って、いったいどうやってるんだろう。少なすぎる。
sprintf("%d",i) が突出して多いのは sprintf で多めに確保して
切り詰めたりせずにそのまま使ってるのだろうか。
さあ、gawk のソースコードをハックしてみるか!
0802デフォルトの名無しさん
垢版 |
2016/09/17(土) 14:11:27.89ID:IIH0ZjSk
推測だけど、stream, yield, callback、遅延処理かも

データをバッファサイズ分だけ読み込んで処理して、
次のコマンドへ送ったら、それを捨てて、次のデータを読み込むのかも

この方式だとメモリは、バッファサイズ分だけしか使わない
0803デフォルトの名無しさん
垢版 |
2016/09/18(日) 10:41:36.96ID:6jI6cHER
ベクターに公開されてるgawk3.1.5(と非公開の3.1.7)、ヘンテコな処理が見つかったのでメモ
このgawkのsystem関数を実行すると、環境変数TMPが指してるフォルダに
@echo off
system関数の引数
という2行が書かれたバッチファイルpip?.bat(?はsystem実行回数+1)というのが作成され
0804デフォルトの名無しさん
垢版 |
2016/09/18(日) 10:44:42.56ID:6jI6cHER
・・・いっぺんに書こうとしたらハネられるorz
0805803
垢版 |
2016/09/18(日) 10:46:32.08ID:6jI6cHER
(続き)
それを/c pip?.batで起動、完了後にpip?.batを
削除という流れでコマンドが実行される
0806803
垢版 |
2016/09/18(日) 10:47:07.98ID:6jI6cHER
(続き)
system関数を使ったスクリプトを同時に1つしか実行しないなら良いけど
2つ以上実行したときはタイミング次第でpip?.batの数字がぶつかり、先に実行した側が
・ コマンドが実行されない
・ コマンドが実行されるけど、完了後に「バッチファイルが見つかりません」が吐かれる
という結果になる

予めcmdの窓ごとにTMPを変えておけば問題ないけど面倒くさい
コマンド | getlineで起動したほうが手っ取り早いと思う
(ただし出力が2KBytes溜まると止まるから適宜リダイレクトする)

でも何でこんな方法でsystem関数を実装したんだろうね(´・ω・`)
0807デフォルトの名無しさん
垢版 |
2016/09/18(日) 13:53:41.51ID:EIh/dcA1
tmpfile を使えば、他と重複しない、ランダムな名前のファイルを作れるのに、

どうして使わないのだろう?
0808デフォルトの名無しさん
垢版 |
2016/09/18(日) 14:54:02.97ID:KtcAr9oX
MS-DOS ではね、コマンドラインの長さの制限が厳しかったんだよ。驚くなかれ、たった 128 バイトだ。
そんな環境では、バッチファイルにすれば実行できるけど

command /c "prog arg1 arg2 ..."

では command /c のせいで制限を越えるということもあるだろう。つまり、そういうことだ。
………冗談だ。確かにそういう制限はあったけど。
現在はもう system 関数ではそういうことをしていないということが ChangeLog に書かれてるよ。

2014-01-15 Eli Zaretskii <eliz@gnu.org>
* popen.c (os_system): Use spawnl, and quote the command line, to be consistent with what gawk_popen does.
(os_popen) [__MINGW32__]: Don't scriptify the command, to be consistent with gawk_popen.
(os_pclose) [__MINGW32__]: Update to match os_open: no need to unlink the script file.
0809デフォルトの名無しさん
垢版 |
2016/09/18(日) 15:07:54.47ID:KtcAr9oX
でもソースコードを見るかぎり、パイプではそういうことをしてるみたいなんだけど……
ちょっと試してみてくれないかな。

system("dir") | getline

みたいな感じ? よく知らないけど。
0810803
垢版 |
2016/09/18(日) 16:19:12.82ID:6jI6cHER
コマンド | getline で起動する場合はpip?.batは作られませんでした
system関数だけpip?.bat経由の模様
klabaster版のwindows用gawk4.1.3だとsystem関数がpip?.batを
作らなかったから、ベクター版固有の動きかなあと思います
0811デフォルトの名無しさん
垢版 |
2016/09/18(日) 17:46:00.36ID:KtcAr9oX
ありがとうございます。
gawk-4.1.1 の pc/popen.c を見た限りでは gawk の system 関数でバッチファイルを作るのは MINGW 限定で、
ChangeLog には問題が解消されたから直接 spawnl で実行するようにしたと書かれているわけですが
gawk のパイプ処理を実行している(と思われる) os_popen 関数ではバッチファイルを作るときと同様に
tempnam 関数でファイル名を作った上で、そのファイルを経由して受け渡しをしているように見えます。
これは MS-DOS の時代から使われてるやり方で、パイプのように見えてもパイプではありません。
このやり方だと gawk で

while (( command | getline) > 0)

と書いても実質的には

system("command > filename"); while (( getline < "filename") > 0)

と同じことになります。
あくまでも 4.1.1 の pc/popen.c の os_popen 関数がそう見えるというだけで、実際には違うかもしれませんが
自分で試すことができません。そもそも 3.1.5 のソースコードってどこにあるの?
もし勘違いじゃないなら >>806 と同じ問題が起こりそうな気が……
Linux を使ってる自分には関係ないといってしまえばそれまでですが。
0812デフォルトの名無しさん
垢版 |
2016/09/18(日) 19:56:17.75ID:zTPoEkjL
>>811
vectorの配布ファイル内のreadmeにはソースコードの
公開場所を探してるとか、直接連絡すれば渡すとか書いてある。

Windows版、NTあたりから一時ファイル作らずにパイプ動作するように
なったとか、どこかで読んだ気がするけど。
0813デフォルトの名無しさん
垢版 |
2016/09/18(日) 22:03:20.37ID:KtcAr9oX
謎は解けた。
ファイルを使ってデータを渡すのはマクロ __DJGPP__ とマクロ __MINGW32__ が
いずれも定義されていない場合らしいです。
Vector のは MINGW なので該当しません。お騒がせしました。
0814デフォルトの名無しさん
垢版 |
2016/09/19(月) 11:56:06.00ID:iIvzjj/t
ファイルを経由していても、ストレージに書き込むとは限らない

メモリ上だけに存在する、ファイルもあり得る。
LinuxのRAMディスク、tmpfs とか
0815803
垢版 |
2016/09/19(月) 14:26:19.66ID:fDWhtT6v
>>811
情報ありがとうございます。>>803で書いた「ヘンテコな処理」をpc\popen.c内に確認できました。
scriptify関数のtempnam呼んでるところでプロセスIDもつけるなり、細工したいなあ・・・
0816デフォルトの名無しさん
垢版 |
2016/09/20(火) 17:00:26.41ID:RIxgZ1yj
先日アクセスできなかった GNU のサイトが復活してたので 3.1.5 のソースコードを入手できました。
やっぱり os_popen からも scriptify を呼んでたみたいですね。4.1.1 のソースコードじゃ判りませんでした。
一応 chdir はアトミックな処理のはずなのでリスク回避に役立つと思いますよ。それ以外に方法がなければ。
chdir したら rmdir も忘れずに。
0817デフォルトの名無しさん
垢版 |
2016/09/20(火) 17:06:03.57ID:RIxgZ1yj
間違えた。chdir じゃなくて mkdir です。
0818デフォルトの名無しさん
垢版 |
2016/09/22(木) 12:11:24.09ID:nnsRF/zz
>>794
どうやら >>801 で想像した通り sprintf の仕様らしい。
本体は builtin.c の format_tree 関数らしい。
最初に 512 バイト確保したバッファは大きくはなっても小さくはならない。
実際の文字列に合わせて確保しなおしたらどうなるか >>800 のテストをしてみたよ。

改造前
element           before  after  diff
1               2753  4757  2004
i               2753  22357  19604
sprintf("%d",i)        2753 151283 148530
sprintf("%d",i) + 0      2753  22376  19623
sprintf("%d",i) ""      2753  30174  27421

改造後
element           before  after  diff
1               2753  4757  2004
i               2753  22357  19604
sprintf("%d",i)        2753  30174  27421
sprintf("%d",i) + 0      2753  22373  19620
sprintf("%d",i) ""      2753  30230  27477

あれ? jessie の gawk と比べてメモリの使用量が少ない。
-DDEBUG 付きでコンパイルしたから増えるかと思ったのに。
まあ、それ以外は一応予想通りではある。
0819デフォルトの名無しさん
垢版 |
2016/09/22(木) 23:15:31.17ID:SYBS8P/o
>>793とか
文字列の連結は "A" "B" よりもsprintf("%s%s", "A", "B") の方が速いとか
gawkって結構クセありますね
0820デフォルトの名無しさん
垢版 |
2016/09/23(金) 02:39:22.63ID:o4qLonoN
>>819
> 文字列の連結は "A" "B" よりもsprintf("%s%s", "A", "B") の方が速い
マジか。逆だと聞いていたが。
0821デフォルトの名無しさん
垢版 |
2016/09/23(金) 16:06:39.19ID:Y+5MXC/e
そんなバカな……と思ってやってみた。

https://ideone.com/jIYn2p

jessie 用のパッケージによる実行結果。

i++         6.15614
i = i + 1      6.02501
cat " and " dog   13.0163
sprintf       19.1612

インクリメントと足し算の差は有意とは思えない。
連結と sprintf の差は多分、倍くらい。
sprintf の中の複雑さを考えれば意外と差は小さいといえる。
フォーマット文字列が定数なら正規表現みたいにコンパイルすれば
高速化できる……のかなあ? 自分でやってみようとは(今はまだ)思わない。
0822デフォルトの名無しさん
垢版 |
2016/09/24(土) 23:15:47.76ID:+IiHRmp0
Windowsで使えるawkでUnicodeを正しく処理できる(length("あいう")で3が返ってくる)ものは
Cygwin版とVector版以外に無いでしょうか?
0823デフォルトの名無しさん
垢版 |
2016/09/25(日) 10:08:34.07ID:BH82R274
何があったんですか?

http://tanimoto.to/nlp/jgawk/jgawk.html

に書かれているようなことですか? 別の選択肢も一応あるみたいですが。
トランスレータでもいいなら Perl に a2p が同梱されてます。
0824822
垢版 |
2016/09/25(日) 14:28:36.60ID:MNlfsMjx
特に困りごとは無いのですが、最新のVer4.1.4やその近辺のバージョンで
Unicodeが正しく処理できるものがあれば、今使っているBruce版3.1.7から
乗り換えたいなあと思いまして。

↓の5年前に書かれた記事の頃より選択肢が増えたりしてたら嬉しいなと・・・。
http://blog.livedoor.jp/corbie/archives/3924154.html
0825823
垢版 |
2016/09/26(月) 09:17:05.22ID:bhAuZr+w
理解しました。全滅だったんですね。
Windows での事情は存じませんが、こちらでも取り急ぎ gawk 3.1.5 を make してみました。
ところで、そのページのテスト3は不十分です。
UTF-8 でのパターンマッチは通常文字の誤マッチは原理的に起こりません。起こったらバグです。
だから、UTF-8 に対応しているかどうかをテストするために
sub(/.う/, "U")
というようなものを入れて試してみました。
今ビルドしたばかりの gawk 3.1.5 と jessie のパッケージの gawk 4.1.1 がこのテストに合格しました。
mawk 1.3.3 もインストールされてましたが、こちらはマルチバイト文字に対応していないようです。

さて、結論です。
シフトJIS に対応しているとされるものは避けた方がいいと思います。
余計な改造はしない方が信頼性は高いでしょう。
length がバイト数なのは、単にマルチバイト文字非対応でコンパイルされてるからだと思います。
マルチバイト文字対応版を誰かがリリースしてくれるのを待つか、自分でコンパイルするかですね。
0826デフォルトの名無しさん
垢版 |
2016/09/27(火) 17:33:47.16ID:Icjzq3KF
Linux では環境変数 LANG に UTF-8 が入ってないと期待通りに動いてくれません。
正確には LANG というより LC_CTYPE ですが、それはおいといて。
もしかしたらと思って、自分には無用だと思ってた Wine で klabaster gawk 4.1.3 を動かしてみました。
ところが、正規表現にマルチバイト文字が現れた時点で怒られます。
どうやら LANG が無いか、LANG=C じゃなければマルチバイト文字を使えないようです。
そして結局、正規表現の . や length を UTF-8 モードにする方法は見つけられませんでした。
記事のコメントには LC_ALL=ja_JP.UTF-8 で動くって書いてあるのに。
ひょっとして、Windows では原理的にできないということ?
これはいよいよ a2p が現実的な選択肢か?
……と思ったら、出力する Perl コードが間違ってます。

もう降参です。UTF-8 対応の gawk をお望みの方には Linux への引越しを強くお奨めします。
0828デフォルトの名無しさん
垢版 |
2016/09/27(火) 18:34:39.64ID:BPXrtVfk
Windows Subsystem for Linux (WSL)では、Ubuntu64の実行ファイルが動く。
Linux API を、Windows API へ変換して呼び出す

Ubuntuのパッケージも、apt-getでインストールできる
0829デフォルトの名無しさん
垢版 |
2016/09/27(火) 19:26:43.05ID:Icjzq3KF
だめというか、見つけられなかった。
ただでさえ Windows のことなんか知らないんだからこれ以上無理。
いい方法を知ってたら教えてあげて。
0830デフォルトの名無しさん
垢版 |
2016/09/27(火) 19:51:11.26ID:Icjzq3KF
Cygwin は試してみたけどインストーラに丁重にお断りされたよ。
0831822
垢版 |
2016/09/27(火) 23:10:22.59ID:eGFFwbsN
たくさんの情報ありがとうございます。現状でWindowsに拘るなら、Bruce版3.1.7を継続して
使用するか、Cygwin版に乗り換えるか、Windows Subsystem for Linuxで動作させるかの
いずれかになりそうですね。

CygwinやWindows7でのWindows Subsystem for Linuxは、どちらも別途インストールが必要
とのことなので、職場の自PCはともかくスクリプト配布先に(スクリプトを動かすためだけに)
導入してもらわないといけないのはちょっと難しそうです。
Cygwinの導入状況とWindows10への切り替え時期の様子を見つつ、しばらくBruce版3.1.7を
使うことにします。
0832デフォルトの名無しさん
垢版 |
2016/09/28(水) 07:26:06.87ID:6NcLFLen
実は方法が無いわけではない。シングルバイトモードならできる。でも本当にやりたい?
本当に真剣に必要としているなら、このスクリプトでテスト3をやってみてほしい。

{
  c = "[\\000-\\177]|[\\340-\\357][\\200-\\277][\\200-\\277]"
#  print( length($0));
  str = $0; print( gsub( c,"0",str));
  print;
  sub(/<tag>/, "");
  sub(/<\/tag>/, "");
  sub(/hello/, "ABC");
#  sub(/.う/, "U");
  sub( sprintf("(%s)う",c),"U")
  print;
}
0833デフォルトの名無しさん
垢版 |
2016/10/01(土) 22:37:26.49ID:apxhHWta
やっぱり klabaster gawk はよく解らない。

$cat u2.awk
{
  print( length($0))
  sub(/う/, "U")
  print;
}
$LANG=C wine ../gawk64.exe -f u2.awk u2.txt > /dev/null
$LANG=ja_JP.EUC-JP wine ../gawk64.exe -f u2.awk u2.txt > /dev/null
$LANG=ja_JP.UTF-8 wine ../gawk64.exe -f u2.awk u2.txt > /dev/null
gawk64: u2.awk:3: sub(//, "U")
gawk64: u2.awk:3: ^ unterminated regexp
gawk64: u2.awk:4: sub(//, "U")
gawk64: u2.awk:4: ^ unexpected newline or end of string
$

UTF-8 で「う」は 3 バイトだから、シフトJISで解釈した結果
その後ろの / もマルチバイト文字の一部になるのだろうか。
いや、UTF-8 で解釈してくれないことに文句を言いたいんじゃないんだ。
UTF-8 で書いてあるのになぜ LANG=ja_JP.UTF-8 の時だけエラーになるのだろう。
0835デフォルトの名無しさん
垢版 |
2016/10/08(土) 21:51:54.06ID:66+5bUgM
>>749からのレスで、$が演算子だったの? というようなところが気になって
少し調べてみた(調べたというほどの作業はしてないか)。

まず書籍。手持ちの数冊で確認。
『プログラミング言語AWK』(トッパン 初版第7刷)
さいごのまとめで演算子一覧に記載。本文中(p8)では「欄は常に$1,$2のように
参照しなくてはいけないと思われているかもしれないが、実は$のあとには,欄の
番号を指し示すための任意の式を書いてもよい」と書かれている。また、p46には
「欄変数」の項に「入力行の欄(field)は,$1,$2から始まって,$NFという名で呼ばれる」
との記述がある。

『sed & awk プログラミング』(アスキー出版局 初版)
旧版。本文中(p212)で「フィールドを参照したいときには、フィールド演算子$を使えばよい」
また(p217)で「フィールドを参照するにはドル記号($)演算子を使う」、Appendix(p471)で
「それぞれのフィールドは、$1ならば最初のフィールドの値を参照し、」と表現されている。
Appendixの演算子一覧に記載。

『AWKを256倍使うための本』(アスキー出版局 初版)
Appendixで演算子一覧に記載されているが、本文(p65)で「分解された各フィールドは、
$nという変数(nは、始めのフィールドから順に1,2,3...となる。もちろん即値の代わりに変数を
指定することも可能だ)でアクセスすることができる」とある。他の箇所でも$n変数と書いてある
ところがある。p66で「各フィールドを表す$nであるが、なぜこんな名前になっているかご存じだろうか?
実はこれもUNIX文化からきているのだ。UNIXの代表的なシェルであるshやcsh(最近ではkshや
tcshかな?)のシェルスクリプトのなかでコマンドラインパラメータを表す変数として$nが使用されて
おり(中略)これにあわせてawkで$nが使用されているようなのである」と書いてある。

『AWK実践入門』(技術評論社 初版)
>>766にあるように特別な変数として扱われており、リファレンスにも$が演算子で
あることの記載がない。
(続く)
0836835
垢版 |
2016/10/08(土) 22:00:44.45ID:66+5bUgM
(続き)
ネットの情報。2016.10.8現在。
Gnu Awk ユーザーズガイド/The GAWK Manual/Effective AWK Programming
gawkの解説書。バージョン違いがあるようだが、翻訳版で目に留まったもの。
「定数でないフィールド番号」の項で「あるフィールドを参照するために、awk言語での任意の式を
`$'の後で使うことができる」と記述されている。「演算子の優先順位」の項では演算子として
並べられている。

man gawk
翻訳版、リナックスコマンドというサイト(www.linux-cmd.com)から。
「入力レコード中の各フィールドの値は、左から $1, $2 等という名前で参照できます。
$0 はレコード全体です。フィールドに値を代入することもできます。フィールドは定数だけでなく、
変数によって参照することもできます。」となっている。演算子のところに記載あり。

AWK Users JP
サイト中「awk 基礎文法最速マスター」のページで「特殊変数」の項に$0,$1〜$NFの説明。
フィールド参照の語はない。また、リファレンス的な演算子のまとめはない(?)。
ページ上部に「この文書は書きかけです」とあるので、未整備ということだろうか。

IBM Knowledge Center
awkコマンドのページ(www.ibm.com/support/knowledgecenter/ja/ssw_aix_71/
com.ibm.aix.cmds1/awk.htm)では「レコードとフィールドによるファイル処理」の項で
「各フィールドはフィールド変数によって参照されます。レコードの最初のフィールドには $1 変数、
2 番目のフィールドには $2 変数というように、変数が割り当てられます。」との記述。少しうしろの
方、「フィールド変数」の項でも「フィールド変数は、$ (ドル記号) とそれに続く数値または数値式で
指定します。」とある。$が演算子であることの記載はない。

てな感じで、『プログラミング言語AWK』でも「欄変数」という表現があり、誤解しそうな感じはする。
また、256倍本に書いてあるようにシェルスクリプト中のパラメータとして$nがあることから、$nが
(特別な)変数として認識されてしまっているのではないか、とも想像する。個人サイトのawkの解説
ページでは、$nという変数にフィールドが代入されると説明しているところもあった。そのように理解して
スクリプトを書いてもさして不都合はないだろうな、とは思うが。
0837デフォルトの名無しさん
垢版 |
2016/10/08(土) 23:11:50.50ID:ZMh6U7O9
広範な調査乙。Gawkのrefcardでもちゃんとoperatorに含まれているなあ。
演算子と明確に認識していなくても、$の後に式OKと思っていれば差し支えなさそう。
0838デフォルトの名無しさん
垢版 |
2016/10/18(火) 23:10:18.54ID:TQpGgbw6
gawk4で関数ポインタみたいなもんが追加されましたけど、これlengthとかsubstrの
組込み関数や@loadした自作dllの関数とかにも使えるんですね
案外便利かも

@load "hage.dll"
 BEGIN{
 kumi = "length"
 func = "hagefunc"
 ng[1] = "substr"
 print @kumi("ABC")
 print @func("彡 ⌒ ミ ")
 print @ng[1]("XYZ", 1, 1) # 配列越しに呼ぼうとしたらsyntax error・・・残念
}
0839デフォルトの名無しさん
垢版 |
2016/10/21(金) 17:10:59.85ID:MQQBNMPM
>>756
こういう過疎スレで無駄に突っかかってくるやつむかつくんだが死ね
0843C初心者
垢版 |
2017/02/28(火) 13:18:15.09ID:Mb8mQo1M
awkスクリプトをCソースに変換してコンパイルするための「awka」というツールでできるだけ簡単にUTF−8サポートさせる方法を知りたいです。
ネットで散々調べましたがないようです?
0846デフォルトの名無しさん
垢版 |
2017/03/05(日) 14:45:26.28ID:KmKKYedf
gawkに対応してるなら大丈夫ってことかな?
asciiしか考えていないなら、ソース全チェック…。
要するに、日本語化するんだろうけど。

全然別の言語変換にちょっと咬んだことがあるんだけど、
製品化しちゃってからダブルバイト考慮してないことがわかって、かなり面倒だった。

とりあえず変換してから、ソース見て直すほうが早かったり(笑

がんばってね。
0847デフォルトの名無しさん
垢版 |
2017/03/06(月) 11:39:31.22ID:FdaYmB9f
awkで $1,$2...$6 こんな出力を↓下にしたいんだけど どうすればいいですかね?
470230
470290

002347
002479
0848デフォルトの名無しさん
垢版 |
2017/03/06(月) 12:33:46.83ID:FW5jfGh1
GNU awk の asort() を使うとか。

printf '470230\n470290\n' |
gawk -vFS= -vOFS= '{
for(i=1;i<=NF;i++){
arr[i]=$i
};
asort(arr);
for(i=1;i<=NF;i++){
$i=arr[i]
};
print
}'
0849デフォルトの名無しさん
垢版 |
2017/03/06(月) 15:19:43.83ID:FdaYmB9f
ありがとう
gawk いれないでなんとかならないかな
0850デフォルトの名無しさん
垢版 |
2017/03/06(月) 17:28:40.15ID:FW5jfGh1
う〜ん、そうなると awk を使わなくてもいいかな

printf '470230\n470290\n' |
while read -r n
do
echo "$n" | grep -o . | sort -n | tr -d '\n'; echo
done
0851デフォルトの名無しさん
垢版 |
2017/03/06(月) 19:23:27.89ID:08XsJPyW
>>840
だからブーメランとかそういうの関係ないから死ねって言ってんだろカス
死ね
0852デフォルトの名無しさん
垢版 |
2017/03/06(月) 19:24:30.15ID:08XsJPyW
>>844
粘着が10年位延命しても何もすごくねえよ
突っかかってきたぶちころすぞ雑魚死ね>>840
0853デフォルトの名無しさん
垢版 |
2017/03/06(月) 19:26:33.18ID:08XsJPyW
>>840
ブーメランとかじゃなくて死ねって言ってんだから死ねボケ
0855デフォルトの名無しさん
垢版 |
2017/03/09(木) 21:48:39.65ID:0T9qj2kA
連想配列で
echo '470230' | awk 'BEGIN{FS=""}{for(i=1;i<=NF;i++){a[$i]++}for(i=0;i<=9;i++){for(j=1;j<=a[i];j++){printf("%s", i)}}printf("\n")}'
002347
0856デフォルトの名無しさん
垢版 |
2017/03/10(金) 00:18:57.87ID:+B1nKlhG
既に否定されているがgawk4がもし使えたら
awk '{ORS="";PROCINFO["sorted_in"]="@val_num_asc";x=split($0,a,"");for (i in a)print a[i];print "\n"}'
0857デフォルトの名無しさん
垢版 |
2017/03/10(金) 04:05:38.25ID:wGo6zQ56
最近の gawk ならインクルードファイルが用意されてて join とか使えたり

gawk -vFS= -vOFS= -i join.awk '{split($0,a,"");asort(a);print join(a,1,length(a),SUBSEP)}'
0858デフォルトの名無しさん
垢版 |
2017/04/04(火) 22:35:43.00ID:9/WMFGSO
# gawk4の読込みタイムアウト機能、けっこう便利そう・・・だけどWindowsはCygwin版じゃないと使えない。残念無念。
BEGIN{
  PROCINFO["/dev/stdin", "READ_TIMEOUT"] = 180000
  print "3分間待ってやる"
  getline t < "/dev/stdin"
  if (t=="バルス") {
    print "ああ…ああ…目があぁぁぁぁぁ〜!"
  }
  else {
    print "時間だ!答えを訊こう!"
  }
}
0859デフォルトの名無しさん
垢版 |
2017/09/16(土) 00:02:08.63ID:lO9EtkAG
自作の読込みパーサextensionでgz形式のファイルを食えるようにしてみたけど
パーサは一度にひとつしかロードできない設計らしく(ソースでそうなってた)
同じ読込みパーサ形式のxmlライブラリとは併用できなかった
ちょっと使いにくいなあ・・・
0860デフォルトの名無しさん
垢版 |
2017/10/09(月) 16:41:58.59ID:7/rU/a8H
4.2.0Betaあげ
0861デフォルトの名無しさん
垢版 |
2017/10/16(月) 14:34:21.07ID:tJ1aGDYb
ファイルの終端関係の謎のエラーに直面
「何で行末が欠ける?分からん、全然分からんぞ!」
と悶えていたら、
いつの間にかvimの設定が変になっていて、
書いたファイルがデフォで行末に\rが来る
ようになっていた。
brew でインストールvimインストールしたとき
妙な設定になったのか?

いやねawkのスクリプトで、
空フィールドが\rになったりとか
macOSなのに変だなあと思っていたのだが…
システム外vim使うときは要注意か。
0864デフォルトの名無しさん
垢版 |
2017/10/22(日) 23:26:23.47ID:/qEHJ0vm
>>756
普段話題なく3年も続こうがべつにすごくないね
0865デフォルトの名無しさん
垢版 |
2017/12/09(土) 10:00:30.84ID:/kecouyU
BEGIN{for(i=1;i<=10000000;i++){printf "%08d", i > "test" } close("test)} の実行にかかる時間を
4.1.4と4.2.0で比較すると、4.2.0のほうが倍近く速くなってるね
fwriteのロックがどうたらの影響なんだろうけど
0866デフォルトの名無しさん
垢版 |
2017/12/12(火) 21:01:15.07ID:zxiueT/o
懐かしいなぁ。
AWKは自由に現実的な限度はあるけど、書いてて楽しい言語だった。
0867デフォルトの名無しさん
垢版 |
2018/01/08(月) 11:00:30.57ID:szpKYJOz
お疲れ様でした
0868デフォルトの名無しさん
垢版 |
2018/01/12(金) 00:18:25.22ID:8Bbkgawk
IDがgawkなので来ました
0870デフォルトの名無しさん
垢版 |
2018/01/17(水) 17:52:56.47ID:MoHAEd1l
置換函数の第二仮引数に[バックスペース][置換対象の文字列]みたいにしたい時は
gsub(/foo/, "\\\\&", $n)
ってしないといけないんだね。
gsub(/foo/, "\\bar", $n)
が foo -> \bar だったんで foo -> \foo は
gsub(/foo/, "\\&", $n)
でいいと思って半時程嵌った。
0872デフォルトの名無しさん
垢版 |
2018/03/09(金) 13:30:21.59ID:Yd19z7Tx
ある行に 20 と 34 とはいってる
この行ごと除外したいけど・・・
 
0874デフォルトの名無しさん
垢版 |
2018/03/09(金) 21:38:00.87ID:3i0y1Him
こうかな
gawk "$0!~/20|34/{print}"
0875デフォルトの名無しさん
垢版 |
2018/03/09(金) 23:45:36.30ID:Ejthnyow
AWK プログラムの基本構造となっている「パターンとアクションの対」のうち、
アクションが省略されている場合は入力行がそのまま出力される。
またパターンが単一の正規表現である場合は、その正規表現と $0 との照合が行われる。

gawk '!/20と34/'
gawk '!/20|34/'
0876デフォルトの名無しさん
垢版 |
2018/03/10(土) 21:39:17.88ID:NqpdHf3N
こぴぺしてやってみたけど 両方消えちゃうんだよね

20 と 34があった場合 出力しない
片方でもあれば 出力する

awk '!/01 / && !/03 /'  これも両方消えてる・・
0878デフォルトの名無しさん
垢版 |
2018/03/11(日) 10:58:35.24ID:tN+YLJlR
ありがとう 
()はきがつかなかった・・
0879デフォルトの名無しさん
垢版 |
2018/05/23(水) 20:10:48.40ID:Au5e7VGg
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

0VDE5
0880デフォルトの名無しさん
垢版 |
2018/06/08(金) 22:00:41.48ID:W8HYHVfd
split関数より$0へ代入したほうが速いage
0881デフォルトの名無しさん
垢版 |
2018/07/04(水) 22:29:02.55ID:gFgZc5FG
02P
0884デフォルトの名無しさん
垢版 |
2018/12/02(日) 13:44:27.64ID:jISJOvCb
AWKって重いと勝手に思ってたけど下手にシェルで制御構文作るより早いね
尤もWSLでやってるのでforkの時間とかそういう問題かもしれないが。
0885デフォルトの名無しさん
垢版 |
2018/12/02(日) 14:22:41.55ID:Bx+z5yQP
>>884
重いと言ってもC比だからな。
今時の超大富豪言語PythonやRubyとなら同程度でもおかしくはない。

Cygwinのshが重かったのはご存じの通りforkが原因だ。
気になるならVirtualBox等でlinux環境を構築してその上でテストしてみればいい。
0886デフォルトの名無しさん
垢版 |
2018/12/22(土) 02:10:55.36ID:V7w17XLB
gawk4にて配列の配列に存在する全要素数を
カウントする関数を作ったんですが、
もっと早いコードにならないでしょうか?
どなたかヒントをください。お願いします。

function count_array(arr, n, i) {
for (i in arr) {
if (isarray(arr[i])) count_array(arr[i], n);
else n[0]++;
}
return n[0];
}
0888デフォルトの名無しさん
垢版 |
2018/12/22(土) 20:12:58.98ID:VPYzPSxJ
886です。
ダメなんです。
BEGIN {
a[1] = 1;
a[2][1] = 21;
a[2][2] = 22;
a[3] = 3;
a[4][1][1] = 411;
a[4][2] = 42;
a[4][3][2][1] = 256;
for (i = 0; i < 9; i++) b[i] = i;
c["foo"]["corge"] = "grault";
c["foo"]["bar"] = "garply";
c["baz"]["corge"] = "waldo";
c["baz"]["quux"] = "fred";
print "length(a) = " length(a);
print "length(a) = " length(b);
print "length(a) = " length(c);
print "count_array(a) = " count_array(a);
print "count_array(b) = " count_array(b);
print "count_array(c) = " count_array(c);
}
length(a) = 4
length(b) = 9
length(c) = 2
count_array(a) = 7
count_array(b) = 9
count_array(c) = 4
再帰を使う以外に方法があれば、
と思い質問した次第です。
0889デフォルトの名無しさん
垢版 |
2018/12/22(土) 21:58:49.47ID:b6CiPLFa
要素を追加するときに
ノード毎に集計値が必要ならそれぞれのノード毎の集計値を保存しとけばいい
そうすれば集計しなおす必要ない

超速いハズ
集計しないからな
0890デフォルトの名無しさん
垢版 |
2018/12/22(土) 22:19:10.29ID:b6CiPLFa
こういった集計値がほしいのは分かる

aho(9)
┣aho1(5)
┃┣aho11(3)
┃┃┣aho111(1)
┃┃┗aho112(1)
┃┗aho12(1)
┗aho2(3)
  ┣aho21(1)
  ┗aho22(1)

lengthでは、きっとこんな感じでしかとれない

aho(2)
┣aho1(2)
┃┣aho11(2)
┃┃┣aho111(n/a)
┃┃┗aho112(n/a)
┃┗aho12(n/a)
┗aho2(2)
  ┣aho21(n/a)
  ┗aho22(n/a)
0891デフォルトの名無しさん
垢版 |
2018/12/22(土) 23:48:44.15ID:omdhpVTe
>>888
lengthは、配列aの要素に配列があると要素としての配列の
中の要素数まではカウントしない、やりたいのは要素としての配列に
含まれる要素もカウントしたい、ということか。

function count_array2(arr, cnt, i) {
n=0;
for (i in arr) {
if(isarray(arr[i])){
cnt+=length(arr[i]);
}
else n++;
}
return n;
}
だと

a[1] = 1;
a[2][1] = 21;
a[2][2] = 22;
a[3] = 3;
a[4][1][1] = 411;
a[4][2] = 42;
a[4][3][2][1] = 256;
a[4][3][3][2] = 257;

みたいなのでうまくいかない(1番目と2番目の添え字(?)が同じ)。
arr[i][j]...と続ければ(最初にlength(arr)で続ける深さを決めて)
いけるように思うが、だったら再帰するのが素直か。
0892デフォルトの名無しさん
垢版 |
2018/12/23(日) 00:54:43.50ID:quoNoaXg
886です。889さんこんな感じでしょうか?
BEGIN {
addnode(a, "1-1", "start");
addnode(a, "1-2", "done");
addnode(a, "1-3", "result");
addnode(a, "1-4", "print");
addnode(a, "2", "count");
addnode(a, "3-1-1", "return");
for (i in a[1]) print "a[1][" i "] = " a[1][i];
print "a[2] = " a[2];
print "a[3][1][1] = " a[3][1][1];
print "\n_ele_sum = " _ele_sum;
}
function addnode(arr, i, val, p) {
ct = split(i, list, "-");
switch (ct) {
case 1: arr[list[1]] = val; break;
case 2: arr[list[1]][list[2]] = val; break;
case 3: arr[list[1]][list[2]][list[3]] = val; break;
default:
}
_ele_sum++;
}
a[1][1] = start
a[1][2] = done
a[1][3] = result
a[1][4] = print
a[2] = count
a[3][1][1] = return
_ele_sum = 6
0893デフォルトの名無しさん
垢版 |
2018/12/23(日) 01:05:13.25ID:quoNoaXg
886です。
pとか関係ないパラメータ入れてしまってごめんなさい。
addnode(a, "1-5-1", "connot");
これができません。
a["5"]がスカラーだと言っています。
0894デフォルトの名無しさん
垢版 |
2018/12/23(日) 01:15:19.57ID:quoNoaXg
訂正a["1"]["5"]がスカラーの文脈だと言っています。でした
0895デフォルトの名無しさん
垢版 |
2018/12/23(日) 01:41:32.84ID:quoNoaXg
886です
for (i in a[1]) print "a[1][" i "] = " a[1][i];
でa[1][5][1]が引っかかっていたようです。
自爆でした。すみません。
0896デフォルトの名無しさん
垢版 |
2018/12/23(日) 02:59:04.54ID:quoNoaXg
886です。
親ノード毎?に保存する方法がまだわかりませんが、
明日以降考えます。
みなさん、ご協力ありがとうございました。
0897デフォルトの名無しさん
垢版 |
2018/12/23(日) 08:49:07.73ID:S8HMq/6c
gawk4でとにかく速いのが良いならcで拡張関数作るのが良いかと(反則?)

flatten_array_typed関数(4.1.4はflatten_array関数)でawk_flat_array_t構造体のメンバ変数countに要素数が入りますので
要素がAWK_ARRAYなら再帰するように処理すれば出来上がり

APIの使い方は
extension\rwarray.cとか
https://www.gnu.org/software/gawk/manual/html_node/Flattening-Arrays.html#Flattening-Arraysを参考に

gawkだけでやる場合、もし配列の要素数が10万とか100万あるのなら、関数の引数を出来るだけ減らして
関数内からグローバル変数を直接参照したほうが速くなると思います
0898デフォルトの名無しさん
垢版 |
2018/12/23(日) 11:20:10.63ID:qffc/3mK
もともと添え字がすべて文字列で保存する仕様というのはしってはいたが
多次元配列はaho[i,j]という形式にして工夫して使えということらしいな

awkで多次元配列なんか使ったことないから知らんかったわ

とういワケでにその形式で多次元配列をlengthでとると>>886で取得したい値になる
当然といえば当然
特定の次元の列だけのとりかたはよくわからん とれんのかコレ

 http://www.kt.rim.or.jp/~kbk/gawk-30/gawk_12.html#SEC119
 Using Numbers to Subscript Arrays

  配列について重要なのは、配列の添え字は常に 文字列として扱われるということである。
  配列の添え字に数字を使った場合、それは添え字付けに使われる前に 文字列に変換される

 http://www.kt.rim.or.jp/~kbk/gawk-30/gawk_12.html#SEC121
 Multi-dimensional Arrays

  多次元配列とは、配列要素の指定を複数の添字の並びによって行う配列である。例え ば二次元の配列は二つの添字を必要とする。
  一般的な(awkも含めた大多数の 言語では) 二次元配列の要素に対する参照は grid[x,y]このよ うに行う。 (gridは配列の名前)

  セパレータには組み込み変数SUBSEPに格納 されている値が使われる。
0900デフォルトの名無しさん
垢版 |
2018/12/23(日) 22:29:12.74ID:qffc/3mK
まず入力から多次元配列を読込む処理でも作ってみるか
できるのかがよく分からん

コレがすんなりできないとコレ自体が使えるシロモノにならなそうだしな

テストデータは作ってみた
https://ideone.com/Sir0IE

awkのこの多次元配列についてほかのとこで書いてあるの読んでみると
色々と面倒なことがおきるはのは分かった

特に問題がおきそうなのは一度配列やスカラーで要素を追加すると、
その配列やスカラーを変えて上書きする場合明示的にそれを削除しないと上書きして使えない

きっとなノードを削除するときはその要素゙から辿って一番深いとこから再帰的に削除しないと残骸が残る
cのメモリリークと同じことが起きると推定される

いまいちこの多次元配列に使い道があるのかどうかが分からない
0902デフォルトの名無しさん
垢版 |
2018/12/24(月) 01:01:19.83ID:ivcUrO89
https://ideone.com/PFBwQU

どうにかして動的に配列を構成できないか調べてみたが
やりかたが分からん

>>892の質問してるのが書いた方法で
一旦多次元配列を読む込むようにはしてみた

質問してるのが欲しいといってる要素の数は
結局入力の行数と同じになる
0903デフォルトの名無しさん
垢版 |
2018/12/24(月) 01:07:37.50ID:ivcUrO89
https://ideone.com/zTUFL2

switch分のcaseが1つ少なかったから追加しといた
0904デフォルトの名無しさん
垢版 |
2018/12/24(月) 09:11:50.63ID:PbNokzxn
>>900
> きっとなノードを削除するときはその要素゙から辿って一番深いとこから再帰的に削除しないと残骸が残る
delete a は a[1][2] や a[3][4][5] などの子配列含む配列a全体の使用メモリをまとめて "再利用" にまわす
一部の要素を残しておきたい事情が無ければ、delete a[1][2]; delete a[3][4][5]; ... のように子配列を個別に
deleteする必要は無い

たとえば下の(2)は多次元配列bが多次元配列aの使用済みメモリを再利用するので
終了間際のメモリ使用量は(1)(2)どちらも同じになるが、(2)の delete a を消すと倍程度に増える
(1) BEGIN{for(i=1; i<=1000000; i++){a[i%10][i]=i}}
(2) BEGIN{for(i=1; i<=1000000; i++){a[i%10][i]=i} delete a; for(i=1; i<=1000000; i++){b[i%10][i]=i}}

メモリ再利用の仕組みはThe GAWK Manualには書いていないけどAharon Robbinsが↓で回答している
https://groups.google.com/forum/#!topic/comp.lang.awk/CKwoes0_63U
0905デフォルトの名無しさん
垢版 |
2018/12/24(月) 15:58:51.02ID:ivcUrO89
なるほど
ありがとう

きっと再利用されるから
気にせず放置でいいのか
0906デフォルトの名無しさん
垢版 |
2018/12/24(月) 17:27:46.25ID:8PLVwc4u
>>902 886です。ありがとうございます。動的とはこんな感じでしょうか?
一度作って、削除するという変な仕様ですが。
BEGIN {
a[1] = "foo";
a[2][1] = "bar";
a[2][2] = "baz";
a[3] = "qux";
a[4][1][1] = "quux";
a[4][2] = "corge";

for (i = 1; i < 5; i++) {
meta_ar_init(b, i);
clone(b[i], a);
}
}
function meta_ar_init(ar, init_num) {
ar[init_num][1] = "";
delete ar[init_num][1];
}
function clone(lhs, rhs, i) {
for (i in rhs) {
if (isarray(rhs[i])) {
lhs[i][1] = "";
delete lhs[i][1];
clone(lhs[i], rhs[i]);
} else
lhs[i] = rhs[i];
}
}
0907デフォルトの名無しさん
垢版 |
2018/12/27(木) 20:01:48.39ID:pQqvXPza
よく分からんが
例えばそれで>>902の入力データなんかを読み込めたりするのか

>>903のswitchだと事前に何次元かわかってないと読み込めない

何次元になるか不明な入力データの場合
どうやれば格納できるかよくわからんんかった
0908デフォルトの名無しさん
垢版 |
2018/12/27(木) 22:46:53.38ID:X7jxTwwp
>>906の「一度作って、削除する」というのは
https://www.gnu.org/software/gawk/manual/gawk.html#Arrays-of-Arrays
ここの一番下のsplitがエラー吐く例の回避策で、配列の要素を最初から配列扱いすることはできないから
予め次階層にダミー要素をぶら下げておき、本命を格納し終えたらダミーは消すって意味かな

自分で書いたらこんなんなったけど、いちおう何次元でも格納できそう
https://ideone.com/83ykKF#stdin
0910デフォルトの名無しさん
垢版 |
2019/02/05(火) 18:58:36.44ID:9Z2hbdGL
60くらいの教授が40年くらい前にAWKでアセンブラ作ったとか言ってたんだけど
当時に既にあったということと当時から小規模なコンパイラなら作れるくらい高性能だったことに驚いた
0912デフォルトの名無しさん
垢版 |
2019/02/06(水) 10:31:17.59ID:+qagyc5o
aho
0913デフォルトの名無しさん
垢版 |
2019/02/06(水) 13:09:33.86ID:j4QdsmCl
asort、asortiがよくわからなかったので試した結果
# a
a[5] ="a5"
a[1] ="a1"
a[3] ="a8"
# asort(a,as)
as[1] ="a1"
as[2] ="a5"
as[3] ="a8"
# asorti(a,asi)
asi[1]=1
asi[2]=3
asi[3]=5

なんだそういうことだったのかとわかった
0914デフォルトの名無しさん
垢版 |
2019/02/06(水) 17:39:23.37ID:+3VpeZVh
>>910
思わず "assembler by awk" でググって The Amazing Awk Assembler by Henry Spencer を
ダウンロードしちゃったじゃないか。
0915デフォルトの名無しさん
垢版 |
2019/02/23(土) 17:41:13.06ID:Y0E0nwid
awkでファイルがあるかどうかの判別は、どのようにしたらよいのでしょうか?

具体的にはBEGINの中で

getline a < "/dev/stdin";
fn = a".txt"

と任意のファイル名を作った後、そのファイルがあるかどうかを確認したいんです。

もしファイルがすでにあったら処理は終了、無ければ以後の処理をそのファイルにリダイレクトする、という感じです。
0918デフォルトの名無しさん
垢版 |
2019/03/21(木) 08:10:09.34ID:pGDO/F2C
答えが出ないなんで?

#!/usr/bin/awk -f

BEGIN{
print game(10, 24);
}


function game(coin,depth, i,j){
if(memo[coin,depth]){
return memo[coin,depth];
}
if(coin == 0){
return 0;
}
if(depth == 0){
return 1;
}
win = game(coin + 1, depth - 1);
lose = game(coin - 1, depth - 1);
memo[coin,depth] = win + lose;
}
0919デフォルトの名無しさん
垢版 |
2019/03/21(木) 09:51:18.96ID:WMaCNtBE
最後の memo[coin,depth] = win + lose はそのまま関数の戻り値として
return しなければならないが、それを忘れている。

さらに、正しい答えが返らない原因が 2 点。
関数定義の引数名間違い: i,j → win,lose。
if(depth == 0) と if(coin == 0) の判定を行う順序が逆。
0920デフォルトの名無しさん
垢版 |
2019/03/21(木) 14:19:16.55ID:pGDO/F2C
>>919
ありがとうございます。
そっか。returnがいるんですね。
perlだと最後はreturn省略可能だけどawkは省略不可みたい。
あと、引数名も間違っていました。
正しい答え出ました!
0923デフォルトの名無しさん
垢版 |
2019/04/01(月) 17:01:28.78ID:nwflCE8J
>>921
awkの方がいいときもある

installしなくていい
タスクマネージャでみているとrubyよりメモリを食わない時もある
融通の利く配列が超便利

通信、Hash、sortなど使いまくる時はrubyのほうがいいけど
0924デフォルトの名無しさん
垢版 |
2019/04/01(月) 17:12:08.21ID:Tc5+6fel
いや、Perlだ。

理由
俺が慣れてるから。
0926デフォルトの名無しさん
垢版 |
2019/04/02(火) 04:44:16.86ID:3dIjgbOm
漏れは、Windows 10・WSL・Ubuntu 16.04 だけど、
sudo apt install ruby だけで、Ruby 2.3 が入った

2.4 以降の新しい書き方さえしなければ、動く

Perl, Python は、最初から入っているけど
0929デフォルトの名無しさん
垢版 |
2019/04/02(火) 12:24:56.71ID:exqjvsIl
Perl die好き
0931デフォルトの名無しさん
垢版 |
2019/04/17(水) 15:16:55.69ID:bLXqfCqA
GNU AWK 5.0がリリース。8年ぶりのメジャーバージョンアップ。正規表現ライブラリが
GLIBCからGNULIBへ移行、名前空間が実装 2019年4月17日
https://www.publickey1.jp/blog/19/gnu_awk_508glibcgnulib.html

UnixやLinuxにおいてsedやgrepなどと並んでよく知られているツールの1つがawk(オーク)
です。このawkのGNUプロジェクトによる実装の最新版「GNU AWK 5.0」(gawk 5.0)の
リリースが発表されました。

2011年にリリースされたGNU AWK 4.0から8年ぶり、直前のバージョンでとして2017年10月に
リリースされた4.2.0からは約1年半ぶりとなります。

AWKはいわゆるスクリプティング言語の一種。変数や関数、制御文など基本的な構文を備え、
テキストファイルを効率的に処理できるのが特徴です。

GNU AWK 5.0の新機能としては、printfの%aおよび%Aの書式がPOSIX標準に準拠したこと、
正規表現のルーチンが、長年にわたってメンテナンスされてきたGLIBCからGNULIBに
置き換わったことなど。

また、識別子に非英語文字を使うためのドキュメント化されていなかったオプションなどは
削除され、ソースコードはC99環境が想定されるようになっています。

そして新たに名前空間が実装されています(詳細はマニュアルを参照とのこと)。
0932デフォルトの名無しさん
垢版 |
2019/04/17(水) 17:19:50.38ID:fsOEjVgH
sedとawkで簡単にできることを
他の方法でやってるアホを見ると優越感に浸れるよな
0934デフォルトの名無しさん
垢版 |
2019/04/17(水) 23:57:17.65ID:t5VcExa0
今時っぽく定期的にメジャーバージョンアップしていく作戦?
そろそろAWKCARD印刷してみようかな…
0935デフォルトの名無しさん
垢版 |
2019/04/18(木) 00:37:48.90ID:y8/6ebia
>>932
簡単な変換なのにWindowsとかでいきなりExcelでやろうとしちゃう人を見るとそこまでせんでも良いじゃないかとは思ってしまうな。
まあ日頃Windowsで事務処理的な事している人からすればそれ以上最良で分かりやすい環境はないんだろうけどな。
なんでもかんでもそれでやろうとして余計に分かりづらく複雑になってうまく行かずにハマっているのを見ると哀れに感じる。
0936デフォルトの名無しさん
垢版 |
2019/06/01(土) 01:13:44.70ID:QInzSHhj
こういう記法ができることを知らず、気づくのに数年かかった
正規表現比較のifで変数を使える、gsubなどで変数を使える

txt=”aabbcdefg1234”
x=”^” substr{$0,1,1} ”+”
if {txt 〜 x}print ”ok”

y=substr{$0,1,1}
z=substr{$0,2,1}
gsub{y,z,$0}

(半角だと書き込みエラーになるので全角に変換)
0939デフォルトの名無しさん
垢版 |
2019/06/05(水) 00:27:37.11ID:/Z5C9xDG
The AWK Programming Language (の邦訳本) から入ったので知ってはいるけど、
エスケープ文字を考慮してコードを書くのが面倒なので極力避けてるな。
文字列が正規表現へ「型変換」されるときの振舞いについて、本には一応書いてある。
0941デフォルトの名無しさん
垢版 |
2019/06/30(日) 05:07:43.82ID:1ALBmyOB
AWKが巨大なテキストファイルを処理できないみたいな話を知ってる方いらしゃいますか。
大体1.4GiBくらいのファイルをAWKで編集しようとすると「ファイルの空きがない」みたいなエラーが出るので。
0942デフォルトの名無しさん
垢版 |
2019/06/30(日) 12:11:04.21ID:QU2Ls1X6
UNIXというかまともなPIPE実装されてるOSならそんなことはないが
WINDOWSとかいうアホなOSだと出るだろうね
0944デフォルトの名無しさん
垢版 |
2019/06/30(日) 15:28:11.21ID:o/HVRPYj
>>942
コマンドラインでリダイレクト使ってればそうかも知れんが
スクリプト内で出力先を指定してたらわからんぞー
0946デフォルトの名無しさん
垢版 |
2019/06/30(日) 21:56:09.12ID:HbSturrb
>>941
改行コードの違いにより全体が長い一行と認識されてしまい・・・なんて事はないか?

あ、でも、ファイルの空きがないってのは出力先の空き容量が足りないってことかな?
0948デフォルトの名無しさん
垢版 |
2019/07/01(月) 02:30:15.69ID:jjSXuURg
なんだろうね。作業用ファイルが作られるパーティションの空きが足りないとかかな?
0949デフォルトの名無しさん
垢版 |
2019/07/01(月) 02:35:44.08ID:KfVaWYci
64bit版か32bit版かで違わないか
1.4GBは入力で出力も同じなのかはるかに小さいのか
出力が速すぎることはないのか、ゆっくり出力するようにしたらどうか
0950947
垢版 |
2019/07/01(月) 07:19:02.17ID:2smzn43h
>>948
すいません。これが原因でした。
AWKは全く悪くありませんでした。ご迷惑&&スレ汚し、大変失礼しました……。
0951デフォルトの名無しさん
垢版 |
2019/07/01(月) 07:38:04.28ID:O1pDJEnN
Ruby でも、File.read なら、ファイルの内容を、メモリ内にすべて読み込んでしまうから、
500MB 以上なら、読み込めずにエラーになるだろう

File.foreach なら、メモリ内に、1行ずつ読み込んでは捨てるから、大きいファイルでも大丈夫

まあ、RubyVM 起動時に、そのアプリが使うメモリのサイズを、指定できると思うけど。
JavaVM には、そういうオプションがある
0952デフォルトの名無しさん
垢版 |
2019/07/02(火) 21:28:41.07ID:Stz7guhB
awkで dateを使ったのですが、秒数が更新されず悩んでます。仕様とかそういう情報ご存知のかた教えて
頂けないでしょうか
■ コード
BEGIN {
for( intCounter = 0; intCounter < 3; intCounter++ )
{
"date +\"%Y/%m/%d %I:%M:%S\" " | getline datTmp
print "Start:" datTmp
system("sleep 2")
}
}
END {
for( intCounter = 0; intCounter < 3; intCounter++ )
{
"date +%I:%M:%S" | getline datTmp1
print "End:" datTmp1
system("sleep 2")
}
}
■ 結果
Start:2019/07/02 09:18:36
Start:2019/07/02 09:18:36
Start:2019/07/02 09:18:36
End:09:18:42
End:09:18:42
End:09:18:42
■ 疑問
Start, End 共に最初の 1 回目のみ秒数が取れているようで、2回目からは2秒後のはずなのに、秒数が変わっていない orz..
0953952
垢版 |
2019/07/02(火) 21:47:38.82ID:Stz7guhB
お騒がせしました。自己解決しました。
https://stackoverflow.com/questions/2391272/gawk-awk-piping-date-to-getline-sometimes-wont-work
closeを使う必要が有ったようです。
■ コード
BEGIN {
for( intCounter = 0; intCounter < 3; intCounter++ )
{
"date +\"%Y/%m/%d %I:%M:%S\" " | getline datTmp
print "Start:" datTmp
system("sleep 2")
close("date +\"%Y/%m/%d %I:%M:%S\" ")
}
}
END {
for( intCounter = 0; intCounter < 3; intCounter++ )
{
"date +%I:%M:%S" | getline datTmp2
print "End:" datTmp2
system("sleep 2")
close("date +%I:%M:%S")
}
}
■ 結果
Start:2019/07/02 09:44:49
Start:2019/07/02 09:44:51
Start:2019/07/02 09:44:53
End:09:44:55
End:09:44:57
End:09:44:59
0956デフォルトの名無しさん
垢版 |
2019/07/05(金) 19:29:13.12ID:p9vBdDGq
           fi
          、Jj
           Й 
         /⌒ヽ
         l_ 0..0
          }{ l冊
        -=-v=-
        }{ 彡ミノ{
        }{ 非 }{
        匁OTO)匁
         }{ }{
         }{ }{
         及 及
0957デフォルトの名無しさん
垢版 |
2019/08/05(月) 11:42:29.38ID:N86fIT/u
Windows10 のコマンドプロンプトで awk を使いたいです。
vector で検索するといろいろでてくるのですが、
これがお勧めっていうのありますでしょうか。
日本語も扱えるのがいいです。
よろしくお願いします。
0958デフォルトの名無しさん
垢版 |
2019/08/05(月) 11:44:36.72ID:MNXFY7cg
Windows 10なら、標準機能のWSL(+Ubuntu)をインストールするのが一般的
vectorとかもうあんなのいらない
0959デフォルトの名無しさん
垢版 |
2019/08/05(月) 12:04:58.85ID:N86fIT/u
WSLって使ったことなかったんですけど、
ググってみたらもう Win で Linux が標準で使えるんですね。
これなら cygwin とかも、もういらないのかな。
情報どうもです。
0961デフォルトの名無しさん
垢版 |
2019/08/05(月) 12:06:57.54ID:NOA3rn3w
WSL って pro だけ?
home だったら付いてない?
msys とか入れれば解決するけど
0962デフォルトの名無しさん
垢版 |
2019/08/05(月) 12:18:30.48ID:N86fIT/u
マイクロソフトもビルゲイツがいなくなって
多少は良い事もするようになったかな。
0963デフォルトの名無しさん
垢版 |
2019/08/05(月) 12:33:33.70ID:LhsszH09
>>962
いや、まだ足りない。何でもかんでもWindowsの上で動くようにしているだけだしね。すると何を動かすにしてもWindowsのライセンス料が掛かる。
まあ仕方のないことではあるがな。
0965デフォルトの名無しさん
垢版 |
2019/08/05(月) 12:59:49.23ID:MNXFY7cg
>>963
> 何でもかんでもWindowsの上で動くようにしているだけだしね。すると何を動かすにしてもWindowsのライセンス料が掛かる。

それがLinuxでも動くようになり、Windowsのライセンス料もかからなくなってきてるから
最近のMSの評判が抜群に上がってるんだろ
0966デフォルトの名無しさん
垢版 |
2019/08/05(月) 15:30:49.20ID:VYzH3PNA
>>962
windows育ちでないunix系を知っている今のCEOに変わってから変化し始めた
ダメな旧MS文化からunix系やandroid系に転換をはかっている
ダメだったのは前CEOバルマー
0967デフォルトの名無しさん
垢版 |
2019/08/05(月) 17:45:26.88ID:QFC6lZK5
いっそのこと UNIX のカーネルに Windows のシェルを
被せてもらいたいですね。
Mac はもうそうなってるし。
0968デフォルトの名無しさん
垢版 |
2019/08/05(月) 17:59:46.21ID:MNXFY7cg
そのわりに、MacってUNIXを全然活かせてないよな?
forkは遅いし、仮想マシン使ったほうがMacよりも速いし。
0969デフォルトの名無しさん
垢版 |
2019/08/05(月) 18:09:58.23ID:MNXFY7cg
まあ、AppleはUNIXを真似ることしかできなかったわけで
UNIXと双璧をなす独自OSを作り上げたMSと同じことをしろというのも酷な話だが、
UNIX/Linuxを取り込むなら、WSLと同じ仕組みで十分な気がする。

あとAppleが運が悪かったのは、Linuxがここまで普及すると予測できなかったことかな
BSD系を採用しちゃったので、Linuxとコマンド体系が微妙に変わってしまった。
標準でUnixコマンドが搭載されてるにも関わらず、サードパーティのHomebrewを使って
Linux互換(GNU版)のコマンドに置き換える人も多いし。
0970デフォルトの名無しさん
垢版 |
2019/08/05(月) 20:09:15.04ID:oBMYP5f0
> UNIXと双璧をなす独自OSを作り上げたMS
ゴミをでっち上げ、OSとかよく解らない池沼層に売っただけ。
0971デフォルトの名無しさん
垢版 |
2019/08/05(月) 20:51:07.86ID:LhsszH09
MSはOSというよりはUIを作った感じだな。
0974デフォルトの名無しさん
垢版 |
2019/08/05(月) 22:10:04.48ID:o5dspg/Y
macOSの前身のNEXTSTEPは技術的には絶賛されてた
macOSは中身ほぼNEXTSTEPで見た目をモダンにしただけだ
0975デフォルトの名無しさん
垢版 |
2019/08/06(火) 14:52:58.06ID:SvihPrAV
マルチユーザーマルチスレッドωωω
0976デフォルトの名無しさん
垢版 |
2019/08/06(火) 17:42:44.33ID:9obbnMlM
> macOSの前身のNEXTSTEPは技術的には絶賛されてた

でもUNIXの割にforkが遅いんだよな
cygwin使ってるのか?って思っちゃうぐらい。
0977デフォルトの名無しさん
垢版 |
2019/08/06(火) 20:48:47.73ID:ePqW8mte
スレッドも遅いの?
0978デフォルトの名無しさん
垢版 |
2019/08/07(水) 00:04:17.07ID:NEAc+E18
>>976
forkが速くて称賛されてた訳じゃないからな…
ちなみにforkの速度は今時そんなに重要じゃないぞ
もしそれで困ってるならスレッドを使うとか事前にプロセスを起動して置くなりすればいい
0981デフォルトの名無しさん
垢版 |
2019/08/07(水) 04:38:27.64ID:/UJIAec/
>>969
そんなこと気にする人ってどれくらい居るんだろう
CPUですら68、PowerPC、x86と変えてきて
OSは独自、BSDと来たもんだ
多くの人は中身を気にせず使ってるのに

自分は元マカーだけど今は1台も持ってない
でもファッションでMacBookいいカナと思うよ
仕事はITのエンジニアで商用UNIX使ってるけど
コマンドなんてどうでもいいわ
好きなところにログインすれば言いだけなんだから
0982デフォルトの名無しさん
垢版 |
2019/08/08(木) 01:24:30.39ID:X/CTiqlR
| awk -F: '! /BINARY/ {print $1}'\

正規表現無しの簡潔な部分はperl -lane より短くて最高
0984デフォルトの名無しさん
垢版 |
2020/08/02(日) 17:25:58.24ID:IlYSPDQE
ファッションでというと、写真撮影しているオシャレな感じのスタジオの受け付けにマックがあったのだが画面を見るとWindowsだったというのを見たことがあるな。
エミュでWindows動かしてそこで業務用のソフト動かして受け付け業務に使っているということだが、客から見るとディスプレイの裏側が主に見えるのでAppleマークが見えると。
0986デフォルトの名無しさん
垢版 |
2020/08/03(月) 02:35:57.38ID:iGTWfWuc
>>985
>>981
0987デフォルトの名無しさん
垢版 |
2020/08/03(月) 09:51:55.82ID:3aFKjSal
Aho
0989デフォルトの名無しさん
垢版 |
2020/08/03(月) 20:08:52.49ID:iGTWfWuc
awk の a は本当に Aho の略(人名)
0991デフォルトの名無しさん
垢版 |
2020/08/10(月) 14:01:04.64ID:l5zwQhnu
即レスも大概だが亀レスも大概やな!
0994デフォルトの名無しさん
垢版 |
2020/08/13(木) 16:09:43.86ID:GqR68DDy
は?
0995デフォルトの名無しさん
垢版 |
2020/08/14(金) 13:41:25.37ID:H4TUvcZb
【審議中】
    ∧,,∧  ∧,,∧
 ∧ (´・ω・) (・ω・`) ∧∧
( ´・ω) U) ( つと ノ(ω・` )
| U (  ´・) (・`  ) と ノ
 u-u (l    ) (   ノu-u
     `u-u'. `u-u'
0997デフォルトの名無しさん
垢版 |
2020/09/14(月) 11:09:07.94ID:c+iGp9gS
bashで小数点の比較をする方法にbcを使うという意見が多かった
けどawkの方がわかりやすいと思う
condition()
{
awk 'BEGIN { exit ! ('"$*"') }'
}

x=5.6; y=42.1
if condition "$x < $y"; then
echo true
else
echo false
fi
0998デフォルトの名無しさん
垢版 |
2020/09/14(月) 11:15:45.20ID:S/jhW9z+
bcはインストールされてないことが時々あるんで使わないね
まあその点はawkの方がマシだろう
0999デフォルトの名無しさん
垢版 |
2020/09/14(月) 12:03:30.66ID:gMM3Z1ji
1000デフォルトの名無しさん
垢版 |
2020/09/14(月) 12:08:39.52ID:H3Bos02D
Aho Weinberger Kernighan
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 4951日 12時間 12分 57秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

ニューススポーツなんでも実況