[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 09/01 08:48 / Filesize : 292 KB / Number-of Response : 1034
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

awkについて語るスレ $2



1 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 23:55:42 .net]
腐っても鯛? 騏も老いては駑馬に劣る?
三人の碩学が生み出したスクリプト言語AWKについて語るスレ

◆ 前スレ
awkについて語るスレ
pc10.2ch.net/test/read.cgi/tech/1023556171/

◆ 関係スレ
シェルスクリプト相談室
pc10.2ch.net/test/read.cgi/tech/1112553783/
AWKでCGI
pc10.2ch.net/test/read.cgi/php/1171804314/
【sed】シェルスクリプト総合@LINUX Part2【awk】
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/

513 名前:デフォルトの名無しさん mailto:sage [2011/01/29(土) 19:39:08 .net]
ウチは RHEL と Solaris だけ考えれば良いから、awk で問題がある時は Perl か Python で済ますわ

514 名前:デフォルトの名無しさん mailto:sage [2011/01/30(日) 05:43:19 .net]
#!/usr/bin/env [gn]*awk
だろ常考

515 名前:デフォルトの名無しさん mailto:sage [2011/02/01(火) 10:39:45 .net]
shebang行に /usr/bin/env 書くのってあんま良いと思えないんだよなあ
複数の引数の扱いとか、環境変数をそこまで信用して良いものなのかとか
あと /usr/bin/ に env があることは本当に保証できるのかとか
/bin/sh を書いたほうが良いんじゃないかって思ってしまう

516 名前:デフォルトの名無しさん mailto:sage [2011/02/01(火) 11:45:20 .net]
この話題も定番だな。前スレの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によっててんでばらばら
>なのであまりお勧めできないということだろうか。

517 名前:デフォルトの名無しさん mailto:sage [2011/02/02(水) 00:12:39 .net]
ruby 界隈でも流行ってるな
意味も判らず「おまじない」と称して使ってるうちに
都市伝説化していくんだな

518 名前:デフォルトの名無しさん mailto:sage [2011/02/03(木) 22:33:59 .net]
なぜ gawk には tr が無いのだ
tr("A-Z","A-Z")とかしたいぞ

519 名前:デフォルトの名無しさん mailto:sage [2011/02/04(金) 03:31:02 .net]
つ Python

520 名前:デフォルトの名無しさん [2011/02/04(金) 09:10:06 .net]
>>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))
}
}


521 名前:デフォルトの名無しさん mailto:sage [2011/02/04(金) 09:20:39 .net]
それだとtr('ab', 'ba')がうまくいかないんだよなぁ。




522 名前:デフォルトの名無しさん [2011/02/04(金) 09:54:40 .net]
同じ事じゃん


523 名前:デフォルトの名無しさん mailto:sage [2011/02/04(金) 19:22:21 .net]
汎用的に1つ作っとけばいいじゃん

524 名前:デフォルトの名無しさん mailto:sage [2011/02/05(土) 20:23:34 .net]
>514みたいなベタ打ちじゃなくて

A-Zあ-ん

こういう表記で置換する方法ある?


525 名前:デフォルトの名無しさん mailto:sage [2011/02/05(土) 20:37:26 .net]
>>518
tr 使えば?

526 名前:デフォルトの名無しさん mailto:sage [2011/02/06(日) 03:05:39 .net]
tr コマンドって環境によってマルチバイトの扱いが違わね?ウチの場合
Ubuntu10.04に入ってるtr(GNU coreutils)7.4はどうやら2文字扱いにしちゃうらしいが
MacOSX10.5に入ってるtr(バージョン判らんがman見るとBSD系ぽい)は1文字扱いにしてくれた

527 名前:デフォルトの名無しさん mailto:sage [2011/02/06(日) 05:00:06 .net]
UNICODE = 文字数
mbcs = バイト数

528 名前:デフォルトの名無しさん mailto:sage [2011/02/07(月) 08:10:44 .net]
んーと、どゆこと?
gnome-terminalはユニコード設定のはずなんだが…
他にやらなきゃいけないことがあるってこと?

529 名前:デフォルトの名無しさん [2011/02/09(水) 23:11:37 .net]
awk++使ってる人いる?
awk.info/?doc/dsl/awkplusplus.html

530 名前:デフォルトの名無しさん mailto:sage [2011/02/10(木) 14:20:51 .net]
最近、awkの存在を知りました。
いろんな言語を触っては挫折・・・触っては挫折・・・を繰り返していました。
awkは何となくマスター出来そうな気がします。
これから頑張ります!!
256倍の本を今は読んでおります。

531 名前:デフォルトの名無しさん mailto:sage [2011/02/16(水) 02:02:44 .net]
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が入った特殊配列みたいなのがあったらうれしいのだが。



532 名前:デフォルトの名無しさん mailto:sage [2011/02/16(水) 07:22:58 .net]
>>525
$iとか書けるし代入もできるから
$1〜を保存しなくていいのなら、後半は

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

と書けばちょっと短くなるな。


533 名前:デフォルトの名無しさん mailto:sage [2011/02/16(水) 12:11:40 .net]
>>526
なるほど、そうできるのか。ありがとう。

534 名前:デフォルトの名無しさん mailto:sage [2011/02/17(木) 01:07:36 .net]
www.kt.rim.or.jp/~kbk/gawk-3.1/ に置いてあった
win32用gawkがいつの間にか公開停止になっていた。

wn32のgensubが使

535 名前:ヲて日本語が扱えて、
かつexeのみで稼動するのでインストール不要なのが便利で
公私にわたって愛用していたので、非常に悲しい・・・
[]
[ここ壊れてます]

536 名前:デフォルトの名無しさん mailto:sage [2011/02/17(木) 02:14:57 .net]
www.vector.co.jp/soft/win95/util/se376460.html
↑とは違うの?

537 名前:デフォルトの名無しさん mailto:sage [2011/02/18(金) 11:30:36 .net]
それは少し古い.
gawk-mbcs-win32-20090920.zip が手元にあるので必要なら再配布するが?

538 名前:528 mailto:sage [2011/02/19(土) 01:36:10 .net]
>>530
もし私に言ってくれているのであれば、
exeのみだけど2009/11/24版が手元にあるので、
これを使い続けようと思う。ありがとう。


539 名前:デフォルトの名無しさん mailto:sage [2011/02/19(土) 08:18:59 .net]
俺の手元に、gawk-mbcs-win32-20091124.zip があった。
欲しい人がいて、かつ再配布に問題無いという事がわかればどっかにうpするが。

しかしなんで配布やめちゃったんだろね。
どこからか拝借したコードとかのライセンス問題なのかな?

540 名前:デフォルトの名無しさん [2011/02/19(土) 22:51:02.65 .net]
AWK++によるオブジェクト指向入門
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でオブジェクト指向する人も増えるかもね。

541 名前:デフォルトの名無しさん mailto:sage [2011/02/19(土) 23:05:51.24 .net]
>>533
デフォでインストールされるawkでできる範囲のことしかやらないよ



542 名前:デフォルトの名無しさん mailto:sage [2011/02/20(日) 00:59:51.51 .net]
同感。>デフォでできる範囲
長めのスクリプトを書いた事があったのでOOあると便利と思うけど
わざわざインストールするならperl、ruby、pythonがあるしなぁ


543 名前:デフォルトの名無しさん mailto:sage [2011/02/22(火) 10:31:51.00 .net]
awkで書かれたawk++ってないの?

544 名前:デフォルトの名無しさん mailto:sage [2011/03/02(水) 23:14:41.35 .net]
gawkで平仮名・カタカナの部分を抜き出したいと思ってます。
例えば「awkについて語るスレ」だったら
"について" "るスレ" を変数に入れたいのですが、いい方法ありますでしょうか?

545 名前:537 mailto:sage [2011/03/02(水) 23:17:39.07 .net]
「について」と「るスレ」はそれぞれ別の変数に入れたいと思っています

546 名前:デフォルトの名無しさん mailto:sage [2011/03/02(水) 23:27:45.29 .net]
アルファベット以外の部分だったら、アルファベットをFSに指定してwhileで回せばいいけど、
漢字も抜くのは難しいな。
それに、事実上変数は無限に生成するって事か。

547 名前:デフォルトの名無しさん mailto:sage [2011/03/02(水) 23:58:57.50 .net]
matchの第2引数に/[あ-んア-ン]+/を持ってくるとか?

548 名前:デフォルトの名無しさん [2011/03/03(木) 13:28:46.50 .net]
$0,$1...$NFを壊してもいいんだったら、私ならこうします。

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

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

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

注意すべきは、Windows版の新しいバージョンのものでは、
正規表現として、ひらがなを ぁ-ん で、カタカナを ァ-ン で
指定できないものがあります。
たしかマルチバイト拡張で壊された。


549 名前:537 mailto:sage [2011/03/03(木) 14:28:35.14 .net]
>541
まだ試してませんが、欲する文字以外を消してゴニョゴニョすればいけそうです。
>539-540さんもありがとうございました。


550 名前:デフォルトの名無しさん [2011/03/03(木) 19:41:21.36 .net]
BEGIN {
str = "デンコ漢字ばんざい元気abcdeだから"
c = split(str, a, "[^ーァ-ンぁ-ん]")
for (i = c; i>=1; i--) {
if ( a[i] !~ /^$/ ) { print a[i] }
}
}

551 名前:デフォルトの名無しさん mailto:sage [2011/03/03(木) 19:44:47.65 .net]
ボケかました
4行目は普通に
for ( i = 1; i <=c; i++) {
でOK。



552 名前:デフォルトの名無しさん mailto:sage [2011/03/03(木) 22:55:52.84 .net]
cを残さなくとも
for (i in a){if (a[i]) print a[i]}
で間に合うような。

553 名前:デフォルトの名無しさん mailto:sage [2011/03/04(金) 01:04:03.52 .net]
for-inだと順序が保障されないんじゃなかったっけ?

554 名前:デフォルトの名無しさん [2011/03/04(金) 08:34:52.75 .net]
for ( i = 1; i in a ; i++) って書き方もできるよ


555 名前:デフォルトの名無しさん [2011/03/07(月) 14:14:11.11 .net]
a1 a1 a1 a2 a2 a3
b1 b1 b1 b1
c1
d1 d2 d2
....

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

556 名前:デフォルトの名無しさん mailto:sage [2011/03/07(月) 14:31:25.16 .net]
>>548
いろいろやり方はあると思うが

awk '{j=0;delete a;for(i=1;i<=NF;i++){if(!a[$i]++){$(++j)=$i}}NF=j;print}'

557 名前:デフォルトの名無しさん [2011/03/07(月) 14:53:42.21 .net]
ありがとうございます。
それぞれ、4つ重複データのあったものは3つに、2つのものは1つにと減ったのですが
それ以上減ってません。同じコマンドを繰り返しかけてみたのですが、変化はなかったです。

a1 a1 a1 a1
b1 b1 b1
...の部分が
a1 a1 a1
b1 b1
にはなったという意味です。
もう少しおつきあいいただけないでしょうか。。。


558 名前:デフォルトの名無しさん mailto:sage [2011/03/07(月) 15:06:41.15 .net]
手元では一つになるけどなぁ。原理はわかるだろうからあとはがんばれ。
行ごとにフィールドの添字についてループするのと連想配列で出現チェックがキモ。

% 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


559 名前:デフォルトの名無しさん [2011/03/07(月) 15:14:33.26 .net]
0610005C13Rik 0610005C13Rik 0610005C13Rik
0610007C21Rik 0610007C21Rik 0610007C21Rik 0610007C21Rik 0610007C21Rik

こういう感じの文字列なんですが
a1とかb1で例えても大丈夫だったですか?

560 名前:デフォルトの名無しさん mailto:sage [2011/03/07(月) 15:38:11.62 .net]
空白で区切られた文字列ならなんでもいいが、そのレベルの質問が
出るようじゃもうすこし基礎を勉強しないとだめかもなぁ。

561 名前:デフォルトの名無しさん mailto:sage [2011/03/07(月) 15:50:13.69 .net]
シングルクオーテーション使用のサンプルで問題ないと言う事は〜
UNIX環境なのかな〜




562 名前:デフォルトの名無しさん [2011/03/07(月) 15:58:11.87 .net]
Mac OSXのターミナルを使ってます。
>>551はそのままうまく動きました。
いま昇順で手動で作業してますが、まだzを抜けることができません。
もう手がつりそうです

563 名前:デフォルトの名無しさん mailto:sage [2011/03/07(月) 16:04:33.75 .net]
一行野郎を分解してスクリプトに組み直して弄れば動作確認出来ると思う

564 名前:デフォルトの名無しさん [2011/03/07(月) 16:21:10.50 .net]
いまwまできました。もうだめです。
一応、ファイルをおいてみます。。。
www5.puny.jp/uploader/download/1299482386.zip
パスは1234です。

565 名前:デフォルトの名無しさん mailto:sage [2011/03/07(月) 17:18:15.93 .net]
まだやってるのか〜
ファイルの ^M が問題みたいだから
CRLFのファイル形式に変換して上の一行野郎で問題ないみたいだったよ。

566 名前:デフォルトの名無しさん [2011/04/19(火) 03:07:46.46 .net]
#複数行の入力中、先の行の11カラム目にOUTが含まれているかつ次の行の11カラム目にINが含まれている2行が揃った時、2行を出力
$11~/OUT/{ prev=$0; }
$11~/IN/{
if(prev!=""){ print prev; print; }
prev="";
}


567 名前:デフォルトの名無しさん [2011/04/19(火) 15:55:50.78 .net]
# 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です・・


568 名前:デフォルトの名無しさん mailto:sage [2011/04/19(火) 16:30:51.01 .net]
俺の手元のgawk 3.1.7では期待通りの結果になるなあ。

行末がらみだと改行コードが違ってたり見えない空白が
入ってたりというのがよくあるので確認してみ。

569 名前:デフォルトの名無しさん mailto:sage [2011/04/19(火) 16:32:43.45 .net]
>>560
あと

/^>'=+/

ってキャプチャとかしてるわけじゃないから+は無駄じゃないか。


570 名前:デフォルトの名無しさん [2011/04/19(火) 16:45:20.75 .net]
>>561
ありがとうございました。改行コードをunix形式にしたら出来ました。
今後ともよろしくお願い致します。

571 名前:デフォルトの名無しさん [2011/04/19(火) 17:00:39.34 .net]
>>559

INがあるときにしかprevがクリアされていないから、OUTが出現した以降に
複数行が経過してもINが出現するとprintされるスクリプトになっているよ。




572 名前:559 mailto:sage [2011/04/20(水) 01:08:11.06 .net]
okwave.jp/qa/q6672025.html
とかの入力をイメージしてたもので...

$11~/OUT/{ prev=$0; }
$11~/IN/{
if(prev!=""){ print prev; print; }
}
$11!~/OUT/{ prev=""; }


573 名前:デフォルトの名無しさん [2011/05/01(日) 16:22:39.39 .net]
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; }

574 名前:デフォルトの名無しさん mailto:sage [2011/05/01(日) 19:40:09.87 .net]
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
}
}


575 名前:デフォルトの名無しさん [2011/05/03(火) 14:58:05.53 .net]
間違ってるよ
しかも長くて美しくないよ

576 名前:デフォルトの名無しさん mailto:sage [2011/05/03(火) 15:13:19.32 .net]
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];
 }
}
-----

577 名前:デフォルトの名無しさん mailto:sage [2011/05/03(火) 15:33:28.80 .net]
>>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])
}
}

578 名前:デフォルトの名無しさん mailto:sage [2011/05/03(火) 16:12:56.67 .net]
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;
    }
}

579 名前:デフォルトの名無しさん mailto:sage [2011/05/03(火) 16:20:05.55 .net]
>>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; }
-----

580 名前: 忍法帖【Lv=40,xxxPT】 【東電 76.6 %】 株価【E】 mailto:sage [2011/05/04(水) 17:32:38.53 .net]
ヘックション

581 名前:デフォルトの名無しさん mailto:sage [2011/05/06(金) 00:54:22.24 .net]
$ 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の整数って上限あるの?(ウチだけか?)



582 名前:デフォルトの名無しさん mailto:sage [2011/05/06(金) 01:09:59.27 .net]
long double辺りの精度しかないよ。

583 名前:デフォルトの名無しさん [2011/05/06(金) 09:18:39.10 .net]
>>574
おれのPCでは普通に 1 から 1e+048 まで表示されますが。。。

584 名前: 忍法帖【Lv=25,xxxPT】 mailto:sage [2011/05/06(金) 09:54:18.77 .net]
ideone.com/QpAMD

585 名前:デフォルトの名無しさん mailto:sage [2011/05/06(金) 11:30:10.09 .net]
>>576
本当ですか!よろしければ環境を教えてください。

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

POSIXで保障されてる精度は>>575ってこと?
てことは、awkは内部では、全ての数がdouble扱いなの?

586 名前:デフォルトの名無しさん [2011/05/06(金) 14:20:04.87 .net]
>>578
576です。WindowsXP + GNU Awk 3.0.6 + multi-byte extension 1.15 です。


587 名前:デフォルトの名無しさん mailto:sage [2011/05/06(金) 18:58:28.81 .net]
>>579
ありがとう。
あまり違いがないな。Win7は関係ないだろうし。
multi-byte extensionがその辺りも弄っているのか…

そういえば、1e+048みたいな指数で表示されるの?
出力のとき丸めるから、ちゃんと計算できてるように見えるのかな。

588 名前:デフォルトの名無しさん mailto:sage [2011/05/06(金) 23:07:48.20 .net]
awkでは数値はすべてdoubleで扱います。
ですからその精度である53bit分、大体15桁ちょっとを超えると正確な値を保持できません。

23桁あたりまで正しく表示できてるってのはよくわかりませんが、
3.0.6にしても出力時の書式指定が違うだけで内部的には同じように不正確な値に
なってしまってると思います。


589 名前:デフォルトの名無しさん mailto:sage [2011/05/07(土) 01:38:55.53 .net]
だから、実質long doubleの精度になっているんだってば。

590 名前:デフォルトの名無しさん mailto:sage [2011/05/07(土) 11:11:15.94 .net]
>>582
「実質」というのはどういう意味?

#define AWKNUM double

ってのがあるし、long double にしても仮数部は64bitだから23桁には足りないよ?
x87のレベルで拡張精度になってても、表示やらなんやらするところで倍精度に
丸められちゃうと思うんだけど。


591 名前:デフォルトの名無しさん mailto:sage [2011/05/07(土) 13:09:06.68 .net]
codepad.org/4GaxJcGp
完全に一致。どう見ても double です。本当にありがとうございました



592 名前:デフォルトの名無しさん mailto:sage [2011/05/07(土) 21:19:09.46 .net]
>>581
あう、そうなのかー。ありがとうございます。困ったなぁ。
10進で実数扱えとまでは言わないけど、整数は欲しい。
数をいろんな型で扱える処理系なんてないか。

593 名前:デフォルトの名無しさん mailto:sage [2011/05/07(土) 23:01:38.63 .net]
>>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にしてビット数を数えてみればわかるでしょ。

594 名前:デフォルトの名無しさん mailto:sage [2011/05/09(月) 21:13:05.37 .net]
gawkのユーザガイドに、他の処理系では、標準エラーを使うため、
 print "Serious error detected!" | "cat 1>&2"
という方法しかないとあります。
gawkは/dev/stderrを特別に扱うため、
 print "Serious error detected!" > "/dev/stderr"
と書くのが適切とあります。

これには、どのような違いがあるのでしょうか?
/dev/stderrがあるOSなら、catのプロセスが生成される他は、違いはないのでしょうか?
環境や処理系を問わず動作させたいなら、上の書き方の方がよいのか、気になっています。

よろしくお願いします。

595 名前:デフォルトの名無しさん mailto:sage [2011/05/10(火) 00:17:11.81 .net]
他の処理系って、他のawkって事だよ。

/dev/stderrがあるOSって事ぢゃなくて、
gawkは特殊なファイル名として/dev/stderrとか使えるよ、って事だよ。

なので他のOSでも gawk だったらprintとかの出力先ファイル名として /dev/stderr 使えるって話だね。
/dev/stderrとかをサポートしていないgawk以外のawkでも動作させるなら パイプと"cat 1>&2"を使う方法しかない。が、Win系はcatだと...

596 名前:デフォルトの名無しさん mailto:sage [2011/05/10(火) 09:20:21.36 .net]
そこまでのことをするならPerl/Ruby/Python等のちゃんとした
スクリプト言語で書いた方がいいんじゃないかな。こういう
どうでもいいところで悩まなくて済むよ。

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



597 名前:デフォルトの名無しさん mailto:sage [2011/05/10(火) 14:35:51.09 .net]
>>589
そう、それが楽しいんだ

598 名前:デフォルトの名無しさん mailto:sage [2011/05/11(水) 00:36:20.77 .net]
>>588
ありがとうございます。
catがない環境だと、どうしようもないですね…

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

ちなみに、2時間半以上かかっていた処理が、1分以内に短縮されました。
ワラタ。   ワラタ…

599 名前:デフォルトの名無しさん mailto:sage [2011/05/11(水) 10:19:43.16 .net]
Cで書き直したら数秒で実行完了の予感w

600 名前:デフォルトの名無しさん mailto:sage [2011/05/11(水) 12:14:45.46 .net]
つーてもawkとかその他のスクリプトでサクッと書けるような文字列処理を
C言語とかではあんまり書きたくならんと思うぞw

601 名前:デフォルトの名無しさん mailto:sage [2011/05/24(火) 10:19:27.54 .net]
なりません



602 名前:デフォルトの名無しさん mailto:sage [2011/05/25(水) 20:17:22.02 .net]
あぁああぁぁぁ〜〜〜無理だったか、、無理なのかー!a[0][0] = 1 → syntax error

603 名前:デフォルトの名無しさん mailto:sage [2011/05/25(水) 21:58:46.38 .net]
>>595
gawkの場合インデックスをSUBSEP(=\034がデフォルト)を挟んでシリアライズしたインデックスで多次元配列を表現する
a[0,0] = 1;
ならOKのはず。このときのインデックスは"0\0340"だから、a["0\0340"] == 1。

604 名前:デフォルトの名無しさん mailto:sage [2011/05/26(木) 18:46:04.99 .net]
>>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の配列って処理系によっては添え字が整数の場合、処理が最適化されて早くなったりするのかな?
構造体の代わりみたいに使いたかったのだが。

605 名前:デフォルトの名無しさん mailto:sage [2011/05/27(金) 00:57:28.69 .net]
name["god"] = "Kaname Madoka"
msg["god"] = "Mahoushoujo ha watashi dakede juubun dayo."
name["homerun"] = "Akemi Homura"
msg["homerun"] = "Madoka ha watashi no yome."

でよくね?

606 名前:デフォルトの名無しさん mailto:sage [2011/05/30(月) 21:25:51.88 .net]
awkって *どの実装でも* 一度も使ったことがない変数の内容って、スカラなら0か""になってるの?
変数が一度も代入されていないことを判定するために、(x==0 && x=="")って書いて何か問題ない?

607 名前:デフォルトの名無しさん mailto:sage [2011/05/30(月) 21:31:52.21 .net]
>>599
評価されるときに変数が存在しなければ作成される。はず
配列の要素なら in で調べられるけど
変数自体となるとどうだろうね

608 名前:デフォルトの名無しさん mailto:sage [2011/05/30(月) 21:32:47.76 .net]
>>599
何度も代入した後、最後に 0 or "" を代入した変数と区別できない。

609 名前:デフォルトの名無しさん mailto:sage [2011/05/30(月) 23:19:06.92 .net]
>>600-601
ありがとう。区別できないって、どういう状態になるの?0を代入したら0か"0"に評価される。
ああ、""を代入したら0か""に評価されて駄目ってことか!?

610 名前:デフォルトの名無しさん mailto:sage [2011/05/31(火) 00:05:27.97 .net]
あれ?試したらどっちを代入しても599の式は0に評価されたよ。区別できないケースってどういう場合?

611 名前:デフォルトの名無しさん mailto:sage [2011/05/31(火) 06:28:27.99 .net]
BEGIN {
    # 初期化直後 (未使用) の変数は数値 (0) と文字列 ("") の両方の型を持つ。
    print x == 0, x == ""; # 両方とも真

    x = 0;
    print x == 0, x == ""; # 前者のみ真。

    x = "";
    print x == 0, x == ""; # 後者のみ真。

    # 他の未使用の変数を代入すると "再初期化" できる。
    x = y;
    print x == 0, x == ""; # 両方とも真。
}



612 名前:デフォルトの名無しさん mailto:sage [2011/05/31(火) 22:57:53.71 .net]
> 初期化直後 (未使用) の変数は数値 (0) と文字列 ("") の両方の型を持つ。
IEEE Std 1003.1 の awk の EXTENDED DESCRIPTION の
Variables and Special Variables に書いてあるね。 uninitialized value というらしい。
POSIXに準拠してるawkならこうなるみたいだけど、オリジナルは知らん。

再初期化するなら$(NF+1)使うほうがいいかもね。未使用の変数を用意しなくていい。
だけど、それが必要な場面が思い浮かばないが。

関係ないけど、abs関数ってないんだね。別に良いけど、πや、
0より大きい最小の浮動小数点数は定義しててほしいなあ。

613 名前:デフォルトの名無しさん mailto:sage [2011/06/02(木) 10:09:14.37 .net]
>>605
> 再初期化するなら$(NF+1)使うほうがいいかもね。未使用の変数を用意しなくていい。
フィールド変数は常に文字列型で、 数値型は持たない。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<292KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef