腐っても鯛? 騏も老いては駑馬に劣る?
三人の碩学が生み出したスクリプト言語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/
探検
awkについて語るスレ $2
■ このスレッドは過去ログ倉庫に格納されています
2007/02/23(金) 23:55:42
504デフォルトの名無しさん
2011/01/29(土) 19:23:53 >>503
自分アカウントのパスは真っ先に /usr/xpg4/bin/を持ってきてたわ。
自分アカウントのパスは真っ先に /usr/xpg4/bin/を持ってきてたわ。
505デフォルトの名無しさん
2011/01/29(土) 19:25:17 スクリプトを組む時はだいたい nawk を使う
他人のスクリプトを丸パクリする機会が無いのでカオスは感じた事が無い
他人のスクリプトを丸パクリする機会が無いのでカオスは感じた事が無い
506デフォルトの名無しさん
2011/01/29(土) 19:32:53507デフォルトの名無しさん
2011/01/29(土) 19:39:08 ウチは RHEL と Solaris だけ考えれば良いから、awk で問題がある時は Perl か Python で済ますわ
508デフォルトの名無しさん
2011/01/30(日) 05:43:19 #!/usr/bin/env [gn]*awk
だろ常考
だろ常考
509デフォルトの名無しさん
2011/02/01(火) 10:39:45 shebang行に /usr/bin/env 書くのってあんま良いと思えないんだよなあ
複数の引数の扱いとか、環境変数をそこまで信用して良いものなのかとか
あと /usr/bin/ に env があることは本当に保証できるのかとか
/bin/sh を書いたほうが良いんじゃないかって思ってしまう
複数の引数の扱いとか、環境変数をそこまで信用して良いものなのかとか
あと /usr/bin/ に env があることは本当に保証できるのかとか
/bin/sh を書いたほうが良いんじゃないかって思ってしまう
510デフォルトの名無しさん
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によっててんでばらばら
>なのであまりお勧めできないということだろうか。
>調べてみたら#!にインタープリタの引数を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によっててんでばらばら
>なのであまりお勧めできないということだろうか。
511デフォルトの名無しさん
2011/02/02(水) 00:12:39 ruby 界隈でも流行ってるな
意味も判らず「おまじない」と称して使ってるうちに
都市伝説化していくんだな
意味も判らず「おまじない」と称して使ってるうちに
都市伝説化していくんだな
512デフォルトの名無しさん
2011/02/03(木) 22:33:59 なぜ gawk には tr が無いのだ
tr("A-Z","A-Z")とかしたいぞ
tr("A-Z","A-Z")とかしたいぞ
513デフォルトの名無しさん
2011/02/04(金) 03:31:02 つ Python
514デフォルトの名無しさん
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))
}
}
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))
}
}
515デフォルトの名無しさん
2011/02/04(金) 09:20:39 それだとtr('ab', 'ba')がうまくいかないんだよなぁ。
516デフォルトの名無しさん
2011/02/04(金) 09:54:40 同じ事じゃん
517デフォルトの名無しさん
2011/02/04(金) 19:22:21 汎用的に1つ作っとけばいいじゃん
518デフォルトの名無しさん
2011/02/05(土) 20:23:34 >514みたいなベタ打ちじゃなくて
A-Zあ-ん
こういう表記で置換する方法ある?
A-Zあ-ん
こういう表記で置換する方法ある?
519デフォルトの名無しさん
2011/02/05(土) 20:37:26 >>518
tr 使えば?
tr 使えば?
520デフォルトの名無しさん
2011/02/06(日) 03:05:39 tr コマンドって環境によってマルチバイトの扱いが違わね?ウチの場合
Ubuntu10.04に入ってるtr(GNU coreutils)7.4はどうやら2文字扱いにしちゃうらしいが
MacOSX10.5に入ってるtr(バージョン判らんがman見るとBSD系ぽい)は1文字扱いにしてくれた
Ubuntu10.04に入ってるtr(GNU coreutils)7.4はどうやら2文字扱いにしちゃうらしいが
MacOSX10.5に入ってるtr(バージョン判らんがman見るとBSD系ぽい)は1文字扱いにしてくれた
521デフォルトの名無しさん
2011/02/06(日) 05:00:06 UNICODE = 文字数
mbcs = バイト数
mbcs = バイト数
522デフォルトの名無しさん
2011/02/07(月) 08:10:44 んーと、どゆこと?
gnome-terminalはユニコード設定のはずなんだが…
他にやらなきゃいけないことがあるってこと?
gnome-terminalはユニコード設定のはずなんだが…
他にやらなきゃいけないことがあるってこと?
523デフォルトの名無しさん
2011/02/09(水) 23:11:37 awk++使ってる人いる?
http://awk.info/?doc/dsl/awkplusplus.html
http://awk.info/?doc/dsl/awkplusplus.html
524デフォルトの名無しさん
2011/02/10(木) 14:20:51 最近、awkの存在を知りました。
いろんな言語を触っては挫折・・・触っては挫折・・・を繰り返していました。
awkは何となくマスター出来そうな気がします。
これから頑張ります!!
256倍の本を今は読んでおります。
いろんな言語を触っては挫折・・・触っては挫折・・・を繰り返していました。
awkは何となくマスター出来そうな気がします。
これから頑張ります!!
256倍の本を今は読んでおります。
525デフォルトの名無しさん
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が入った特殊配列みたいなのがあったらうれしいのだが。
{split($0, a);asort(a);for(i=1;i<NF;i++){printf("%s%s", a[i], FS);}printf("%s\n", a[NF]);}
よりもスマートな方法ある?
$1〜$NFが入った特殊配列みたいなのがあったらうれしいのだが。
526デフォルトの名無しさん
2011/02/16(水) 07:22:58527デフォルトの名無しさん
2011/02/16(水) 12:11:40 >>526
なるほど、そうできるのか。ありがとう。
なるほど、そうできるのか。ありがとう。
528デフォルトの名無しさん
2011/02/17(木) 01:07:36 http://www.kt.rim.or.jp/~kbk/gawk-3.1/ に置いてあった
win32用gawkがいつの間にか公開停止になっていた。
wn32のgensubが使えて日本語が扱えて、
かつexeのみで稼動するのでインストール不要なのが便利で
公私にわたって愛用していたので、非常に悲しい・・・
win32用gawkがいつの間にか公開停止になっていた。
wn32のgensubが使えて日本語が扱えて、
かつexeのみで稼動するのでインストール不要なのが便利で
公私にわたって愛用していたので、非常に悲しい・・・
529デフォルトの名無しさん
2011/02/17(木) 02:14:57530デフォルトの名無しさん
2011/02/18(金) 11:30:36 それは少し古い.
gawk-mbcs-win32-20090920.zip が手元にあるので必要なら再配布するが?
gawk-mbcs-win32-20090920.zip が手元にあるので必要なら再配布するが?
531528
2011/02/19(土) 01:36:10532デフォルトの名無しさん
2011/02/19(土) 08:18:59 俺の手元に、gawk-mbcs-win32-20091124.zip があった。
欲しい人がいて、かつ再配布に問題無いという事がわかればどっかにうpするが。
しかしなんで配布やめちゃったんだろね。
どこからか拝借したコードとかのライセンス問題なのかな?
欲しい人がいて、かつ再配布に問題無いという事がわかればどっかにうpするが。
しかしなんで配布やめちゃったんだろね。
どこからか拝借したコードとかのライセンス問題なのかな?
533デフォルトの名無しさん
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でオブジェクト指向する人も増えるかもね。
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でオブジェクト指向する人も増えるかもね。
534デフォルトの名無しさん
2011/02/19(土) 23:05:51.24 >>533
デフォでインストールされるawkでできる範囲のことしかやらないよ
デフォでインストールされるawkでできる範囲のことしかやらないよ
535デフォルトの名無しさん
2011/02/20(日) 00:59:51.51 同感。>デフォでできる範囲
長めのスクリプトを書いた事があったのでOOあると便利と思うけど
わざわざインストールするならperl、ruby、pythonがあるしなぁ
長めのスクリプトを書いた事があったのでOOあると便利と思うけど
わざわざインストールするならperl、ruby、pythonがあるしなぁ
536デフォルトの名無しさん
2011/02/22(火) 10:31:51.00 awkで書かれたawk++ってないの?
537デフォルトの名無しさん
2011/03/02(水) 23:14:41.35 gawkで平仮名・カタカナの部分を抜き出したいと思ってます。
例えば「awkについて語るスレ」だったら
"について" "るスレ" を変数に入れたいのですが、いい方法ありますでしょうか?
例えば「awkについて語るスレ」だったら
"について" "るスレ" を変数に入れたいのですが、いい方法ありますでしょうか?
538537
2011/03/02(水) 23:17:39.07 「について」と「るスレ」はそれぞれ別の変数に入れたいと思っています
539デフォルトの名無しさん
2011/03/02(水) 23:27:45.29 アルファベット以外の部分だったら、アルファベットをFSに指定してwhileで回せばいいけど、
漢字も抜くのは難しいな。
それに、事実上変数は無限に生成するって事か。
漢字も抜くのは難しいな。
それに、事実上変数は無限に生成するって事か。
540デフォルトの名無しさん
2011/03/02(水) 23:58:57.50 matchの第2引数に/[あ-んア-ン]+/を持ってくるとか?
541デフォルトの名無しさん
2011/03/03(木) 13:28:46.50 $0,$1...$NFを壊してもいいんだったら、私ならこうします。
gsubの検索文字鉄には正規表現を使用することができるから、
ひらがなとカタカナ以外の文字をスペースに置き換える。
gsub(/[^ーぁ-んァ-ン]/," ")
ひらがなとカタカナ以外の文字は半角スペース2つに置き換わる。
あとはNFを見て表示したいように処理する。
注意すべきは、Windows版の新しいバージョンのものでは、
正規表現として、ひらがなを ぁ-ん で、カタカナを ァ-ン で
指定できないものがあります。
たしかマルチバイト拡張で壊された。
gsubの検索文字鉄には正規表現を使用することができるから、
ひらがなとカタカナ以外の文字をスペースに置き換える。
gsub(/[^ーぁ-んァ-ン]/," ")
ひらがなとカタカナ以外の文字は半角スペース2つに置き換わる。
あとはNFを見て表示したいように処理する。
注意すべきは、Windows版の新しいバージョンのものでは、
正規表現として、ひらがなを ぁ-ん で、カタカナを ァ-ン で
指定できないものがあります。
たしかマルチバイト拡張で壊された。
542537
2011/03/03(木) 14:28:35.14 >541
まだ試してませんが、欲する文字以外を消してゴニョゴニョすればいけそうです。
>539-540さんもありがとうございました。
まだ試してませんが、欲する文字以外を消してゴニョゴニョすればいけそうです。
>539-540さんもありがとうございました。
543デフォルトの名無しさん
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] }
}
}
str = "デンコ漢字ばんざい元気abcdeだから"
c = split(str, a, "[^ーァ-ンぁ-ん]")
for (i = c; i>=1; i--) {
if ( a[i] !~ /^$/ ) { print a[i] }
}
}
544デフォルトの名無しさん
2011/03/03(木) 19:44:47.65 ボケかました
4行目は普通に
for ( i = 1; i <=c; i++) {
でOK。
4行目は普通に
for ( i = 1; i <=c; i++) {
でOK。
545デフォルトの名無しさん
2011/03/03(木) 22:55:52.84 cを残さなくとも
for (i in a){if (a[i]) print a[i]}
で間に合うような。
for (i in a){if (a[i]) print a[i]}
で間に合うような。
546デフォルトの名無しさん
2011/03/04(金) 01:04:03.52 for-inだと順序が保障されないんじゃなかったっけ?
547デフォルトの名無しさん
2011/03/04(金) 08:34:52.75 for ( i = 1; i in a ; i++) って書き方もできるよ
548デフォルトの名無しさん
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
のようにまとめあげるにはどうしたらよいでしょうか?
さすがにググってコピペという訳にもいかず。。。
b1 b1 b1 b1
c1
d1 d2 d2
....
のように、フィールド数がバラバラで、フィールドが一致する場合もあれば
一致しないデータがあるのですが、重複を
a1 a2 a3
b1
c1
d1 d2
のようにまとめあげるにはどうしたらよいでしょうか?
さすがにググってコピペという訳にもいかず。。。
549デフォルトの名無しさん
2011/03/07(月) 14:31:25.16550デフォルトの名無しさん
2011/03/07(月) 14:53:42.21 ありがとうございます。
それぞれ、4つ重複データのあったものは3つに、2つのものは1つにと減ったのですが
それ以上減ってません。同じコマンドを繰り返しかけてみたのですが、変化はなかったです。
a1 a1 a1 a1
b1 b1 b1
...の部分が
a1 a1 a1
b1 b1
にはなったという意味です。
もう少しおつきあいいただけないでしょうか。。。
それぞれ、4つ重複データのあったものは3つに、2つのものは1つにと減ったのですが
それ以上減ってません。同じコマンドを繰り返しかけてみたのですが、変化はなかったです。
a1 a1 a1 a1
b1 b1 b1
...の部分が
a1 a1 a1
b1 b1
にはなったという意味です。
もう少しおつきあいいただけないでしょうか。。。
551デフォルトの名無しさん
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
行ごとにフィールドの添字についてループするのと連想配列で出現チェックがキモ。
% 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
552デフォルトの名無しさん
2011/03/07(月) 15:14:33.26 0610005C13Rik 0610005C13Rik 0610005C13Rik
0610007C21Rik 0610007C21Rik 0610007C21Rik 0610007C21Rik 0610007C21Rik
こういう感じの文字列なんですが
a1とかb1で例えても大丈夫だったですか?
0610007C21Rik 0610007C21Rik 0610007C21Rik 0610007C21Rik 0610007C21Rik
こういう感じの文字列なんですが
a1とかb1で例えても大丈夫だったですか?
553デフォルトの名無しさん
2011/03/07(月) 15:38:11.62 空白で区切られた文字列ならなんでもいいが、そのレベルの質問が
出るようじゃもうすこし基礎を勉強しないとだめかもなぁ。
出るようじゃもうすこし基礎を勉強しないとだめかもなぁ。
554デフォルトの名無しさん
2011/03/07(月) 15:50:13.69 シングルクオーテーション使用のサンプルで問題ないと言う事は〜
UNIX環境なのかな〜
UNIX環境なのかな〜
555デフォルトの名無しさん
2011/03/07(月) 15:58:11.87556デフォルトの名無しさん
2011/03/07(月) 16:04:33.75 一行野郎を分解してスクリプトに組み直して弄れば動作確認出来ると思う
557デフォルトの名無しさん
2011/03/07(月) 16:21:10.50558デフォルトの名無しさん
2011/03/07(月) 17:18:15.93 まだやってるのか〜
ファイルの ^M が問題みたいだから
CRLFのファイル形式に変換して上の一行野郎で問題ないみたいだったよ。
ファイルの ^M が問題みたいだから
CRLFのファイル形式に変換して上の一行野郎で問題ないみたいだったよ。
559デフォルトの名無しさん
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="";
}
$11~/OUT/{ prev=$0; }
$11~/IN/{
if(prev!=""){ print prev; print; }
prev="";
}
560デフォルトの名無しさん
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です・・
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です・・
561デフォルトの名無しさん
2011/04/19(火) 16:30:51.01 俺の手元のgawk 3.1.7では期待通りの結果になるなあ。
行末がらみだと改行コードが違ってたり見えない空白が
入ってたりというのがよくあるので確認してみ。
行末がらみだと改行コードが違ってたり見えない空白が
入ってたりというのがよくあるので確認してみ。
562デフォルトの名無しさん
2011/04/19(火) 16:32:43.45563デフォルトの名無しさん
2011/04/19(火) 16:45:20.75564デフォルトの名無しさん
2011/04/19(火) 17:00:39.34565559
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=""; }
とかの入力をイメージしてたもので...
$11~/OUT/{ prev=$0; }
$11~/IN/{
if(prev!=""){ print prev; print; }
}
$11!~/OUT/{ prev=""; }
566デフォルトの名無しさん
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; }
#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; }
567デフォルトの名無しさん
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
}
}
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
}
}
568デフォルトの名無しさん
2011/05/03(火) 14:58:05.53 間違ってるよ
しかも長くて美しくないよ
しかも長くて美しくないよ
569デフォルトの名無しさん
2011/05/03(火) 15:13:19.32 http://okwave.jp/qa/q6711117.html
...こんな感じかねぇ? awk -f sum.awk データ | sort
----- sum.awk -----
$1!~/商店名/{ tbl[$1 "," $2]+=$3; }
END{
for(key in tbl){
split(key, item, /,/);
print item[1], item[2], tbl[key];
}
}
-----
...こんな感じかねぇ? awk -f sum.awk データ | sort
----- sum.awk -----
$1!~/商店名/{ tbl[$1 "," $2]+=$3; }
END{
for(key in tbl){
split(key, item, /,/);
print item[1], item[2], tbl[key];
}
}
-----
570デフォルトの名無しさん
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])
}
}
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])
}
}
571デフォルトの名無しさん
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;
}
}
# 先頭がいきなり "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;
}
}
572デフォルトの名無しさん
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; }
-----
先に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; }
-----
574デフォルトの名無しさん
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の整数って上限あるの?(ウチだけか?)
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の整数って上限あるの?(ウチだけか?)
575デフォルトの名無しさん
2011/05/06(金) 01:09:59.27 long double辺りの精度しかないよ。
576デフォルトの名無しさん
2011/05/06(金) 09:18:39.10 >>574
おれのPCでは普通に 1 から 1e+048 まで表示されますが。。。
おれのPCでは普通に 1 から 1e+048 まで表示されますが。。。
578デフォルトの名無しさん
2011/05/06(金) 11:30:10.09579デフォルトの名無しさん
2011/05/06(金) 14:20:04.87580デフォルトの名無しさん
2011/05/06(金) 18:58:28.81 >>579
ありがとう。
あまり違いがないな。Win7は関係ないだろうし。
multi-byte extensionがその辺りも弄っているのか…
そういえば、1e+048みたいな指数で表示されるの?
出力のとき丸めるから、ちゃんと計算できてるように見えるのかな。
ありがとう。
あまり違いがないな。Win7は関係ないだろうし。
multi-byte extensionがその辺りも弄っているのか…
そういえば、1e+048みたいな指数で表示されるの?
出力のとき丸めるから、ちゃんと計算できてるように見えるのかな。
581デフォルトの名無しさん
2011/05/06(金) 23:07:48.20 awkでは数値はすべてdoubleで扱います。
ですからその精度である53bit分、大体15桁ちょっとを超えると正確な値を保持できません。
23桁あたりまで正しく表示できてるってのはよくわかりませんが、
3.0.6にしても出力時の書式指定が違うだけで内部的には同じように不正確な値に
なってしまってると思います。
ですからその精度である53bit分、大体15桁ちょっとを超えると正確な値を保持できません。
23桁あたりまで正しく表示できてるってのはよくわかりませんが、
3.0.6にしても出力時の書式指定が違うだけで内部的には同じように不正確な値に
なってしまってると思います。
582デフォルトの名無しさん
2011/05/07(土) 01:38:55.53 だから、実質long doubleの精度になっているんだってば。
583デフォルトの名無しさん
2011/05/07(土) 11:11:15.94 >>582
「実質」というのはどういう意味?
#define AWKNUM double
ってのがあるし、long double にしても仮数部は64bitだから23桁には足りないよ?
x87のレベルで拡張精度になってても、表示やらなんやらするところで倍精度に
丸められちゃうと思うんだけど。
「実質」というのはどういう意味?
#define AWKNUM double
ってのがあるし、long double にしても仮数部は64bitだから23桁には足りないよ?
x87のレベルで拡張精度になってても、表示やらなんやらするところで倍精度に
丸められちゃうと思うんだけど。
584デフォルトの名無しさん
2011/05/07(土) 13:09:06.68 http://codepad.org/4GaxJcGp
完全に一致。どう見ても double です。本当にありがとうございました
完全に一致。どう見ても double です。本当にありがとうございました
585デフォルトの名無しさん
2011/05/07(土) 21:19:09.46586デフォルトの名無しさん
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にしてビット数を数えてみればわかるでしょ。
あー、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にしてビット数を数えてみればわかるでしょ。
587デフォルトの名無しさん
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のプロセスが生成される他は、違いはないのでしょうか?
環境や処理系を問わず動作させたいなら、上の書き方の方がよいのか、気になっています。
よろしくお願いします。
print "Serious error detected!" | "cat 1>&2"
という方法しかないとあります。
gawkは/dev/stderrを特別に扱うため、
print "Serious error detected!" > "/dev/stderr"
と書くのが適切とあります。
これには、どのような違いがあるのでしょうか?
/dev/stderrがあるOSなら、catのプロセスが生成される他は、違いはないのでしょうか?
環境や処理系を問わず動作させたいなら、上の書き方の方がよいのか、気になっています。
よろしくお願いします。
588デフォルトの名無しさん
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だと...
/dev/stderrがあるOSって事ぢゃなくて、
gawkは特殊なファイル名として/dev/stderrとか使えるよ、って事だよ。
なので他のOSでも gawk だったらprintとかの出力先ファイル名として /dev/stderr 使えるって話だね。
/dev/stderrとかをサポートしていないgawk以外のawkでも動作させるなら パイプと"cat 1>&2"を使う方法しかない。が、Win系はcatだと...
589デフォルトの名無しさん
2011/05/10(火) 09:20:21.36 そこまでのことをするならPerl/Ruby/Python等のちゃんとした
スクリプト言語で書いた方がいいんじゃないかな。こういう
どうでもいいところで悩まなくて済むよ。
awkはawkで手軽に書ける範囲なら他の追随を許さないと思うが
その枠をはみ出ようとすると途端に大変になる。そこが楽しいと
いうのなら無理には止めないけどw
スクリプト言語で書いた方がいいんじゃないかな。こういう
どうでもいいところで悩まなくて済むよ。
awkはawkで手軽に書ける範囲なら他の追随を許さないと思うが
その枠をはみ出ようとすると途端に大変になる。そこが楽しいと
いうのなら無理には止めないけどw
590デフォルトの名無しさん
2011/05/10(火) 14:35:51.09 >>589
そう、それが楽しいんだ
そう、それが楽しいんだ
591デフォルトの名無しさん
2011/05/11(水) 00:36:20.77592デフォルトの名無しさん
2011/05/11(水) 10:19:43.16 Cで書き直したら数秒で実行完了の予感w
593デフォルトの名無しさん
2011/05/11(水) 12:14:45.46 つーてもawkとかその他のスクリプトでサクッと書けるような文字列処理を
C言語とかではあんまり書きたくならんと思うぞw
C言語とかではあんまり書きたくならんと思うぞw
594デフォルトの名無しさん
2011/05/24(火) 10:19:27.54 なりません
595デフォルトの名無しさん
2011/05/25(水) 20:17:22.02 あぁああぁぁぁ〜〜〜無理だったか、、無理なのかー!a[0][0] = 1 → syntax error
596デフォルトの名無しさん
2011/05/25(水) 21:58:46.38 >>595
gawkの場合インデックスをSUBSEP(=\034がデフォルト)を挟んでシリアライズしたインデックスで多次元配列を表現する
a[0,0] = 1;
ならOKのはず。このときのインデックスは"0\0340"だから、a["0\0340"] == 1。
gawkの場合インデックスをSUBSEP(=\034がデフォルト)を挟んでシリアライズしたインデックスで多次元配列を表現する
a[0,0] = 1;
ならOKのはず。このときのインデックスは"0\0340"だから、a["0\0340"] == 1。
597デフォルトの名無しさん
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の配列って処理系によっては添え字が整数の場合、処理が最適化されて早くなったりするのかな?
構造体の代わりみたいに使いたかったのだが。
ありがとう。始めからそれを意識して書いてたらよかったんだけどね。
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の配列って処理系によっては添え字が整数の場合、処理が最適化されて早くなったりするのかな?
構造体の代わりみたいに使いたかったのだが。
598デフォルトの名無しさん
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."
でよくね?
msg["god"] = "Mahoushoujo ha watashi dakede juubun dayo."
name["homerun"] = "Akemi Homura"
msg["homerun"] = "Madoka ha watashi no yome."
でよくね?
599デフォルトの名無しさん
2011/05/30(月) 21:25:51.88 awkって *どの実装でも* 一度も使ったことがない変数の内容って、スカラなら0か""になってるの?
変数が一度も代入されていないことを判定するために、(x==0 && x=="")って書いて何か問題ない?
変数が一度も代入されていないことを判定するために、(x==0 && x=="")って書いて何か問題ない?
600デフォルトの名無しさん
2011/05/30(月) 21:31:52.21601デフォルトの名無しさん
2011/05/30(月) 21:32:47.76 >>599
何度も代入した後、最後に 0 or "" を代入した変数と区別できない。
何度も代入した後、最後に 0 or "" を代入した変数と区別できない。
602デフォルトの名無しさん
2011/05/30(月) 23:19:06.92603デフォルトの名無しさん
2011/05/31(火) 00:05:27.97 あれ?試したらどっちを代入しても599の式は0に評価されたよ。区別できないケースってどういう場合?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 米大統領報道官「日本と強固な同盟維持、中国とも協力」 [少考さん★]
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★2 [蚤の市★]
- ミス・ユニバース フィンランド代表の「つり目」写真が波紋… 本人釈明も批判やまず 協会謝罪「徹底的に検証」へ [冬月記者★]
- 【おこめ券】鈴木憲和農相 小泉前農相の備蓄米放出を“反省”「備蓄の円滑な運営を図ってまいります」 [Hitzeschleier★]
- JA全農が「新おこめ券」…来年9月末の有効期限を新設、必要経費のみ上乗せ ★2 [蚤の市★]
- 1人3千円の食品高騰対策、何に使える? あいまいなまま衆院通過 [蚤の市★]
- 【悲報】維新の政治資金でガールズバー、高市首相「良いか悪いかは国民の皆さまが判断されること」 [115996789]
- 【マギレコ】VIPでマギアレコード&マギアエクセドラ【まどドラ】
- 中国人、ガチ超正論。「日本人がアイヌに対してやったことを『問題ない』とするなら、中国が日本人に同じことをしても文句ないだろう?」 [314039747]
- 【悲報】新米、全く売れなくて倉庫が満杯になってしまうwwwwwwwwwwwwwwwwwwww [802034645]
- 衛生的に気持ち悪くて性風俗店行ったこと無いんだ
- いじめられてる男子中学生だけど質問ある?
