awkについて語るスレ $2
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/02/23(金) 23:55:42三人の碩学が生み出したスクリプト言語AWKについて語るスレ
◆ 前スレ
awkについて語るスレ
http://pc10.2ch.net/test/read.cgi/tech/1023556171/
◆ 関係スレ
シェルスクリプト相談室
http://pc10.2ch.net/test/read.cgi/tech/1112553783/
AWKでCGI
http://pc10.2ch.net/test/read.cgi/php/1171804314/
【sed】シェルスクリプト総合@LINUX Part2【awk】
http://pc10.2ch.net/test/read.cgi/linux/1154578200/
◆ 参考
The AWK Programming Language (Brian Kernighan):
ttp://cm.bell-labs.com/cm/cs/awkbook/index.html
GAWK (GNU Projedt):
ttp://www.gnu.org/software/gawk/
0578デフォルトの名無しさん
2011/05/06(金) 11:30:10.09本当ですか!よろしければ環境を教えてください。
>>577
ありがとう。ここawkも張れたんだ。結果が長すぎて困ってたのよ。
正にこんな結果になる。
POSIXで保障されてる精度は>>575ってこと?
てことは、awkは内部では、全ての数がdouble扱いなの?
0579デフォルトの名無しさん
2011/05/06(金) 14:20:04.87576です。WindowsXP + GNU Awk 3.0.6 + multi-byte extension 1.15 です。
0580デフォルトの名無しさん
2011/05/06(金) 18:58:28.81ありがとう。
あまり違いがないな。Win7は関係ないだろうし。
multi-byte extensionがその辺りも弄っているのか…
そういえば、1e+048みたいな指数で表示されるの?
出力のとき丸めるから、ちゃんと計算できてるように見えるのかな。
0581デフォルトの名無しさん
2011/05/06(金) 23:07:48.20ですからその精度である53bit分、大体15桁ちょっとを超えると正確な値を保持できません。
23桁あたりまで正しく表示できてるってのはよくわかりませんが、
3.0.6にしても出力時の書式指定が違うだけで内部的には同じように不正確な値に
なってしまってると思います。
0582デフォルトの名無しさん
2011/05/07(土) 01:38:55.530583デフォルトの名無しさん
2011/05/07(土) 11:11:15.94「実質」というのはどういう意味?
#define AWKNUM double
ってのがあるし、long double にしても仮数部は64bitだから23桁には足りないよ?
x87のレベルで拡張精度になってても、表示やらなんやらするところで倍精度に
丸められちゃうと思うんだけど。
0584デフォルトの名無しさん
2011/05/07(土) 13:09:06.68完全に一致。どう見ても double です。本当にありがとうございました
0585デフォルトの名無しさん
2011/05/07(土) 21:19:09.46あう、そうなのかー。ありがとうございます。困ったなぁ。
10進で実数扱えとまでは言わないけど、整数は欲しい。
数をいろんな型で扱える処理系なんてないか。
0586デフォルトの名無しさん
2011/05/07(土) 23:01:38.63あー、long doubleと言ったのが拙かったね。10の冪の場合は実質doubleを大きく越えた精度になっていると言いたかった。
10は2と5の積だから、10倍を繰り返すときに仮数部は5倍ずつにしかならない。
IEEEのdoubleの精度だと5の22乗で53ビットを使い果たすので、そこまでは誤差が生じない。
言い換えれば、10の場合は53ビット+22ビット、即ち75ビット分精度があるように見える。
まぁ、>584を10倍じゃなくて5倍にして、doubleをlong longにして%.fを%llxにしてビット数を数えてみればわかるでしょ。
0587デフォルトの名無しさん
2011/05/09(月) 21:13:05.37print "Serious error detected!" | "cat 1>&2"
という方法しかないとあります。
gawkは/dev/stderrを特別に扱うため、
print "Serious error detected!" > "/dev/stderr"
と書くのが適切とあります。
これには、どのような違いがあるのでしょうか?
/dev/stderrがあるOSなら、catのプロセスが生成される他は、違いはないのでしょうか?
環境や処理系を問わず動作させたいなら、上の書き方の方がよいのか、気になっています。
よろしくお願いします。
0588デフォルトの名無しさん
2011/05/10(火) 00:17:11.81/dev/stderrがあるOSって事ぢゃなくて、
gawkは特殊なファイル名として/dev/stderrとか使えるよ、って事だよ。
なので他のOSでも gawk だったらprintとかの出力先ファイル名として /dev/stderr 使えるって話だね。
/dev/stderrとかをサポートしていないgawk以外のawkでも動作させるなら パイプと"cat 1>&2"を使う方法しかない。が、Win系はcatだと...
0589デフォルトの名無しさん
2011/05/10(火) 09:20:21.36スクリプト言語で書いた方がいいんじゃないかな。こういう
どうでもいいところで悩まなくて済むよ。
awkはawkで手軽に書ける範囲なら他の追随を許さないと思うが
その枠をはみ出ようとすると途端に大変になる。そこが楽しいと
いうのなら無理には止めないけどw
0590デフォルトの名無しさん
2011/05/10(火) 14:35:51.09そう、それが楽しいんだ
0591デフォルトの名無しさん
2011/05/11(水) 00:36:20.77ありがとうございます。
catがない環境だと、どうしようもないですね…
>>589
コンマ区切りのデータを、シェルスクリプトで処理していたので、
それをawkに移植していました。一番手軽だったのです。
ちなみに、2時間半以上かかっていた処理が、1分以内に短縮されました。
ワラタ。 ワラタ…
0592デフォルトの名無しさん
2011/05/11(水) 10:19:43.160593デフォルトの名無しさん
2011/05/11(水) 12:14:45.46C言語とかではあんまり書きたくならんと思うぞw
0594デフォルトの名無しさん
2011/05/24(火) 10:19:27.540595デフォルトの名無しさん
2011/05/25(水) 20:17:22.020596デフォルトの名無しさん
2011/05/25(水) 21:58:46.38gawkの場合インデックスをSUBSEP(=\034がデフォルト)を挟んでシリアライズしたインデックスで多次元配列を表現する
a[0,0] = 1;
ならOKのはず。このときのインデックスは"0\0340"だから、a["0\0340"] == 1。
0597デフォルトの名無しさん
2011/05/26(木) 18:46:04.99ありがとう。始めからそれを意識して書いてたらよかったんだけどね。
god["name"] = "Kaname Madoka"
god["msg"] = "Mahoushoujo ha watashi dakede juubun dayo."
homerun["name"] = "Akemi Homura"
homerun["msg"] = "Madoka ha watashi no yome."
こんな風に書いていたのを、
puella_magi["god"] = god
puella_magi["homerun"] = homerun
みたいにまとめようとしたら、あばばばば
awkの配列って処理系によっては添え字が整数の場合、処理が最適化されて早くなったりするのかな?
構造体の代わりみたいに使いたかったのだが。
0598デフォルトの名無しさん
2011/05/27(金) 00:57:28.69msg["god"] = "Mahoushoujo ha watashi dakede juubun dayo."
name["homerun"] = "Akemi Homura"
msg["homerun"] = "Madoka ha watashi no yome."
でよくね?
0599デフォルトの名無しさん
2011/05/30(月) 21:25:51.88変数が一度も代入されていないことを判定するために、(x==0 && x=="")って書いて何か問題ない?
0600デフォルトの名無しさん
2011/05/30(月) 21:31:52.21評価されるときに変数が存在しなければ作成される。はず
配列の要素なら in で調べられるけど
変数自体となるとどうだろうね
0601デフォルトの名無しさん
2011/05/30(月) 21:32:47.76何度も代入した後、最後に 0 or "" を代入した変数と区別できない。
0602デフォルトの名無しさん
2011/05/30(月) 23:19:06.92ありがとう。区別できないって、どういう状態になるの?0を代入したら0か"0"に評価される。
ああ、""を代入したら0か""に評価されて駄目ってことか!?
0603デフォルトの名無しさん
2011/05/31(火) 00:05:27.970604デフォルトの名無しさん
2011/05/31(火) 06:28:27.99# 初期化直後 (未使用) の変数は数値 (0) と文字列 ("") の両方の型を持つ。
print x == 0, x == ""; # 両方とも真
x = 0;
print x == 0, x == ""; # 前者のみ真。
x = "";
print x == 0, x == ""; # 後者のみ真。
# 他の未使用の変数を代入すると "再初期化" できる。
x = y;
print x == 0, x == ""; # 両方とも真。
}
0605デフォルトの名無しさん
2011/05/31(火) 22:57:53.71IEEE Std 1003.1 の awk の EXTENDED DESCRIPTION の
Variables and Special Variables に書いてあるね。 uninitialized value というらしい。
POSIXに準拠してるawkならこうなるみたいだけど、オリジナルは知らん。
再初期化するなら$(NF+1)使うほうがいいかもね。未使用の変数を用意しなくていい。
だけど、それが必要な場面が思い浮かばないが。
関係ないけど、abs関数ってないんだね。別に良いけど、πや、
0より大きい最小の浮動小数点数は定義しててほしいなあ。
0606デフォルトの名無しさん
2011/06/02(木) 10:09:14.37> 再初期化するなら$(NF+1)使うほうがいいかもね。未使用の変数を用意しなくていい。
フィールド変数は常に文字列型で、 数値型は持たない。
0607デフォルトの名無しさん
2011/06/02(木) 22:47:31.10「0より大きい最小の浮動小数点数」ってどう定義していつ使うの?
0608デフォルトの名無しさん
2011/06/03(金) 13:48:37.95以下の3種類がある。
(1) 最小の正の非正規数
(2) 最小の正の正規数
(3) 1.0に足して丸めた結果が1.0より大きくなる最小の数
0609デフォルトの名無しさん
2011/06/03(金) 23:58:11.26あちゃ!そうでした。$で戻るのは文字列だった。
その仕様書読んでると、NFを拡張したとき、元々なかった所はuninitialized valueになるってあったので。
>>607
それでいいんだけど、PIとかで参照できたらもっといい、と思ったのです。
>>608
数値計算のために、CのDBL_EPSILONの代わりになる定数が欲しいなと。
任意の精度で丸められる関数もないですし。
0610デフォルトの名無しさん
2011/06/04(土) 09:41:48.63数値計算の基本なんだが。
0611デフォルトの名無しさん
2011/06/10(金) 21:49:33.34awkだと、C風が一般的なのでしょうか?
一番最初がVBAだったので、長い名前と省略が混ざってしまって
自分でイライラしています。
みなさんの、通常の変数はこう、配列はこう、定数はこう、文字型はこう・・・
というものを参考にしたいです。
0612デフォルトの名無しさん
2011/06/10(金) 22:10:28.97システムハンガリアンを採用するかどうか悩むほど大きなものをawkで書いたことが無い
0613かあた
2011/06/13(月) 18:37:34.880614デフォルトの名無しさん
2011/06/15(水) 21:51:26.93遅レスだが、型_内容の説明_名前みたくしてる。名前が一文字だとそのままだけど。
グローバル変数とローカル変数のどっち弄ってるのか分かりやすいように、ローカル変数は必ずlで始めるようにしてる。
d_per_shouhizei = 5.0とかね。
0615デフォルトの名無しさん
2011/06/20(月) 18:37:26.17入力されたバイナリーを16進ダンプして表示するにはどうしたらよいでしょうか?
od等の外部コマンドを使う意外に方法があればお教えください。
0616デフォルトの名無しさん
2011/06/20(月) 19:17:07.500617天使 ◆uL5esZLBSE
2011/07/05(火) 00:15:13.83お前らってどうみてもゴミだよな
0618デフォルトの名無しさん
2011/07/06(水) 14:04:55.240619デフォルトの名無しさん
2011/07/14(木) 23:55:15.84gawk4.0.0でa[0][0]=1も可能になったじゃないか
0620デフォルトの名無しさん
2011/07/30(土) 19:46:15.81aaa 10
bbb 20
ccc 30
aaa 30
bbb 30
aaa 15
ccc 30
ddd 20
以下のようにまとめたいのですが、どうしたらいいでしょうか?
aaa 55
bbb 50
ccc 60
ddd 25
0621デフォルトの名無しさん
2011/07/30(土) 19:53:38.97awk '{a[$1]+=$2} END {for (b in a) {print b " " a[b]}}' | sort
0622デフォルトの名無しさん
2011/07/30(土) 23:15:27.520623620
2011/07/30(土) 23:22:20.03ありがとうございます!うまくいきました。
0624デフォルトの名無しさん
2011/07/31(日) 15:24:48.760625デフォルトの名無しさん
2011/08/16(火) 22:48:21.640626デフォルトの名無しさん
2011/08/18(木) 01:56:26.630627デフォルトの名無しさん
2011/08/19(金) 00:53:44.39WIN32のEXE一つで、下のTEST.AWKがマトモに動くAWKを探しています。
これら以外にありますか?
http://hinadori.atnifty.com/~wills/program/gawkm115.zip
http://my.vector.co.jp/servlet/System.FileDownload/download/http/0/376460/pack/win95/util/text/awk/gawk-mbcs-win32-20051223.zip?ds
http://my.vector.co.jp/servlet/System.FileDownload/download/http/0/80308/pack/win95/util/text/awk/mw32r27.lzh?ds
Cygwin版も試したのですがダメでした。
TEST.AWK
{ gsub("[0-9]","x",$0) ; gsub("ソ","ソ",$0) ; gsub("T","T",$0) ; print }
TEST.DAT
アイウエオカキクケコサシスセソ
ココココサフサコココココ
ココココサフサココココ
ココココサフサコココココ
ココココサフサコココココ
サフサフサフサフサフサ
ココココサフサコココココ
ココココサフサココココ
ココココサフサコココココ
ココココサフサコココココ
サフサフサフサフサフサ
0628627
2011/08/19(金) 01:00:20.60専ブラのポップアップをコピペして下さい。
0629デフォルトの名無しさん
2011/08/19(金) 06:26:54.920630デフォルトの名無しさん
2011/08/19(金) 11:02:41.54cygwinのawk(GNU Awk 3.1.8)で動くけど、どうなるはずがどう動かないと言っている?
>627のtest.datなら、当然「ソ」だけが変換されるけど。
0631デフォルトの名無しさん
2011/08/19(金) 11:55:06.25事前にTEST.DATをnkf -wに通したら駄目かな。
0632629
2011/08/19(金) 21:59:57.43スクリプトもDATもSJISで試したけど、上記3つのうち、gawk-mbcs-win32-20051223.zipはダメだったよ。
1行目がこんなんなる。
アxxエオカキクxコサxxxソ
手持ちの
GNU Awk 3.1.7(windows special Nov 24 2009)
で、--ctype=SJISやっても同じ結果になるね。
スクリプト、DATをUTF-8にして、--ctype=UTF8やってリダイレクトしたファイルは正常な結果が出るよ。
リダイレクトしないでコマンドプロンプトに表示させると化けるけど。
0633デフォルトの名無しさん
2011/08/19(金) 23:18:25.140634デフォルトの名無しさん
2011/08/24(水) 08:07:37.54そろそろOOP対応してくれないかな。
awk++とかあるけど、標準でOOPできれは便利。
0635デフォルトの名無しさん
2011/08/24(水) 22:44:37.24...もはやawkでやる意味が無いw 他にいくらでもある別の言語でいいじゃん
0636デフォルトの名無しさん
2011/08/25(木) 01:14:17.45配列や関数への参照を値として取り出し格納したり
逆にその値から元の配列にアクセスしたり元の関数を呼んだり出来ると
相当に複雑なデータ構造が表現可能になる、それこそOOPっぽいことも可能だし
でもあんまりややこしいことやるならPerlでいいから必須ではないね
0637デフォルトの名無しさん
2011/08/25(木) 02:28:23.99変数の値を関数名として
var = "sage";
@var();
ってできるけど、それとは違うのん?
0638デフォルトの名無しさん
2011/08/25(木) 04:07:56.67最近のawkは分からねえ…ってことは、配列への参照を使って入れ子の配列とか既に作れちゃったりするのか?
0639デフォルトの名無しさん
2011/08/25(木) 10:56:54.360640デフォルトの名無しさん
2011/08/25(木) 19:51:33.840641デフォルトの名無しさん
2011/08/25(木) 20:52:51.07property name
property sex
property age
method new(x, y, z) {
name = x
sex = y
age = z
}
method say() {
printf("私は%s。%d歳の%sです。\n",name, age, sex)
}
}
class japanese : human {
property name
property sex
property age
method say() {
printf("私は%s。%d歳の%sです。国籍は日本です。\n", name, age, sex)
}
}
BEGIN {
alice = human.new("アリス", "女", 11)
taro = japanese.new("太郎", "男", 15)
yuka = japanese.new("由佳", "女", 18)
alice.say()
taro.say()
yuka.say()
}
0642641
2011/08/25(木) 20:58:10.41http://code.google.com/p/lawker/source/browse/fridge/lib/bash/awk%2B%2B/
これを使えばこの程度のOOPはどうにかできる。
本当にこの程度でいいからOOPに対応してほしい。
使う人はほとんどいないと思うが、全くできないのも困る。
0643デフォルトの名無しさん
2011/08/25(木) 22:07:53.460644デフォルトの名無しさん
2011/08/26(金) 06:00:04.19self["property___name"] = name
self["property___sex"] = sex
self["property___age"] = age
self["method___say"] = "Human___say"
}
function Human___say(self) {
printf "私は%s。%d歳の%sです。\n", self["property___name"], self["property___age"], self["property___sex"]
}
function Japanese(self,name,sex,age) {
Human(self,name,sex,age)
self["method___say"] = "Japanese___say"
}
function Japanese___say(self) {
printf "私は%s。%d歳の%sです。国籍は日本です。\n", self["property___name"], self["property___age"], self["property___gender"]
}
function methodcall(obj,methodname, m) {
m = obj["method___" methodname]
@m(obj)
}
BEGIN {
Human(alice, "アリス", "女", 11)
Japanese(taro, "太郎", "男", 15)
Japanese(yuka, "由佳", "女", 18)
methodcall(alice,"say")
methodcall(taro,"say")
methodcall(yuka,"say")
}
0645デフォルトの名無しさん
2011/08/26(金) 06:01:35.02とりあえず、こんな感じでgawk4でもOOP自体は出来るよって話
0646デフォルトの名無しさん
2011/08/27(土) 15:07:17.61なるほどねー
とても勉強になります
でも、やっぱりOOP用の構文が使えればベストですね
そのほうがわかりやすいと思います
0647デフォルトの名無しさん
2011/08/27(土) 15:58:44.090648デフォルトの名無しさん
2011/08/27(土) 16:10:36.72これの糖衣構文を用意してくれって投稿するといいんじゃね
switchも実装されてるし、欲しい人が居ると分かれば付けてくれるかもよ
0649デフォルトの名無しさん
2011/08/27(土) 16:25:08.65# -*- coding: utf-8 -*-
class human:
def __init__(self, name, sex, age):
self.name = name
self.sex = sex
self.age = age
def say(self):
print("私は" + self.name + "。" + str(self.age) + "歳の" + self.sex + "です。")
class japanese(human):
def __init(self):
super(human, self).__init__(self)
def say(self):
print("私は" + self.name + "。" + str(self.age) + "歳の" + self.sex + "です。国籍は日本です。")
if __name__ == "__main__":
alice = human("アリス", "女", 11)
taro = japanese("太郎", "男", 15)
yuka = japanese("由佳", "女", 18)
alice.say()
taro.say()
yuka.say()
0650デフォルトの名無しさん
2011/08/27(土) 16:26:25.23>>641と比べると特にわかりやすいわけでもないけど
>>644よりはわかりやすい
0651デフォルトの名無しさん
2011/08/27(土) 16:53:49.92あくまでシェルのお供でいいと思うんだ
そしてそこに高度なOOP機能は要るとは思えない
どちらかと言えばフィールド抽出とかをもっと便利にすべきだよ
0652デフォルトの名無しさん
2011/09/17(土) 15:34:39.290653デフォルトの名無しさん
2011/09/17(土) 16:28:58.780654デフォルトの名無しさん
2011/09/18(日) 08:02:36.95つhttp://www.klabaster.com/progs/gawk32.zip
0655デフォルトの名無しさん
2011/09/19(月) 13:00:55.06>653 awkの実行形式だけ入手すれば良いようにしたいのさ。
0656デフォルトの名無しさん
2011/09/19(月) 14:01:43.390657デフォルトの名無しさん
2011/09/19(月) 16:07:37.39cygwin1.dllだっけ?にパスが通ってれば大体使えたような気がする。
0658デフォルトの名無しさん
2011/09/19(月) 17:00:12.76コマンドによるけど
0659デフォルトの名無しさん
2011/10/24(月) 01:55:49.24http://www.gnu.org/s/gawk/manual/gawk.html#Array-Sorting-Functions
の asort(), asorti()で使うユーザー定義の比較関数について
3番目の引数とPROCINFO["sorted_in"]に設定するのと違うのか同じなのか?
それと
http://www.gnu.org/s/gawk/manual/gawk.html#String-Functions
に書いてある3番目の引数の説明("descending"とか)が両立してんの?
0660デフォルトの名無しさん
2011/10/24(月) 11:34:13.18As with PROCINFO["sorted_in"], this argument may be the name of a user-defined function, ....
http://www.gnu.org/s/gawk/manual/gawk.html#String-Functions
The third argument can also be a user-defined function name ....
第三引数の値と同名の関数が定義済みならそれを利用するとか、
そういう方法で区別してるんじゃないの
0661デフォルトの名無しさん
2011/10/24(月) 13:33:04.59比較関数の与え方はPROCINFO["sorted_in"]の場合と同じってことだろ。
自分で定義した関数の名前でもいいし、11.2.1.2に書いてあるようにすでに用意
されている@〜を使ってもいい。
0662デフォルトの名無しさん
2011/11/14(月) 21:59:05.28GAWKで呼ぶ関数をCで書ける機能が欲しいと思ってるんだけど、
ここ見る限り世間的にはあんまり需要ないんかねぇ。
まぁ、それやるくらいならGAWK自体に変更を加えて再コンパイルしろってことかもしれないけど。
0663デフォルトの名無しさん
2011/11/15(火) 01:44:31.010664デフォルトの名無しさん
2011/11/15(火) 01:58:32.43ttp://www.gnu.org/s/gawk/manual/html_node/Dynamic-Extensions.html
じゃダメ?将来的にさらに拡張される可能性はあるみたいだけど
0665デフォルトの名無しさん
2011/12/09(金) 00:35:09.18■ このスレッドは過去ログ倉庫に格納されています