11/06/15 21:51:26.93 .net
>>611
遅レスだが、型_内容の説明_名前みたくしてる。名前が一文字だとそのままだけど。
グローバル変数とローカル変数のどっち弄ってるのか分かりやすいように、ローカル変数は必ずlで始めるようにしてる。
d_per_shouhizei = 5.0とかね。
615:デフォルトの名無しさん
11/06/20 18:37:26.17 .net
gawkでBINMODEを設定すればバイナリーの入出力ができるのはわかるのですが、
入力されたバイナリーを16進ダンプして表示するにはどうしたらよいでしょうか?
od等の外部コマンドを使う意外に方法があればお教えください。
616:デフォルトの名無しさん
11/06/20 19:17:07.50 .net
printf("%02x\n", $1);
617:天使 ◆uL5esZLBSE
11/07/05 00:15:13.83 .net
二度と話かけんなよ
お前らってどうみてもゴミだよな
618:デフォルトの名無しさん
11/07/06 14:04:55.24 .net
ゴミんなさい
619:デフォルトの名無しさん
11/07/14 23:55:15.84 .net
>>595
gawk4.0.0でa[0][0]=1も可能になったじゃないか
620:デフォルトの名無しさん
11/07/30 19:46:15.81 .net
超初心者の質問で申し訳ありません。以下のようなデータを
aaa 10
bbb 20
ccc 30
aaa 30
bbb 30
aaa 15
ccc 30
ddd 20
以下のようにまとめたいのですが、どうしたらいいでしょうか?
aaa 55
bbb 50
ccc 60
ddd 25
621:デフォルトの名無しさん
11/07/30 19:53:38.97 .net
ddd 20 ではないかと思うがこんな感じかな
awk '{a[$1]+=$2} END {for (b in a) {print b " " a[b]}}' | sort
622:デフォルトの名無しさん
11/07/30 23:15:27.52 .net
Gawk4ならPROCINFO["sorted_in"]の設定で最後のsortが要らなくなる
623:620
11/07/30 23:22:20.03 .net
>621
ありがとうございます!うまくいきました。
624:デフォルトの名無しさん
11/07/31 15:24:48.76 .net
gawkはもう別言語なイメージ。普段mawk使ってると
625:デフォルトの名無しさん
11/08/16 22:48:21.64 .net
ここって生きてますか?
626:デフォルトの名無しさん
11/08/18 01:56:26.63 .net
生きてますん
627:デフォルトの名無しさん
11/08/19 00:53:44.39 .net
生きていることを願って質問を。
WIN32のEXE一つで、下のTEST.AWKがマトモに動くAWKを探しています。
これら以外にありますか?
URLリンク(hinadori.atnifty.com)
URLリンク(my.vector.co.jp)
URLリンク(my.vector.co.jp)
Cygwin版も試したのですがダメでした。
TEST.AWK
{ gsub("[0-9]","x",$0) ; gsub("ソ","ソ",$0) ; gsub("T","T",$0) ; print }
TEST.DAT
アイウエオカキクケコサシスセソ
ココココサフサコココココ
ココココサフサココココ
ココココサフサコココココ
ココココサフサコココココ
サフサフサフサフサフサ
ココココサフサコココココ
ココココサフサココココ
ココココサフサコココココ
ココココサフサコココココ
サフサフサフサフサフサ
628:627
11/08/19 01:00:20.60 .net
TEST.DATは、空白が入っています。
専ブラのポップアップをコピペして下さい。
629:デフォルトの名無しさん
11/08/19 06:26:54.92 .net
ウチに帰ってから調べてみるよ
630:デフォルトの名無しさん
11/08/19 11:02:41.54 .net
>>627-628
cygwinのawk(GNU Awk 3.1.8)で動くけど、どうなるはずがどう動かないと言っている?
>627のtest.datなら、当然「ソ」だけが変換されるけど。
631:デフォルトの名無しさん
11/08/19 11:55:06.25 .net
(CygwinならUTF8じゃないとうまく動かないけど)Shift JISで動作させたいってことかな?
事前にTEST.DATをnkf -wに通したら駄目かな。
632:629
11/08/19 21:59:57.43 .net
>>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やってリダイレクトしたファイルは正常な結果が出るよ。
リダイレクトしないでコマンドプロンプトに表示させると化けるけど。
633:デフォルトの名無しさん
11/08/19 23:18:25.14 .net
EUCなら半角カナもうまくやってくれるんだが…
634:デフォルトの名無しさん
11/08/24 08:07:37.54 .net
gawkはガンガン機能を拡張してるけど、
そろそろOOP対応してくれないかな。
awk++とかあるけど、標準でOOPできれは便利。
635:デフォルトの名無しさん
11/08/24 22:44:37.24 .net
> OOP
...もはやawkでやる意味が無いw 他にいくらでもある別の言語でいいじゃん
636:デフォルトの名無しさん
11/08/25 01:14:17.45 .net
awkに在ると便利かもと思うのは参照値くらいかな
配列や関数への参照を値として取り出し格納したり
逆にその値から元の配列にアクセスしたり元の関数を呼んだり出来ると
相当に複雑なデータ構造が表現可能になる、それこそOOPっぽいことも可能だし
でもあんまりややこしいことやるならPerlでいいから必須ではないね
637:デフォルトの名無しさん
11/08/25 02:28:23.99 .net
> 関数を呼んだり
変数の値を関数名として
var = "sage";
@var();
ってできるけど、それとは違うのん?
638:デフォルトの名無しさん
11/08/25 04:07:56.67 .net
およ、もうあるのかw
最近のawkは分からねえ…ってことは、配列への参照を使って入れ子の配列とか既に作れちゃったりするのか?
639:デフォルトの名無しさん
11/08/25 10:56:54.36 .net
配列の配列は作れるよ。gawk4なら。
640:デフォルトの名無しさん
11/08/25 19:51:33.84 .net
(´_ゝ`)フーン
641:デフォルトの名無しさん
11/08/25 20:52:51.07 .net
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()
}
642:641
11/08/25 20:58:10.41 .net
>>635
URLリンク(code.google.com)
これを使えばこの程度のOOPはどうにかできる。
本当にこの程度でいいからOOPに対応してほしい。
使う人はほとんどいないと思うが、全くできないのも困る。
643:デフォルトの名無しさん
11/08/25 22:07:53.46 .net
それは最早awkである必要が全く無い
644:デフォルトの名無しさん
11/08/26 06:00:04.19 .net
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")
}
645:デフォルトの名無しさん
11/08/26 06:01:35.02 .net
ごめん一部genderになってるからsexに直しといて
とりあえず、こんな感じでgawk4でもOOP自体は出来るよって話
646:デフォルトの名無しさん
11/08/27 15:07:17.61 .net
>>644
なるほどねー
とても勉強になります
でも、やっぱりOOP用の構文が使えればベストですね
そのほうがわかりやすいと思います
647:デフォルトの名無しさん
11/08/27 15:58:44.09 .net
やっぱ別言語使うべきだろ
648:デフォルトの名無しさん
11/08/27 16:10:36.72 .net
本当に欲しいんなら、gawkのMLにこうすればOOP実現できることを発見したんだけど、
これの糖衣構文を用意してくれって投稿するといいんじゃね
switchも実装されてるし、欲しい人が居ると分かれば付けてくれるかもよ
649:デフォルトの名無しさん
11/08/27 16:25:08.65 .net
#! /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()
650:デフォルトの名無しさん
11/08/27 16:26:25.23 .net
pythonで書いてみると、
>>641と比べると特にわかりやすいわけでもないけど
>>644よりはわかりやすい
651:デフォルトの名無しさん
11/08/27 16:53:49.92 .net
そりゃawkはOOPLではないからな
あくまでシェルのお供でいいと思うんだ
そしてそこに高度なOOP機能は要るとは思えない
どちらかと言えばフィールド抽出とかをもっと便利にすべきだよ
652:デフォルトの名無しさん
11/09/17 15:34:39.29 .net
cygwin以外でgawk4.0をwindowsで使おうと思ったら、バイナリはどこで入手できもうすかね?
653:デフォルトの名無しさん
11/09/17 16:28:58.78 .net
cygwin で駄目な理由が分からないから教えられない。
654:デフォルトの名無しさん
11/09/18 08:02:36.95 .net
>>652
つURLリンク(www.klabaster.com)
655:デフォルトの名無しさん
11/09/19 13:00:55.06 .net
>654 さんくすこ
>653 awkの実行形式だけ入手すれば良いようにしたいのさ。
656:デフォルトの名無しさん
11/09/19 14:01:43.39 .net
バイナリ互換のWindowsなのに、cygwinてexeをもってくだけじゃ使えないの?
657:デフォルトの名無しさん
11/09/19 16:07:37.39 .net
物によっては使えたような気がする。
cygwin1.dllだっけ?にパスが通ってれば大体使えたような気がする。
658:デフォルトの名無しさん
11/09/19 17:00:12.76 .net
結構沢山のdllが要るよ
コマンドによるけど
659:デフォルトの名無しさん
11/10/24 01:55:49.24 .net
教えてください。英語得意な人
URLリンク(www.gnu.org)
の asort(), asorti()で使うユーザー定義の比較関数について
3番目の引数とPROCINFO["sorted_in"]に設定するのと違うのか同じなのか?
それと
URLリンク(www.gnu.org)
に書いてある3番目の引数の説明("descending"とか)が両立してんの?
660:デフォルトの名無しさん
11/10/24 11:34:13.18 .net
URLリンク(www.gnu.org)
As with PROCINFO["sorted_in"], this argument may be the name of a user-defined function, ....
URLリンク(www.gnu.org)
The third argument can also be a user-defined function name ....
第三引数の値と同名の関数が定義済みならそれを利用するとか、
そういう方法で区別してるんじゃないの
661:デフォルトの名無しさん
11/10/24 13:33:04.59 .net
>>659
比較関数の与え方はPROCINFO["sorted_in"]の場合と同じってことだろ。
自分で定義した関数の名前でもいいし、11.2.1.2に書いてあるようにすでに用意
されている@~を使ってもいい。
662:デフォルトの名無しさん
11/11/14 21:59:05.28 .net
個人的には、GAWKにはあと、Cで書いた関数の呼び出しというか
GAWKで呼ぶ関数をCで書ける機能が欲しいと思ってるんだけど、
ここ見る限り世間的にはあんまり需要ないんかねぇ。
まぁ、それやるくらいならGAWK自体に変更を加えて再コンパイルしろってことかもしれないけど。
663:デフォルトの名無しさん
11/11/15 01:44:31.01 .net
PとかR使え言われると思う。
664:デフォルトの名無しさん
11/11/15 01:58:32.43 .net
>>662
URLリンク(www.gnu.org)
じゃダメ?将来的にさらに拡張される可能性はあるみたいだけど
665:デフォルトの名無しさん
11/12/09 00:35:09.18 .net
最近awkcardを知って座右に置いてるのだが、日本語版って存在するのだろうか。
666:デフォルトの名無しさん
11/12/22 16:57:35.32 .net
URLリンク(gauc.no-ip.org)
ここに書いてある通りにしても日本語に翻訳されません
どうしてですか?
環境は LinuxMint12 、 GNU Awk 3.1.8 です
667:デフォルトの名無しさん
11/12/22 18:01:49.60 .net
>>666
その通りにやったと言うのなら、何故poファイルを提示しないのかね、ダミアン君。
668:デフォルトの名無しさん
11/12/22 18:07:45.38 .net
>>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
669:デフォルトの名無しさん
11/12/22 18:10:02.43 .net
結果はこの通りです。
$ 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.
670:デフォルトの名無しさん
12/01/12 13:56:36.33 .net
ずいぶんawkから離れていて久しぶりに使ったら
nawkに日本語のバグがあることにしばらく気づかなかった
substr()でutf-8のテキストを切り出すとおかしな値になる
gawkでは直っている
671:デフォルトの名無しさん
12/01/12 19:50:49.28 .net
そもそもUTF-8に対応してたっけ
672:デフォルトの名無しさん
12/01/13 00:28:07.37 .net
URLリンク(blog.livedoor.jp)
残念ながら、シフトJIS、UTF-8両方で正常に動作しそうなWindows版gawkは候補の中にありませんでした。
673:デフォルトの名無しさん
12/01/13 07:52:50.95 .net
Linuxでは普通に動くが…
674:デフォルトの名無しさん
12/04/29 21:07:39.93 .net
ファイル名が"*.txt"の一覧を取得するとき、"\.txt"でマッチさせると、任意の一文字.(ドット)と解釈されてしまうんですが、いい方法無いでしょうか?
675:デフォルトの名無しさん
12/04/29 22:04:14.36 .net
GNU Awk 3.1.7だとドットにマッチしたけどそもそもawkの話?
具体的にコマンドがほしいな
676:デフォルトの名無しさん
12/04/29 22:08:23.01 .net
昭和の頃覚えたアセンブラとC言語
これがあったから
いまだに自分が損な業界で飯を食ってる
677:デフォルトの名無しさん
12/04/29 22:36:10.83 .net
>>676
そこからjavaに行ってスマホアプリ開発ならもう一花咲いたかもしれませんねw
678:デフォルトの名無しさん
12/04/29 23:09:38.43 .net
馬鹿には無理
679:674
12/04/30 18:07:43.22 .net
>>675
ls | awk '{ if( match($0,"\.txt") > 0) print $0 }'
↑会社のサーバ上でこんな感じのことやろうとしてたんですが、
「gawk: 警告: エスケープシーケンス `\.' は `.' と同等に扱われます」
とメッセージが出力され、ドットが任意の一文字?と解釈されて困っていましたが、
自己解決しました。(自宅のLinuxPCで動作確認しました。GAWK3.1.7及び4.0.1)
"\.txt"では無くて、".txt"で良かったんですね。
お騒がせしました。
もしかしたら、会社のサーバ(RHEL)のGAWKが古くて解決できてないかもしれませんが。
680:デフォルトの名無しさん
12/04/30 20:27:16.48 .net
>>679
match() の第二引数に文字列を与えた場合は事前に正規表現への型変換が行われるが、
その際にエスケープが外れて /.txt/ と同等になってしまう、 ということかと。
つまり "\\.txt" とするか、 正規表現の /\.txt/ を与えればよい。
The GNU Awk User's Guide にもこの現象についての説明はあるが、
~ !~ 演算子についてしか触れられていない。
URLリンク(www.kt.rim.or.jp)
681:デフォルトの名無しさん
12/05/24 00:27:31.74 .net
gawk4.0.2付属の原版ではmatchの説明にもその辺触れられてるね。
URLリンク(www.gnu.org)
誰かこのバージョン日本語化してないかな。
682:デフォルトの名無しさん
12/07/12 02:26:40.35 .net
FIFOな感じの先入れ先出しのバッファには何使えばいい?
というか、
Arrayで、たとえばA[3] からA[8]までのデータをA[1]からA[6]に動かすには何が一番早い?
できれば配列は1つしか使いたくないのだが、無理だろうか…
683:デフォルトの名無しさん
12/07/12 09:23:22.92 .net
速さを求めるなら毎度全要素ずらすより、読み出し位置と書き込み位置の添字持って
管理した方がたいてい速い
684:デフォルトの名無しさん
12/07/12 10:14:32.78 .net
awkには連想配列しかないしな
685:デフォルトの名無しさん
12/07/14 14:35:06.22 .net
リングバッファで何とかなるならリングバッファかな
686:デフォルトの名無しさん
12/07/14 22:27:17.73 .net
>>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;
}
687:686
12/07/14 22:54:06.64 .net
↑の結果はこんな感じ。
>からっぽ
>1
>おなかいっぱい
>a
>b
>c
>からっぽ
>>685の書いているリングバッファ実装です。
enqueue,dequeue回数が多いならリングバッファで良いと思う。
大抵の場合はQMAXに大きな値を設定すれば事足りるハズだけど
上限が決定できない等の事情があればdelete arrayを使った単純な配列管理かな。
ただ添え字が数値上限を超えない様な工夫は必要だね。
688:デフォルトの名無しさん
12/07/15 21:09:36.15 .net
リングでも上限を定めると入力ストリームの上限が不明な場合まずいことになるので、現在は
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]に合計が記載。
これ以上(コードサイズ、ある程度の速度、メモリの使用量を極力少なく)という条件で最適化できるだろうか…
だれか頼む。
入力と出力先が同じでも、別でも作動するコードなら尚のこと良いのだが…
689:デフォルトの名無しさん
12/07/17 00:02:18.87 .net
これはひどい
デバッグも拡張も無理じゃね
690:デフォルトの名無しさん
12/07/17 22:03:00.62 .net
基本的に一度作って後は必要に応じてコピペだがらな。他には
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が半分死んでいてもなんとか動くし。
691:686
12/07/21 23:12:03.74 .net
>>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];
}
692:686
12/07/21 23:44:24.03 .net
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。
これで良い?
693:688
12/07/22 09:36:17.43 .net
>QMAX=9007199254740991
ワロタwww
俺のも確かにwhile(C[p+=1]=C[n+=1]);の部分で保持してるのすべて消費分だけ上に移動させてるのが無駄なので
そのループが無い分は確かに早いはず。
あと、恥ずかしながら尋ねたいのですが、俺>>688の実装で上限超えたらバグるをkwsk
なんか見落としてたのか今更ながら心配になってきた。
昔作ったやつなんで、結構な頻度使ってきたのだが今までバグに気づかなかった
しかしデータをメモリ上に展開するからどうしても上限が出てくるな…
awkで10GBぐらいの扱う時はgetlineでなんとかなるけど、やはりメモリマップやポインタが使えたら便利だよなぁ
パッチ作ったら需要あるかな?
694:デフォルトの名無しさん
12/07/22 11:41:46.83 .net
>>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する事は事実上無いし、
仮に発生しても検索結果が潰れるだけで、気付かない筈。
695:688
12/07/22 13:39:49.16 .net
>9007199254740992
理論上、8192ペタバイトの同じデータ[aaa...]でregexp="."とすれば、発生するな…
IEEE 754の52bit制限だから、これ以上のでかい数字扱うならbig numbert対応のライブラリか,
"bc -q" |& で動かすか、xgawk、dnawkあたり使うべきだなぁ
昔誰かがbignumのawkスクリプト書いて放流していた覚えがあるのだが、
ググッても見つからん。手元にあるのはビット演算のやつだけだわ
いつかそれだけのデータをメモリ上に保持できるマシンを扱ってみたいものだ…
696:デフォルトの名無しさん
12/08/03 02:35:23.75 .net
awkってabsとかacosなどの基本的な算術関数が用意されてないんですね
今後も実装されることはないんでしょうか?
パイプでサクッとつないでワンラインで処理するのに重宝してたんですが・・・
代わりとなると、何使うのがよろしいですか?
できればperlは使いたくないです(どうしても好きになれない
697:デフォルトの名無しさん
12/08/03 06:48:38.25 .net
absは自分で書けばいいし、acos(x)はatan2(x, √(1.0 - x*x))と書けるから、
どちらも基本的ではないと判断して組み込みじゃないんだと思うけど。
PythonかRubyでいいんじゃない? ワンライナー向きではないけど。
698:デフォルトの名無しさん
12/08/03 07:37:24.41 .net
>>696
ライブラリ(?)を拾って来ては?
699:デフォルトの名無しさん
12/08/03 11:48:03.19 .net
>>696
必要な関数値を計算するだけのプログラムをCで作っておいたら?
700:デフォルトの名無しさん
12/08/03 20:21:59.43 .net
昔それでベクトル演算して遊んだな
701:デフォルトの名無しさん
12/08/04 09:23:47.83 .net
Rubyはそこそこワンライナーも書ける感じがする、awkやPerlほどじゃないけどね
Pythonは流石にコード起こさないと辛いことが多いが
702:デフォルトの名無しさん
12/08/04 10:27:49.07 .net
awkでmatlabみたいなベクトル演算できるようにしてほしい
703:デフォルトの名無しさん
12/08/04 16:48:36.10 .net
awkでクラスを使えるようにしてほしい
704:デフォルトの名無しさん
12/08/04 17:06:19.06 .net
awkで全ての魔法少女を救ってほしい
705:デフォルトの名無しさん
12/08/04 17:08:30.07 .net
awkさんは魔女
706:本田
12/08/05 07:21:28.03 .net
Awk++
URLリンク(awk.info)
OO in AWK++
The awk++ language provides object oriented programming for AWK that includes:
classes
class properties (persistent object variables)
methods
inheritance, including multiple inheritance
URLリンク(lawker.googlecode.com)
707:デフォルトの名無しさん
12/08/05 09:56:26.63 .net
デバッグ大変過ぎて死ぬる
$ 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 '?' は不正です。
708:デフォルトの名無しさん
12/08/22 00:09:49.86 .net
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;
}
これ以上削れるところ無いかな?
高速化+サイズ優先で、変数はできるだけ使う数を少なくとの条件で
709:デフォルトの名無しさん
12/08/22 09:51:11.01 .net
>>708
その3つの条件の優先度がわからんな。
結構同じ部分式があるので変数に入れた方が変数は増えるけど短くなるし
場合によっては速度も速いとかありそうだけどどうなん?
例えばB[0]は特別な用途っぽいけどxとか1文字変数にしてreturnの直前に
書き戻した方が文字数は稼げる。
あと細かいがhoge+=1より++hogeの方が1文字短いとか、いらない「;」が
残ってるとか詰めが甘いところがまだあるね。
710:デフォルトの名無しさん
12/09/30 22:45:00.64 .net
以下のようなデータの処理について質問いいでしょうか。
$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
711:デフォルトの名無しさん
12/10/01 11:28:30.42 .net
疑問を提示。
$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になるんだけどね。
712:デフォルトの名無しさん
12/10/01 13:21:34.21 .net
実装してみた。速度が途中に出てきてもいいように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;
}
713:デフォルトの名無しさん
12/10/01 20:30:33.48 .net
>>711
すみません、前者ですね。なんだろう、恥ずかしい。
>>712
なので、アクション部の / を * に変えればよさそうです。
お二方、ありがとうございます。
714:デフォルトの名無しさん
12/12/13 11:40:43.98 .net
awkにかわる同等のものあります?
715:デフォルトの名無しさん
12/12/13 13:08:08.26 .net
python
716:デフォルトの名無しさん
12/12/13 13:13:55.85 .net
>>715
awkみたいに使い勝手いいのかな?
717:デフォルトの名無しさん
12/12/13 13:18:24.65 .net
良いですよ
718:デフォルトの名無しさん
12/12/13 13:24:31.23 .net
>>717
ありがとす。勉強してみます
719:デフォルトの名無しさん
12/12/13 14:45:25.45 .net
はい
720:デフォルトの名無しさん
13/02/06 03:49:18.86 .net
“任意の記号”を含んだシェル変数を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自体は渡されているはずですが、何が原因でしょうか?
721:デフォルトの名無しさん
13/02/06 11:23:41.42 .net
>>720
いちぎょうめのひだりがわの var は、ひょうかのさいに
せいきひょうげんへのかたへんかんがおこなわれる。
$0 ~ /hoge$fuga/ {print "hoge$fuga"}
END {print "hoge$fuga"}
めたもじとなってしまうものは、じぜんあるいはこーどのなかで
えすけーぷするひつようがある。
722:デフォルトの名無しさん
13/02/06 11:29:22.31 .net
~(チルダ)の右辺は正規表現として解釈されるから、"hoge" ~ /hoge$fuga/ でマッチするわけがない。
逆に寧ろ、"hoge$fuga" ~ /hoge/ ならマッチする。
723:デフォルトの名無しさん
13/02/06 11:33:09.61 .net
>>720
>721も>722もどちらも原因。やりたいことをよく整理しよう。
724:720
13/02/06 15:09:21.72 .net
すいません、echo "hoge"ではなくecho "$var"でした。
ただ、結果は>>720と同じです。
要は入力ファイル内の「メタ文字込みの任意の文字列」を、別の「メタ文字と改行込みの任意の文字列」で置換する、
というのをメタ文字のエスケープ等の面倒な処理をせずにサクッとやりたいのですが、できますか?
725:デフォルトの名無しさん
13/02/07 05:01:43.19 .net
ムリ
予め「メタ文字と言っても $ しか出てこない」とか判ってるなら大したこと無いけど
一般化すればするほど面倒になる
726:720
13/02/07 22:14:56.21 .net
>>725
やはりそうですか。
今までこういった処理はsedでしこしこエスケープしてやってたんですが、いい加減面倒になったので、
たとえばfgrepみたいに正規表現をオフにして処理する方法はないかと探しているんですが、
awkでは無理ですか・・・。
727:デフォルトの名無しさん
13/02/08 11:20:14.98 .net
>>726
単に一致なら正規表現なんか使わずに比較すればいいじゃん。
fgrepで事が足りるのならawkからfgrepを起動すればいいじゃん。
728:デフォルトの名無しさん
13/02/08 19:27:47.04 .net
>>726
fgrepなら index()関数じゃないの?
729:720
13/02/09 15:32:27.55 .net
>>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
730:デフォルトの名無しさん
13/02/09 17:49:52.25 .net
/bin/shでごちょごちょやるのが好みなら、awkもfgrepも使わず、case文でやりゃいいんじゃないの。
731:デフォルトの名無しさん
13/02/09 21:34:09.39 .net
>>729
文字列の比較は等号でできるって認識はないの?
732:デフォルトの名無しさん
13/02/10 14:31:49.57 .net
>729
いや、その方法でも結局 ' はエスケープが必要でしょ。
ダイレクトにシェル変数に入れる方法か、
ファイルなどに吐き出しておく方法の方が安定。
まぁそれでも改行とか制御文字入れられるともにょる場合があるけどな。
733:デフォルトの名無しさん
13/02/11 20:15:01.17 .net
そこまでめんどくさくなったらperlとかrubyとか使った方が楽だぞw
734:デフォルトの名無しさん
13/02/11 22:46:25.57 .net
何で gawk -f とか使わずワンライナーに拘るのかねぇ
735:デフォルトの名無しさん
13/02/12 22:00:38.07 .net
>>732
中韓ファイルを作るのは情弱の仕事(ドヤ顔
>>734
ワンライナーディスってんの?
736:デフォルトの名無しさん
13/03/11 10:05:12.56 .net
#
# text converter ( Mac to MS-DOS on Windos/MS-DOS machine)
# convert CR to CR+LF
#
BEGIN{ RS = "\r" }
{ print }
737:デフォルトの名無しさん
13/03/15 08:05:25.28 .net
#
# Line(行数)を数える
#
END { FNR }
738:デフォルトの名無しさん
13/03/20 19:07:17.00 .net
# 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>")
}
739:UNIX(LF) to DOS(CR+LF) conversion
13/03/21 21:15:00.86 .net
awk 1 infile1 > outfile2.txt
740:デフォルトの名無しさん
13/03/21 22:10:08.07 .net
# 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
}
741:デフォルトの名無しさん
13/03/21 22:11:11.39 .net
# >>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
}
742:デフォルトの名無しさん
13/03/21 22:12:57.08 .net
function produce_string(a, size, g, i) {
743:grepをawkで
13/03/22 13:32:02.74 .net
# usage: awk -f grep.awk char1 file1 file2
BEGIN{
pattern = ARGV[1]
ARGV[1] = ""
}
$0 ~ pattern {print($0" File name=" FILENAME)}
744:デフォルトの名無しさん
13/11/30 12:16:25.95 .net
$ echo 10 20 30 | awk '{for(i=0;i<4;)print _$++i}'
10
20
30
_$++iでも$++iでもどちらでもいけるのですが、アンダースコアが付いて何故大丈夫なのでしょうか?
745:デフォルトの名無しさん
13/11/30 16:04:55.55 .net
すいません、わかりました
空の変数_と$++iの結果が一緒になってただけなんですね
746:デフォルトの名無しさん
13/11/30 20:37:58.81 .net
単に式を並べると文字列連結になる、の罠か
747:デフォルトの名無しさん
14/04/02 00:10:13.15 T3/5Epfc.net
保守
てか半年近く書き込みが無かったか
748:デフォルトの名無しさん
14/04/19 13:45:38.45 Db2IzPol.net
とあるgawkスクリプトの先頭で
{last_hoge=hoge; hoge=$ 3}
ってやってるんだけど、
hoge=$ 3はhoge=$3の間違い? それともこういう記法がある?
749:デフォルトの名無しさん
14/04/19 14:56:08.53 A73fEYrr.net
>>748
$ は演算子だから、a=b+1をa = b + 1と書くようなものかな。
750:デフォルトの名無しさん
14/04/19 21:10:32.64 Db2IzPol.net
ええー 演算子だったのかあ。衝撃の事実
751:デフォルトの名無しさん
14/04/20 12:36:45.70 SQaIR8ej.net
演算子だから、変数でもいいよ。
752:デフォルトの名無しさん
14/04/20 14:34:12.09 YSeiuWKu.net
式が書けるね。
$ は一番優先順位が高いから、かっこで括らにゃいかんが。
753:デフォルトの名無しさん
14/04/20 15:12:13.25 k3tDznaJ.net
今はじめて知った。haskellの$は演算子だって知ってたけど、awkでも演算子だったんだね。
754:デフォルトの名無しさん
14/10/14 13:37:28.35 cBz5RbAX.net
そして半年近く書き込みが無かった
755:デフォルトの名無しさん
14/10/15 03:28:03.90 SS4U/DMU.net
いやawkスレなんて普段はそんなに話題ないだろ
756:デフォルトの名無しさん
14/10/21 15:46:10.36 TQsAGJgk.net
質問させてください
今ディレクトリ内のファイルの名称とサイズのリストを作りたいと思っています
コマンドとしてはls -lを実行していますがこれをさらにawkにパイプしています
ただしファイル名にスペースが含まれているため以下のような苦肉の策をとっておりますが
ls -l | awk '{print $5 "\t" $9$10$11$12$13$14$15$16$17$18$19}'
10個以上で区切られてる可能性もあるため根本的な対応をしたいと考えていますが
よい案はありますでしょうか
757:デフォルトの名無しさん
14/10/21 17:25:55.68 EsuQiv22.net
# ファイル名に「"」が含まれていたら知らね。
ls -Ql |awk '{split($0, foo, "\x22"); print $5 "\t" foo[2]}'
758:デフォルトの名無しさん
14/10/21 23:41:50.65 stXOK2Vv.net
Qオプションは勉強になった
ls -l|awk '{s=$5;for(i=1;i<9;i++)$i="";print s"\t"$0}'
759:名無しさん@そうだ選挙に行こう
14/12/13 17:07:55.12 8LbgKkKk.net
¥034 は ” (半角)
¥035 は # (半角) でおkですか?
760:名無しさん@そうだ選挙に行こう
14/12/13 18:17:16.35 FQOeA8KF.net
>>759
いいえ違います。
761:デフォルトの名無しさん
14/12/14 00:00:31.34 7YfznIJB.net
どちらも非可読文字ですね。そしてそうなるとスレ違い。
awkと絡むのなら具体的にどうぞ。
762:デフォルトの名無しさん
15/02/03 10:36:52.13 Dvc0nyMp.net
Terastationのファイル・ホルダ名に使うとファイルレプリケーションでエラーが起こる文字があって、それを変換するバッチを生成する時にこのマイナー言語が大活躍した。
約80万件のファイルホルダ名から抽出するのに10分程度だった。