X

awkについて語るスレ $2

レス数が1000を超えています。これ以上書き込みはできません。
2011/02/16(水) 12:11:40
>>526
なるほど、そうできるのか。ありがとう。
2011/02/17(木) 01:07:36
http://www.kt.rim.or.jp/~kbk/gawk-3.1/ に置いてあった
win32用gawkがいつの間にか公開停止になっていた。

wn32のgensubが使えて日本語が扱えて、
かつexeのみで稼動するのでインストール不要なのが便利で
公私にわたって愛用していたので、非常に悲しい・・・
2011/02/17(木) 02:14:57
http://www.vector.co.jp/soft/win95/util/se376460.html
↑とは違うの?
2011/02/18(金) 11:30:36
それは少し古い.
gawk-mbcs-win32-20090920.zip が手元にあるので必要なら再配布するが?
531528
垢版 |
2011/02/19(土) 01:36:10
>>530
もし私に言ってくれているのであれば、
exeのみだけど2009/11/24版が手元にあるので、
これを使い続けようと思う。ありがとう。
2011/02/19(土) 08:18:59
俺の手元に、gawk-mbcs-win32-20091124.zip があった。
欲しい人がいて、かつ再配布に問題無いという事がわかればどっかにう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でオブジェクト指向する人も増えるかもね。
2011/02/19(土) 23:05:51.24
>>533
デフォでインストールされるawkでできる範囲のことしかやらないよ
2011/02/20(日) 00:59:51.51
同感。>デフォでできる範囲
長めのスクリプトを書いた事があったのでOOあると便利と思うけど
わざわざインストールするならperl、ruby、pythonがあるしなぁ
2011/02/22(火) 10:31:51.00
awkで書かれたawk++ってないの?
2011/03/02(水) 23:14:41.35
gawkで平仮名・カタカナの部分を抜き出したいと思ってます。
例えば「awkについて語るスレ」だったら
"について" "るスレ" を変数に入れたいのですが、いい方法ありますでしょうか?
538537
垢版 |
2011/03/02(水) 23:17:39.07
「について」と「るスレ」はそれぞれ別の変数に入れたいと思っています
2011/03/02(水) 23:27:45.29
アルファベット以外の部分だったら、アルファベットをFSに指定してwhileで回せばいいけど、
漢字も抜くのは難しいな。
それに、事実上変数は無限に生成するって事か。
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版の新しいバージョンのものでは、
正規表現として、ひらがなを ぁ-ん で、カタカナを ァ-ン で
指定できないものがあります。
たしかマルチバイト拡張で壊された。
542537
垢版 |
2011/03/03(木) 14:28:35.14
>541
まだ試してませんが、欲する文字以外を消してゴニョゴニョすればいけそうです。
>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] }
}
}
2011/03/03(木) 19:44:47.65
ボケかました
4行目は普通に
for ( i = 1; i <=c; i++) {
でOK。
2011/03/03(木) 22:55:52.84
cを残さなくとも
for (i in a){if (a[i]) print a[i]}
で間に合うような。
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
のようにまとめあげるにはどうしたらよいでしょうか?
さすがにググってコピペという訳にもいかず。。。
2011/03/07(月) 14:31:25.16
>>548
いろいろやり方はあると思うが

awk '{j=0;delete a;for(i=1;i<=NF;i++){if(!a[$i]++){$(++j)=$i}}NF=j;print}'
550デフォルトの名無しさん
垢版 |
2011/03/07(月) 14:53:42.21
ありがとうございます。
それぞれ、4つ重複データのあったものは3つに、2つのものは1つにと減ったのですが
それ以上減ってません。同じコマンドを繰り返しかけてみたのですが、変化はなかったです。

a1 a1 a1 a1
b1 b1 b1
...の部分が
a1 a1 a1
b1 b1
にはなったという意味です。
もう少しおつきあいいただけないでしょうか。。。
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
552デフォルトの名無しさん
垢版 |
2011/03/07(月) 15:14:33.26
0610005C13Rik 0610005C13Rik 0610005C13Rik
0610007C21Rik 0610007C21Rik 0610007C21Rik 0610007C21Rik 0610007C21Rik

こういう感じの文字列なんですが
a1とかb1で例えても大丈夫だったですか?
2011/03/07(月) 15:38:11.62
空白で区切られた文字列ならなんでもいいが、そのレベルの質問が
出るようじゃもうすこし基礎を勉強しないとだめかもなぁ。
2011/03/07(月) 15:50:13.69
シングルクオーテーション使用のサンプルで問題ないと言う事は〜
UNIX環境なのかな〜
555デフォルトの名無しさん
垢版 |
2011/03/07(月) 15:58:11.87
Mac OSXのターミナルを使ってます。
>>551はそのままうまく動きました。
いま昇順で手動で作業してますが、まだzを抜けることができません。
もう手がつりそうです
2011/03/07(月) 16:04:33.75
一行野郎を分解してスクリプトに組み直して弄れば動作確認出来ると思う
557デフォルトの名無しさん
垢版 |
2011/03/07(月) 16:21:10.50
いまwまできました。もうだめです。
一応、ファイルをおいてみます。。。
http://www5.puny.jp/uploader/download/1299482386.zip
パスは1234です。
2011/03/07(月) 17:18:15.93
まだやってるのか〜
ファイルの ^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="";
}
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です・・
2011/04/19(火) 16:30:51.01
俺の手元のgawk 3.1.7では期待通りの結果になるなあ。

行末がらみだと改行コードが違ってたり見えない空白が
入ってたりというのがよくあるので確認してみ。
2011/04/19(火) 16:32:43.45
>>560
あと

/^>'=+/

ってキャプチャとかしてるわけじゃないから+は無駄じゃないか。
563デフォルトの名無しさん
垢版 |
2011/04/19(火) 16:45:20.75
>>561
ありがとうございました。改行コードをunix形式にしたら出来ました。
今後ともよろしくお願い致します。
564デフォルトの名無しさん
垢版 |
2011/04/19(火) 17:00:39.34
>>559

INがあるときにしかprevがクリアされていないから、OUTが出現した以降に
複数行が経過してもINが出現するとprintされるスクリプトになっているよ。
565559
垢版 |
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=""; }
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; }
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
}
}
568デフォルトの名無しさん
垢版 |
2011/05/03(火) 14:58:05.53
間違ってるよ
しかも長くて美しくないよ
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];
 }
}
-----
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])
}
}
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;
    }
}
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; }
-----
2011/05/04(水) 17:32:38.53
ヘックション
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の整数って上限あるの?(ウチだけか?)
2011/05/06(金) 01:09:59.27
long double辺りの精度しかないよ。
576デフォルトの名無しさん
垢版 |
2011/05/06(金) 09:18:39.10
>>574
おれのPCでは普通に 1 から 1e+048 まで表示されますが。。。
2011/05/06(金) 09:54:18.77
http://ideone.com/QpAMD
2011/05/06(金) 11:30:10.09
>>576
本当ですか!よろしければ環境を教えてください。

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

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

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

23桁あたりまで正しく表示できてるってのはよくわかりませんが、
3.0.6にしても出力時の書式指定が違うだけで内部的には同じように不正確な値に
なってしまってると思います。
2011/05/07(土) 01:38:55.53
だから、実質long doubleの精度になっているんだってば。
2011/05/07(土) 11:11:15.94
>>582
「実質」というのはどういう意味?

#define AWKNUM double

ってのがあるし、long double にしても仮数部は64bitだから23桁には足りないよ?
x87のレベルで拡張精度になってても、表示やらなんやらするところで倍精度に
丸められちゃうと思うんだけど。
2011/05/07(土) 13:09:06.68
http://codepad.org/4GaxJcGp
完全に一致。どう見ても double です。本当にありがとうございました
2011/05/07(土) 21:19:09.46
>>581
あう、そうなのかー。ありがとうございます。困ったなぁ。
10進で実数扱えとまでは言わないけど、整数は欲しい。
数をいろんな型で扱える処理系なんてないか。
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にしてビット数を数えてみればわかるでしょ。
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のプロセスが生成される他は、違いはないのでしょうか?
環境や処理系を問わず動作させたいなら、上の書き方の方がよいのか、気になっています。

よろしくお願いします。
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だと...
2011/05/10(火) 09:20:21.36
そこまでのことをするならPerl/Ruby/Python等のちゃんとした
スクリプト言語で書いた方がいいんじゃないかな。こういう
どうでもいいところで悩まなくて済むよ。

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

2011/05/10(火) 14:35:51.09
>>589
そう、それが楽しいんだ
2011/05/11(水) 00:36:20.77
>>588
ありがとうございます。
catがない環境だと、どうしようもないですね…

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

ちなみに、2時間半以上かかっていた処理が、1分以内に短縮されました。
ワラタ。   ワラタ…
2011/05/11(水) 10:19:43.16
Cで書き直したら数秒で実行完了の予感w
2011/05/11(水) 12:14:45.46
つーてもawkとかその他のスクリプトでサクッと書けるような文字列処理を
C言語とかではあんまり書きたくならんと思うぞw
2011/05/24(火) 10:19:27.54
なりません
2011/05/25(水) 20:17:22.02
あぁああぁぁぁ〜〜〜無理だったか、、無理なのかー!a[0][0] = 1 → syntax error
2011/05/25(水) 21:58:46.38
>>595
gawkの場合インデックスをSUBSEP(=\034がデフォルト)を挟んでシリアライズしたインデックスで多次元配列を表現する
a[0,0] = 1;
ならOKのはず。このときのインデックスは"0\0340"だから、a["0\0340"] == 1。
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の配列って処理系によっては添え字が整数の場合、処理が最適化されて早くなったりするのかな?
構造体の代わりみたいに使いたかったのだが。
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."

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

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

>>607
それでいいんだけど、PIとかで参照できたらもっといい、と思ったのです。
>>608
数値計算のために、CのDBL_EPSILONの代わりになる定数が欲しいなと。
任意の精度で丸められる関数もないですし。
2011/06/04(土) 09:41:48.63
DBL_EPSILONが>>608の(1)〜(3)のどれかわからない?
数値計算の基本なんだが。
611デフォルトの名無しさん
垢版 |
2011/06/10(金) 21:49:33.34
変数名など、自前であっても規則を意識している方いますか?
awkだと、C風が一般的なのでしょうか?
一番最初がVBAだったので、長い名前と省略が混ざってしまって
自分でイライラしています。
みなさんの、通常の変数はこう、配列はこう、定数はこう、文字型はこう・・・
というものを参考にしたいです。
2011/06/10(金) 22:10:28.97
>>611
システムハンガリアンを採用するかどうか悩むほど大きなものをawkで書いたことが無い
613かあた
垢版 |
2011/06/13(月) 18:37:34.88
、5なわやあふぉt( ())
2011/06/15(水) 21:51:26.93
>>611
遅レスだが、型_内容の説明_名前みたくしてる。名前が一文字だとそのままだけど。
グローバル変数とローカル変数のどっち弄ってるのか分かりやすいように、ローカル変数は必ずlで始めるようにしてる。
d_per_shouhizei = 5.0とかね。
615デフォルトの名無しさん
垢版 |
2011/06/20(月) 18:37:26.17
gawkでBINMODEを設定すればバイナリーの入出力ができるのはわかるのですが、
入力されたバイナリーを16進ダンプして表示するにはどうしたらよいでしょうか?
od等の外部コマンドを使う意外に方法があればお教えください。
2011/06/20(月) 19:17:07.50
printf("%02x\n", $1);
2011/07/05(火) 00:15:13.83
二度と話かけんなよ
お前らってどうみてもゴミだよな
2011/07/06(水) 14:04:55.24
ゴミんなさい
2011/07/14(木) 23:55:15.84
>>595
gawk4.0.0でa[0][0]=1も可能になったじゃないか
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
2011/07/30(土) 19:53:38.97
ddd 20 ではないかと思うがこんな感じかな
awk '{a[$1]+=$2} END {for (b in a) {print b " " a[b]}}' | sort
2011/07/30(土) 23:15:27.52
Gawk4ならPROCINFO["sorted_in"]の設定で最後のsortが要らなくなる
623620
垢版 |
2011/07/30(土) 23:22:20.03
>621
ありがとうございます!うまくいきました。
2011/07/31(日) 15:24:48.76
gawkはもう別言語なイメージ。普段mawk使ってると
2011/08/16(火) 22:48:21.64
ここって生きてますか?
2011/08/18(木) 01:56:26.63
生きてますん
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
アイウエオカキクケコサシスセソ
ココココサフサコココココ
ココココサフサココココ
ココココサフサコココココ
ココココサフサコココココ
サフサフサフサフサフサ
ココココサフサコココココ
ココココサフサココココ
ココココサフサコココココ
ココココサフサコココココ
サフサフサフサフサフサ
628627
垢版 |
2011/08/19(金) 01:00:20.60
TEST.DATは、空白が入っています。
専ブラのポップアップをコピペして下さい。
2011/08/19(金) 06:26:54.92
ウチに帰ってから調べてみるよ
2011/08/19(金) 11:02:41.54
>>627−628
cygwinのawk(GNU Awk 3.1.8)で動くけど、どうなるはずがどう動かないと言っている?
>627のtest.datなら、当然「ソ」だけが変換されるけど。
2011/08/19(金) 11:55:06.25
(CygwinならUTF8じゃないとうまく動かないけど)Shift JISで動作させたいってことかな?
事前にTEST.DATをnkf -wに通したら駄目かな。
632629
垢版 |
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やってリダイレクトしたファイルは正常な結果が出るよ。
リダイレクトしないでコマンドプロンプトに表示させると化けるけど。
2011/08/19(金) 23:18:25.14
EUCなら半角カナもうまくやってくれるんだが…
634デフォルトの名無しさん
垢版 |
2011/08/24(水) 08:07:37.54
gawkはガンガン機能を拡張してるけど、
そろそろOOP対応してくれないかな。
awk++とかあるけど、標準でOOPできれは便利。
2011/08/24(水) 22:44:37.24
> OOP
...もはやawkでやる意味が無いw 他にいくらでもある別の言語でいいじゃん
2011/08/25(木) 01:14:17.45
awkに在ると便利かもと思うのは参照値くらいかな

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

でもあんまりややこしいことやるならPerlでいいから必須ではないね
2011/08/25(木) 02:28:23.99
> 関数を呼んだり

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


2011/08/25(木) 04:07:56.67
およ、もうあるのかw
最近のawkは分からねえ…ってことは、配列への参照を使って入れ子の配列とか既に作れちゃったりするのか?
2011/08/25(木) 10:56:54.36
配列の配列は作れるよ。gawk4なら。
2011/08/25(木) 19:51:33.84
(´_ゝ`)フーン
641デフォルトの名無しさん
垢版 |
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()
}
642641
垢版 |
2011/08/25(木) 20:58:10.41
>>635
http://code.google.com/p/lawker/source/browse/fridge/lib/bash/awk%2B%2B/
これを使えばこの程度のOOPはどうにかできる。
本当にこの程度でいいからOOPに対応してほしい。
使う人はほとんどいないと思うが、全くできないのも困る。
2011/08/25(木) 22:07:53.46
それは最早awkである必要が全く無い
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")
}
2011/08/26(金) 06:01:35.02
ごめん一部genderになってるからsexに直しといて

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

でも、やっぱりOOP用の構文が使えればベストですね
そのほうがわかりやすいと思います
2011/08/27(土) 15:58:44.09
やっぱ別言語使うべきだろ
2011/08/27(土) 16:10:36.72
本当に欲しいんなら、gawkのMLにこうすればOOP実現できることを発見したんだけど、
これの糖衣構文を用意してくれって投稿するといいんじゃね
switchも実装されてるし、欲しい人が居ると分かれば付けてくれるかもよ
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()
2011/08/27(土) 16:26:25.23
pythonで書いてみると、
>>641と比べると特にわかりやすいわけでもないけど
>>644よりはわかりやすい
2011/08/27(土) 16:53:49.92
そりゃawkはOOPLではないからな
あくまでシェルのお供でいいと思うんだ
そしてそこに高度なOOP機能は要るとは思えない
どちらかと言えばフィールド抽出とかをもっと便利にすべきだよ
2011/09/17(土) 15:34:39.29
cygwin以外でgawk4.0をwindowsで使おうと思ったら、バイナリはどこで入手できもうすかね?
2011/09/17(土) 16:28:58.78
cygwin で駄目な理由が分からないから教えられない。
2011/09/18(日) 08:02:36.95
>>652
http://www.klabaster.com/progs/gawk32.zip
2011/09/19(月) 13:00:55.06
>654 さんくすこ

>653 awkの実行形式だけ入手すれば良いようにしたいのさ。
2011/09/19(月) 14:01:43.39
バイナリ互換のWindowsなのに、cygwinてexeをもってくだけじゃ使えないの?
2011/09/19(月) 16:07:37.39
物によっては使えたような気がする。
cygwin1.dllだっけ?にパスが通ってれば大体使えたような気がする。
2011/09/19(月) 17:00:12.76
結構沢山のdllが要るよ
コマンドによるけど
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"とか)が両立してんの?
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 ....
第三引数の値と同名の関数が定義済みならそれを利用するとか、
そういう方法で区別してるんじゃないの
2011/10/24(月) 13:33:04.59
>>659
比較関数の与え方はPROCINFO["sorted_in"]の場合と同じってことだろ。

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

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

まぁ、それやるくらいならGAWK自体に変更を加えて再コンパイルしろってことかもしれないけど。
2011/11/15(火) 01:44:31.01
PとかR使え言われると思う。
2011/11/15(火) 01:58:32.43
>>662
ttp://www.gnu.org/s/gawk/manual/html_node/Dynamic-Extensions.html
じゃダメ?将来的にさらに拡張される可能性はあるみたいだけど
2011/12/09(金) 00:35:09.18
最近awkcardを知って座右に置いてるのだが、日本語版って存在するのだろうか。
666デフォルトの名無しさん
垢版 |
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 です
2011/12/22(木) 18:01:49.60
>>666
その通りにやったと言うのなら、何故poファイルを提示しないのかね、ダミアン君。
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
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.
2012/01/12(木) 13:56:36.33
ずいぶんawkから離れていて久しぶりに使ったら
nawkに日本語のバグがあることにしばらく気づかなかった
substr()でutf-8のテキストを切り出すとおかしな値になる
gawkでは直っている
2012/01/12(木) 19:50:49.28
そもそもUTF-8に対応してたっけ
2012/01/13(金) 00:28:07.37
ttp://blog.livedoor.jp/corbie/archives/cat_94960.html
残念ながら、シフトJIS、UTF-8両方で正常に動作しそうなWindows版gawkは候補の中にありませんでした。
2012/01/13(金) 07:52:50.95
Linuxでは普通に動くが…
2012/04/29(日) 21:07:39.93
ファイル名が"*.txt"の一覧を取得するとき、"\.txt"でマッチさせると、任意の一文字.(ドット)と解釈されてしまうんですが、いい方法無いでしょうか?
2012/04/29(日) 22:04:14.36
GNU Awk 3.1.7だとドットにマッチしたけどそもそもawkの話?
具体的にコマンドがほしいな
2012/04/29(日) 22:08:23.01
昭和の頃覚えたアセンブラとC言語
これがあったから
いまだに自分が損な業界で飯を食ってる
2012/04/29(日) 22:36:10.83
>>676
そこからjavaに行ってスマホアプリ開発ならもう一花咲いたかもしれませんねw
2012/04/29(日) 23:09:38.43
馬鹿には無理
679674
垢版 |
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が古くて解決できてないかもしれませんが。
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
2012/05/24(木) 00:27:31.74
gawk4.0.2付属の原版ではmatchの説明にもその辺触れられてるね。
http://www.gnu.org/software/gawk/manual/html_node/String-Functions.html#String-Functions
誰かこのバージョン日本語化してないかな。
2012/07/12(木) 02:26:40.35
FIFOな感じの先入れ先出しのバッファには何使えばいい?
というか、
Arrayで、たとえばA[3] からA[8]までのデータをA[1]からA[6]に動かすには何が一番早い?
できれば配列は1つしか使いたくないのだが、無理だろうか…
2012/07/12(木) 09:23:22.92
速さを求めるなら毎度全要素ずらすより、読み出し位置と書き込み位置の添字持って
管理した方がたいてい速い
2012/07/12(木) 10:14:32.78
awkには連想配列しかないしな
2012/07/14(土) 14:35:06.22
リングバッファで何とかなるならリングバッファかな
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;
}
687686
垢版 |
2012/07/14(土) 22:54:06.64
↑の結果はこんな感じ。
>からっぽ
>1
>おなかいっぱい
>a
>b
>c
>からっぽ

>>685の書いているリングバッファ実装です。
enqueue,dequeue回数が多いならリングバッファで良いと思う。
大抵の場合はQMAXに大きな値を設定すれば事足りるハズだけど
上限が決定できない等の事情があればdelete arrayを使った単純な配列管理かな。
ただ添え字が数値上限を超えない様な工夫は必要だね。
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]に合計が記載。

これ以上(コードサイズ、ある程度の速度、メモリの使用量を極力少なく)という条件で最適化できるだろうか…
だれか頼む。
入力と出力先が同じでも、別でも作動するコードなら尚のこと良いのだが…
2012/07/17(火) 00:02:18.87
これはひどい
デバッグも拡張も無理じゃね
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が半分死んでいてもなんとか動くし。
691686
垢版 |
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];
}
692686
垢版 |
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。
これで良い?
693688
垢版 |
2012/07/22(日) 09:36:17.43
>QMAX=9007199254740991
ワロタwww
俺のも確かにwhile(C[p+=1]=C[n+=1]);の部分で保持してるのすべて消費分だけ上に移動させてるのが無駄なので
そのループが無い分は確かに早いはず。

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

しかしデータをメモリ上に展開するからどうしても上限が出てくるな…
awkで10GBぐらいの扱う時はgetlineでなんとかなるけど、やはりメモリマップやポインタが使えたら便利だよなぁ
パッチ作ったら需要あるかな?
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する事は事実上無いし、
仮に発生しても検索結果が潰れるだけで、気付かない筈。
695688
垢版 |
2012/07/22(日) 13:39:49.16
>9007199254740992
理論上、8192ペタバイトの同じデータ[aaa...]でregexp="."とすれば、発生するな…
IEEE 754の52bit制限だから、これ以上のでかい数字扱うならbig numbert対応のライブラリか,
"bc -q" |& で動かすか、xgawk、dnawkあたり使うべきだなぁ

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

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

PythonかRubyでいいんじゃない? ワンライナー向きではないけど。
2012/08/03(金) 07:37:24.41
>>696
ライブラリ(?)を拾って来ては?
2012/08/03(金) 11:48:03.19
>>696
必要な関数値を計算するだけのプログラムをCで作っておいたら?
700デフォルトの名無しさん
垢版 |
2012/08/03(金) 20:21:59.43
昔それでベクトル演算して遊んだな
2012/08/04(土) 09:23:47.83
Rubyはそこそこワンライナーも書ける感じがする、awkやPerlほどじゃないけどね
Pythonは流石にコード起こさないと辛いことが多いが
2012/08/04(土) 10:27:49.07
awkでmatlabみたいなベクトル演算できるようにしてほしい
2012/08/04(土) 16:48:36.10
awkでクラスを使えるようにしてほしい
2012/08/04(土) 17:06:19.06
awkで全ての魔法少女を救ってほしい
2012/08/04(土) 17:08:30.07
awkさんは魔女
706本田
垢版 |
2012/08/05(日) 07:21:28.03
Awk++
http://awk.info/?doc/dsl/awkplusplus.html
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

http://lawker.googlecode.com/svn/fridge/lib/bash/awk++/version21/awkpp21.zip
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 '?' は不正です。
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;
}
これ以上削れるところ無いかな? 
高速化+サイズ優先で、変数はできるだけ使う数を少なくとの条件で
2012/08/22(水) 09:51:11.01
>>708
その3つの条件の優先度がわからんな。

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

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

あと細かいがhoge+=1より++hogeの方が1文字短いとか、いらない「;」が
残ってるとか詰めが甘いところがまだあるね。
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
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になるんだけどね。
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;
}
2012/10/01(月) 20:30:33.48
>>711
すみません、前者ですね。なんだろう、恥ずかしい。

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

お二方、ありがとうございます。
2012/12/13(木) 11:40:43.98
awkにかわる同等のものあります?
2012/12/13(木) 13:08:08.26
python
2012/12/13(木) 13:13:55.85
>>715
awkみたいに使い勝手いいのかな?
2012/12/13(木) 13:18:24.65
良いですよ
2012/12/13(木) 13:24:31.23
>>717
ありがとす。勉強してみます
2012/12/13(木) 14:45:25.45
はい
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自体は渡されているはずですが、何が原因でしょうか?
2013/02/06(水) 11:23:41.42
>>720
いちぎょうめのひだりがわの var は、ひょうかのさいに
せいきひょうげんへのかたへんかんがおこなわれる。

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

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

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

予め「メタ文字と言っても $ しか出てこない」とか判ってるなら大したこと無いけど
一般化すればするほど面倒になる
726720
垢版 |
2013/02/07(木) 22:14:56.21
>>725
やはりそうですか。
今までこういった処理はsedでしこしこエスケープしてやってたんですが、いい加減面倒になったので、
たとえばfgrepみたいに正規表現をオフにして処理する方法はないかと探しているんですが、
awkでは無理ですか・・・。
2013/02/08(金) 11:20:14.98
>>726
単に一致なら正規表現なんか使わずに比較すればいいじゃん。
fgrepで事が足りるのならawkからfgrepを起動すればいいじゃん。
2013/02/08(金) 19:27:47.04
>>726
fgrepなら index()関数じゃないの?
729720
垢版 |
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
730デフォルトの名無しさん
垢版 |
2013/02/09(土) 17:49:52.25
/bin/shでごちょごちょやるのが好みなら、awkもfgrepも使わず、case文でやりゃいいんじゃないの。
2013/02/09(土) 21:34:09.39
>>729
文字列の比較は等号でできるって認識はないの?
2013/02/10(日) 14:31:49.57
>729
いや、その方法でも結局 ' はエスケープが必要でしょ。
ダイレクトにシェル変数に入れる方法か、
ファイルなどに吐き出しておく方法の方が安定。
まぁそれでも改行とか制御文字入れられるともにょる場合があるけどな。
2013/02/11(月) 20:15:01.17
そこまでめんどくさくなったらperlとかrubyとか使った方が楽だぞw
2013/02/11(月) 22:46:25.57
何で gawk -f とか使わずワンライナーに拘るのかねぇ
2013/02/12(火) 22:00:38.07
>>732
中韓ファイルを作るのは情弱の仕事(ドヤ顔
>>734
ワンライナーディスってんの?
736デフォルトの名無しさん
垢版 |
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 }
737デフォルトの名無しさん
垢版 |
2013/03/15(金) 08:05:25.28
#
# Line(行数)を数える
#

END { FNR }
738デフォルトの名無しさん
垢版 |
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>")
}
739UNIX(LF) to DOS(CR+LF) conversion
垢版 |
2013/03/21(木) 21:15:00.86
awk 1 infile1 > outfile2.txt
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
}
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
}
2013/03/21(木) 22:12:57.08
function produce_string(a, size, g, i) {
743grepを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)}
2013/11/30(土) 12:16:25.95
$ echo 10 20 30 | awk '{for(i=0;i<4;)print _$++i}'
10
20
30

_$++iでも$++iでもどちらでもいけるのですが、アンダースコアが付いて何故大丈夫なのでしょうか?
2013/11/30(土) 16:04:55.55
すいません、わかりました
空の変数_と$++iの結果が一緒になってただけなんですね
2013/11/30(土) 20:37:58.81
単に式を並べると文字列連結になる、の罠か
2014/04/02(水) 00:10:13.15ID:T3/5Epfc
保守

てか半年近く書き込みが無かったか
2014/04/14(月) 22:41:42.89ID:5r697USd
4.1.1ってもうリリースされたの?
2014/04/19(土) 13:45:38.45ID:Db2IzPol
とあるgawkスクリプトの先頭で
{last_hoge=hoge; hoge=$ 3}
ってやってるんだけど、
hoge=$ 3はhoge=$3の間違い? それともこういう記法がある?
2014/04/19(土) 14:56:08.53ID:A73fEYrr
>>749
$ は演算子だから、a=b+1をa = b + 1と書くようなものかな。
2014/04/19(土) 21:10:32.64ID:Db2IzPol
ええー 演算子だったのかあ。衝撃の事実
2014/04/20(日) 12:36:45.70ID:SQaIR8ej
演算子だから、変数でもいいよ。
2014/04/20(日) 14:34:12.09ID:YSeiuWKu
式が書けるね。
$ は一番優先順位が高いから、かっこで括らにゃいかんが。
2014/04/20(日) 15:12:13.25ID:k3tDznaJ
今はじめて知った。haskellの$は演算子だって知ってたけど、awkでも演算子だったんだね。
2014/10/14(火) 13:37:28.35ID:cBz5RbAX
そして半年近く書き込みが無かった
2014/10/15(水) 03:28:03.90ID:SS4U/DMU
いやawkスレなんて普段はそんなに話題ないだろ
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個以上で区切られてる可能性もあるため根本的な対応をしたいと考えていますが
よい案はありますでしょうか
2014/10/21(火) 17:25:55.68ID:EsuQiv22
# ファイル名に「"」が含まれていたら知らね。
ls -Ql |awk '{split($0, foo, "\x22"); print $5 "\t" foo[2]}'
2014/10/21(火) 23:41:50.65ID:stXOK2Vv
Qオプションは勉強になった
ls -l|awk '{s=$5;for(i=1;i<9;i++)$i="";print s"\t"$0}'
2014/12/13(土) 17:07:55.12ID:8LbgKkKk
¥034  は ” (半角)
¥035  は # (半角)       でおkですか?
2014/12/13(土) 18:17:16.35ID:FQOeA8KF
>>760
いいえ違います。
2014/12/14(日) 00:00:31.34ID:7YfznIJB
どちらも非可読文字ですね。そしてそうなるとスレ違い。
awkと絡むのなら具体的にどうぞ。
2015/02/03(火) 10:36:52.13ID:Dvc0nyMp
Terastationのファイル・ホルダ名に使うとファイルレプリケーションでエラーが起こる文字があって、それを変換するバッチを生成する時にこのマイナー言語が大活躍した。
約80万件のファイルホルダ名から抽出するのに10分程度だった。
2015/05/26(火) 00:18:03.33ID:Y5HiR/XE
Gawk4.1.2が出たなあ、と思ってたらすぐ4.1.3が出た。
素人には違いがあまり分からんのだが。
2015/05/31(日) 09:20:55.82ID:PB6Yeih1
http://www.amazon.co.jp/AWK実践入門-Software-Design-plus-中島/dp/477417369X

新しい本、出たんだな
廃れないのが凄い
2015/06/03(水) 20:45:34.22ID:vBAc8MUN
>>765
買ってきた。まだ最初の方と最後の方を眺めただけだけど。

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

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

参考書や文献がないけど、今時は「ネットでググれ」かな。
2015/07/06(月) 22:02:56.12ID:Wnwr3Nh9
Mono: Playback -9707 [5%] [-97.07dB] [on]
上の行からパーセントを除いた数字(上の例だと5)を取得したいのですがどのようにしたらよいでしょうか?
パーセントの値は0から100の整数だと思います
2015/07/07(火) 15:47:02.78ID:NFKuqu84
# $0 に入っているとして
sub(/%.*/, "");
sub(/.*[^0-9]/, "");
2015/07/08(水) 11:55:27.32ID:rptAPQZX
awk -F"[%[]" '{print $2}'
ではまずい?
2015/07/08(水) 18:52:19.39ID:GgkVcZ7j
>>768,769
ありがとうございました
どちらでも希望の結果を求めることができました
2015/07/10(金) 10:45:11.15ID:VcZTZ3UB
テンプレである筈の1が読めないんだが、このスレ的にはPOSIXで書くのが
正統?普段はGawkしか使わないので一応確認。
772デフォルトの名無しさん
垢版 |
2015/10/10(土) 22:36:33.12ID:1AEUTcmG
awk の a は、aho の a

ただし、エイホと読むらしい
へぇーーーーー
2016/02/12(金) 17:12:05.45ID:VH2jVHwT
awk使ってるシェルスクリプト見ると逃げてるなあと思う
2016/02/18(木) 00:13:16.92ID:E3KgV2Kz
普通は x[3]=5 と書くが、=なしの
x[3]
だけでもエラーとならず、x を配列として確保し、length(x)=1 になるのを発見
まあ、あまり必要ないけど
2016/02/18(木) 23:58:18.64ID:kHIvdCfG
まあ、gawkのマニュアルでも代入の前に参照が出てくるし
2016/02/20(土) 00:57:58.12ID:OTE8dQpJ
そうでしたか、新発見でなかった
2016/02/20(土) 15:01:09.40ID:91Q+YYwH
代入前にうっかり参照してしまうのは稀に良くある。
2016/02/28(日) 01:02:06.47ID:Atbyv4Wk
IGNORECASE=1
をBEGIN の前に置いてもエラーにならず、不可解動作
セキュリティ的にやばくないの
2016/02/28(日) 02:01:41.85ID:2mMmSiU+
>>778
BEGIN セクションを先頭に書けとは何処にも書いてない。

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

「mawk multibyte char」で検索!
783awk命
垢版 |
2016/05/11(水) 00:10:08.64ID:EkexSAUH
>782

データもプログラムもSJISです。
何に反応して multibyte charが出続けるのか不明です。
gawk高速なので満足なのですが、STDERRに multibyte charがで続けるのでうざいし、この出力ぶんだけ速度も低下?
2016/05/11(水) 00:13:30.76ID:Qn6YFszJ
入力にSJISでない文字が混在していることない?
nkf -s 入力ファイル | awk
で変換したら
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
2016/05/11(水) 04:14:37.49ID:gi9ycYMA
構文がぜんぜん駄目。
{for(i=1;i<=NF;i++)if($i<0){$i=0};print $0;}

「したいことは、〜したいです。」の構文も駄目。典型的なねじれ文。
2016/05/11(水) 07:39:07.59ID:E3fj3Ww+
Ruby, Python などを使えば?
2016/05/11(水) 12:31:52.37ID:ZhRn3EDd
>>787
Ruby, Python スクリプトを提示してみろよ。
2016/05/11(水) 22:58:11.78ID:Lckmn9CP
>>786
ありがとうございます!出来ました!

(一行プログラミング!awk便利ですね)
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' ...

でええんちゃう?
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
2016/06/22(水) 23:46:54.12ID:P+7nG182
やたらと続きは登録して読めと言われてもなあ。
このスレが立った頃からJGAUCのHPが更新されていないってのも凄い。
2016/08/27(土) 09:20:46.26ID:2q8s4uQl
Windows版のgawkで遊んでたら
for (i=0; i<n; i++) より
for (i=0; i<n; i+=1) のほうが
実行時間が短くなることに気づいた
なんだこりゃ
794デフォルトの名無しさん
垢版 |
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")}
結果は同じはずなのに、後者は異常にメモリを食う!ふしぎ!
795デフォルトの名無しさん
垢版 |
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
796デフォルトの名無しさん
垢版 |
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版の問題かも
2016/09/14(水) 22:50:10.30ID:PWB0Awgu
>>796
OSX El Capitan
gawk 4.1.4

それぞれBEGIN{}に入れたスクリプトを読み込ませて実行。
で前者数十MB、後者3GB超までメモリ使った(アクティビティモニタ)。
798795
垢版 |
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" に変更してもこんな感じだから数値と文字列の差というわけではなさそう。
799デフォルトの名無しさん
垢版 |
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.
800デフォルトの名無しさん
垢版 |
2016/09/17(土) 08:30:37.61ID:didBD5ba
よく考えたら、メモリの使用量自体じゃなくて、それがどれだけ増えたかが重要だね。
そして、連想配列の構造体とキーに必要な量はどのケースでも同じと考えられる。
つまり、連想配列の要素のための量がどれだけ違うかを直接知ることができるはず。
というわけで、もう一回テスト。

https://ideone.com/mRuFj7
801デフォルトの名無しさん
垢版 |
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 のソースコードをハックしてみるか!
2016/09/17(土) 14:11:27.89ID:IIH0ZjSk
推測だけど、stream, yield, callback、遅延処理かも

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

この方式だとメモリは、バッファサイズ分だけしか使わない
803デフォルトの名無しさん
垢版 |
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)というのが作成され
804デフォルトの名無しさん
垢版 |
2016/09/18(日) 10:44:42.56ID:6jI6cHER
・・・いっぺんに書こうとしたらハネられるorz
805803
垢版 |
2016/09/18(日) 10:46:32.08ID:6jI6cHER
(続き)
それを/c pip?.batで起動、完了後にpip?.batを
削除という流れでコマンドが実行される
806803
垢版 |
2016/09/18(日) 10:47:07.98ID:6jI6cHER
(続き)
system関数を使ったスクリプトを同時に1つしか実行しないなら良いけど
2つ以上実行したときはタイミング次第でpip?.batの数字がぶつかり、先に実行した側が
・ コマンドが実行されない
・ コマンドが実行されるけど、完了後に「バッチファイルが見つかりません」が吐かれる
という結果になる

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

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

どうして使わないのだろう?
808デフォルトの名無しさん
垢版 |
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.
809デフォルトの名無しさん
垢版 |
2016/09/18(日) 15:07:54.47ID:KtcAr9oX
でもソースコードを見るかぎり、パイプではそういうことをしてるみたいなんだけど……
ちょっと試してみてくれないかな。

system("dir") | getline

みたいな感じ? よく知らないけど。
810803
垢版 |
2016/09/18(日) 16:19:12.82ID:6jI6cHER
コマンド | getline で起動する場合はpip?.batは作られませんでした
system関数だけpip?.bat経由の模様
klabaster版のwindows用gawk4.1.3だとsystem関数がpip?.batを
作らなかったから、ベクター版固有の動きかなあと思います
811デフォルトの名無しさん
垢版 |
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 を使ってる自分には関係ないといってしまえばそれまでですが。
2016/09/18(日) 19:56:17.75ID:zTPoEkjL
>>811
vectorの配布ファイル内のreadmeにはソースコードの
公開場所を探してるとか、直接連絡すれば渡すとか書いてある。

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

メモリ上だけに存在する、ファイルもあり得る。
LinuxのRAMディスク、tmpfs とか
815803
垢版 |
2016/09/19(月) 14:26:19.66ID:fDWhtT6v
>>811
情報ありがとうございます。>>803で書いた「ヘンテコな処理」をpc\popen.c内に確認できました。
scriptify関数のtempnam呼んでるところでプロセスIDもつけるなり、細工したいなあ・・・
816デフォルトの名無しさん
垢版 |
2016/09/20(火) 17:00:26.41ID:RIxgZ1yj
先日アクセスできなかった GNU のサイトが復活してたので 3.1.5 のソースコードを入手できました。
やっぱり os_popen からも scriptify を呼んでたみたいですね。4.1.1 のソースコードじゃ判りませんでした。
一応 chdir はアトミックな処理のはずなのでリスク回避に役立つと思いますよ。それ以外に方法がなければ。
chdir したら rmdir も忘れずに。
817デフォルトの名無しさん
垢版 |
2016/09/20(火) 17:06:03.57ID:RIxgZ1yj
間違えた。chdir じゃなくて mkdir です。
818デフォルトの名無しさん
垢版 |
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 付きでコンパイルしたから増えるかと思ったのに。
まあ、それ以外は一応予想通りではある。
819デフォルトの名無しさん
垢版 |
2016/09/22(木) 23:15:31.17ID:SYBS8P/o
>>793とか
文字列の連結は "A" "B" よりもsprintf("%s%s", "A", "B") の方が速いとか
gawkって結構クセありますね
2016/09/23(金) 02:39:22.63ID:o4qLonoN
>>819
> 文字列の連結は "A" "B" よりもsprintf("%s%s", "A", "B") の方が速い
マジか。逆だと聞いていたが。
821デフォルトの名無しさん
垢版 |
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 の中の複雑さを考えれば意外と差は小さいといえる。
フォーマット文字列が定数なら正規表現みたいにコンパイルすれば
高速化できる……のかなあ? 自分でやってみようとは(今はまだ)思わない。
822デフォルトの名無しさん
垢版 |
2016/09/24(土) 23:15:47.76ID:+IiHRmp0
Windowsで使えるawkでUnicodeを正しく処理できる(length("あいう")で3が返ってくる)ものは
Cygwin版とVector版以外に無いでしょうか?
823デフォルトの名無しさん
垢版 |
2016/09/25(日) 10:08:34.07ID:BH82R274
何があったんですか?

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

に書かれているようなことですか? 別の選択肢も一応あるみたいですが。
トランスレータでもいいなら Perl に a2p が同梱されてます。
824822
垢版 |
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
825823
垢版 |
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 がバイト数なのは、単にマルチバイト文字非対応でコンパイルされてるからだと思います。
マルチバイト文字対応版を誰かがリリースしてくれるのを待つか、自分でコンパイルするかですね。
826デフォルトの名無しさん
垢版 |
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 への引越しを強くお奨めします。
2016/09/27(火) 18:24:36.25ID:JiNhKH2a
cygwinやmsys2のgawkを使うのはだめなの?
2016/09/27(火) 18:34:39.64ID:BPXrtVfk
Windows Subsystem for Linux (WSL)では、Ubuntu64の実行ファイルが動く。
Linux API を、Windows API へ変換して呼び出す

Ubuntuのパッケージも、apt-getでインストールできる
829デフォルトの名無しさん
垢版 |
2016/09/27(火) 19:26:43.05ID:Icjzq3KF
だめというか、見つけられなかった。
ただでさえ Windows のことなんか知らないんだからこれ以上無理。
いい方法を知ってたら教えてあげて。
830デフォルトの名無しさん
垢版 |
2016/09/27(火) 19:51:11.26ID:Icjzq3KF
Cygwin は試してみたけどインストーラに丁重にお断りされたよ。
831822
垢版 |
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を
使うことにします。
832デフォルトの名無しさん
垢版 |
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;
}
833デフォルトの名無しさん
垢版 |
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 の時だけエラーになるのだろう。
834デフォルトの名無しさん
垢版 |
2016/10/02(日) 00:14:27.80ID:lSw/Qfuv
この記事を見るかぎりではklabaster以外のWindows版gawkでもダメっぽいです
https://groups.google.com/forum/#!topic/comp.lang.awk/coXxXOpeoXU
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にあるように特別な変数として扱われており、リファレンスにも$が演算子で
あることの記載がない。
(続く)
836835
垢版 |
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という変数にフィールドが代入されると説明しているところもあった。そのように理解して
スクリプトを書いてもさして不都合はないだろうな、とは思うが。
2016/10/08(土) 23:11:50.50ID:ZMh6U7O9
広範な調査乙。Gawkのrefcardでもちゃんとoperatorに含まれているなあ。
演算子と明確に認識していなくても、$の後に式OKと思っていれば差し支えなさそう。
838デフォルトの名無しさん
垢版 |
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・・・残念
}
839デフォルトの名無しさん
垢版 |
2016/10/21(金) 17:10:59.85ID:MQQBNMPM
>>756
こういう過疎スレで無駄に突っかかってくるやつむかつくんだが死ね
2016/11/23(水) 00:01:26.03ID:bt3mTQnz
>>839
ブーメランかよwww
2016/11/23(水) 01:18:15.98ID:noM2Pdp3
\おはげだー!/
842デフォルトの名無しさん
垢版 |
2016/11/30(水) 02:56:38.28ID:PeC/aWZc
http://imgur.com/a/1WEjn
843C初心者
垢版 |
2017/02/28(火) 13:18:15.09ID:Mb8mQo1M
awkスクリプトをCソースに変換してコンパイルするための「awka」というツールでできるだけ簡単にUTF−8サポートさせる方法を知りたいです。
ネットで散々調べましたがないようです?
2017/03/02(木) 00:28:53.73ID:CDxvUfiY
このスレも10周年か
2017/03/05(日) 09:28:55.73ID:EQCsqksH
>>843
それがあなたの現在の実力だったということです
お疲れ様でした
2017/03/05(日) 14:45:26.28ID:KmKKYedf
gawkに対応してるなら大丈夫ってことかな?
asciiしか考えていないなら、ソース全チェック…。
要するに、日本語化するんだろうけど。

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

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

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

002347
002479
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
}'
849デフォルトの名無しさん
垢版 |
2017/03/06(月) 15:19:43.83ID:FdaYmB9f
ありがとう
gawk いれないでなんとかならないかな
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
851デフォルトの名無しさん
垢版 |
2017/03/06(月) 19:23:27.89ID:08XsJPyW
>>840
だからブーメランとかそういうの関係ないから死ねって言ってんだろカス
死ね
852デフォルトの名無しさん
垢版 |
2017/03/06(月) 19:24:30.15ID:08XsJPyW
>>844
粘着が10年位延命しても何もすごくねえよ
突っかかってきたぶちころすぞ雑魚死ね>>840
853デフォルトの名無しさん
垢版 |
2017/03/06(月) 19:26:33.18ID:08XsJPyW
>>840
ブーメランとかじゃなくて死ねって言ってんだから死ねボケ
2017/03/07(火) 08:17:48.93ID:6Hf5Xh2e
お疲れ様でした
855デフォルトの名無しさん
垢版 |
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
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"}'
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)}'
858デフォルトの名無しさん
垢版 |
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 "時間だ!答えを訊こう!"
  }
}
859デフォルトの名無しさん
垢版 |
2017/09/16(土) 00:02:08.63ID:lO9EtkAG
自作の読込みパーサextensionでgz形式のファイルを食えるようにしてみたけど
パーサは一度にひとつしかロードできない設計らしく(ソースでそうなってた)
同じ読込みパーサ形式のxmlライブラリとは併用できなかった
ちょっと使いにくいなあ・・・
860デフォルトの名無しさん
垢版 |
2017/10/09(月) 16:41:58.59ID:7/rU/a8H
4.2.0Betaあげ
2017/10/16(月) 14:34:21.07ID:tJ1aGDYb
ファイルの終端関係の謎のエラーに直面
「何で行末が欠ける?分からん、全然分からんぞ!」
と悶えていたら、
いつの間にかvimの設定が変になっていて、
書いたファイルがデフォで行末に\rが来る
ようになっていた。
brew でインストールvimインストールしたとき
妙な設定になったのか?

いやねawkのスクリプトで、
空フィールドが\rになったりとか
macOSなのに変だなあと思っていたのだが…
システム外vim使うときは要注意か。
2017/10/16(月) 14:41:37.20ID:tJ1aGDYb
うぉーっ、林檎のnumbersで書き出したCSVファイルが
DOS改行になっとる…罠だ
2017/10/22(日) 23:24:45.88ID:/qEHJ0vm
お疲れ様でした
864デフォルトの名無しさん
垢版 |
2017/10/22(日) 23:26:23.47ID:/qEHJ0vm
>>756
普段話題なく3年も続こうがべつにすごくないね
865デフォルトの名無しさん
垢版 |
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のロックがどうたらの影響なんだろうけど
2017/12/12(火) 21:01:15.07ID:zxiueT/o
懐かしいなぁ。
AWKは自由に現実的な限度はあるけど、書いてて楽しい言語だった。
867デフォルトの名無しさん
垢版 |
2018/01/08(月) 11:00:30.57ID:szpKYJOz
お疲れ様でした
868デフォルトの名無しさん
垢版 |
2018/01/12(金) 00:18:25.22ID:8Bbkgawk
IDがgawkなので来ました
2018/01/17(水) 10:09:56.59ID:MoHAEd1l
AWKって基本的にUnicodeには対応してるんだよね。
GNUにしろBSDにしろ。
2018/01/17(水) 17:52:56.47ID:MoHAEd1l
置換函数の第二仮引数に[バックスペース][置換対象の文字列]みたいにしたい時は
gsub(/foo/, "\\\\&", $n)
ってしないといけないんだね。
gsub(/foo/, "\\bar", $n)
が foo -> \bar だったんで foo -> \foo は
gsub(/foo/, "\\&", $n)
でいいと思って半時程嵌った。
2018/01/18(木) 07:25:24.80ID:eRgrS92p
>>862
それ勧告に従っただけだと思うが。
http://www.ietf.org/rfc/rfc4180.txt
872デフォルトの名無しさん
垢版 |
2018/03/09(金) 13:30:21.59ID:Yd19z7Tx
ある行に 20 と 34 とはいってる
この行ごと除外したいけど・・・
 
2018/03/09(金) 14:33:06.31ID:X3i0O3oy
grep -v ' 20 と 34 '
874デフォルトの名無しさん
垢版 |
2018/03/09(金) 21:38:00.87ID:3i0y1Him
こうかな
gawk "$0!~/20|34/{print}"
2018/03/09(金) 23:45:36.30ID:Ejthnyow
AWK プログラムの基本構造となっている「パターンとアクションの対」のうち、
アクションが省略されている場合は入力行がそのまま出力される。
またパターンが単一の正規表現である場合は、その正規表現と $0 との照合が行われる。

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

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

awk '!/01 / && !/03 /'  これも両方消えてる・・
2018/03/11(日) 06:07:55.06ID:rsmr5+n0
>>876
「20 と 34 を両方含む時だけ出力しない。片方だけの場合は出力する。」
そう言いたいのか?
gawk '!(/20/&&/34/)'
878デフォルトの名無しさん
垢版 |
2018/03/11(日) 10:58:35.24ID:tN+YLJlR
ありがとう 
()はきがつかなかった・・
879デフォルトの名無しさん
垢版 |
2018/05/23(水) 20:10:48.40ID:Au5e7VGg
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

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

Cygwinのshが重かったのはご存じの通りforkが原因だ。
気になるならVirtualBox等でlinux環境を構築してその上でテストしてみればいい。
886デフォルトの名無しさん
垢版 |
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];
}
2018/12/22(土) 02:57:46.65ID:kZtDaodg
length(arr) でダメなの?
888デフォルトの名無しさん
垢版 |
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
再帰を使う以外に方法があれば、
と思い質問した次第です。
889デフォルトの名無しさん
垢版 |
2018/12/22(土) 21:58:49.47ID:b6CiPLFa
要素を追加するときに
ノード毎に集計値が必要ならそれぞれのノード毎の集計値を保存しとけばいい
そうすれば集計しなおす必要ない

超速いハズ
集計しないからな
890デフォルトの名無しさん
垢版 |
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)
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)で続ける深さを決めて)
いけるように思うが、だったら再帰するのが素直か。
892デフォルトの名無しさん
垢版 |
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
893デフォルトの名無しさん
垢版 |
2018/12/23(日) 01:05:13.25ID:quoNoaXg
886です。
pとか関係ないパラメータ入れてしまってごめんなさい。
addnode(a, "1-5-1", "connot");
これができません。
a["5"]がスカラーだと言っています。
894デフォルトの名無しさん
垢版 |
2018/12/23(日) 01:15:19.57ID:quoNoaXg
訂正a["1"]["5"]がスカラーの文脈だと言っています。でした
895デフォルトの名無しさん
垢版 |
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]が引っかかっていたようです。
自爆でした。すみません。
896デフォルトの名無しさん
垢版 |
2018/12/23(日) 02:59:04.54ID:quoNoaXg
886です。
親ノード毎?に保存する方法がまだわかりませんが、
明日以降考えます。
みなさん、ご協力ありがとうございました。
897デフォルトの名無しさん
垢版 |
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万あるのなら、関数の引数を出来るだけ減らして
関数内からグローバル変数を直接参照したほうが速くなると思います
898デフォルトの名無しさん
垢版 |
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に格納 されている値が使われる。
2018/12/23(日) 11:43:46.94ID:7N3pX2Wi
>>898
それを踏まえて>>886
> gawk4
とわざわざことわっているんじゃないの?
900デフォルトの名無しさん
垢版 |
2018/12/23(日) 22:29:12.74ID:qffc/3mK
まず入力から多次元配列を読込む処理でも作ってみるか
できるのかがよく分からん

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

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

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

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

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

いまいちこの多次元配列に使い道があるのかどうかが分からない
2018/12/23(日) 23:32:19.00ID:nM/PpEMV
lispが最適
awkは不適
902デフォルトの名無しさん
垢版 |
2018/12/24(月) 01:01:19.83ID:ivcUrO89
https://ideone.com/PFBwQU

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

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

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

switch分のcaseが1つ少なかったから追加しといた
904デフォルトの名無しさん
垢版 |
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
905デフォルトの名無しさん
垢版 |
2018/12/24(月) 15:58:51.02ID:ivcUrO89
なるほど
ありがとう

きっと再利用されるから
気にせず放置でいいのか
906デフォルトの名無しさん
垢版 |
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];
}
}
907デフォルトの名無しさん
垢版 |
2018/12/27(木) 20:01:48.39ID:pQqvXPza
よく分からんが
例えばそれで>>902の入力データなんかを読み込めたりするのか

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

何次元になるか不明な入力データの場合
どうやれば格納できるかよくわからんんかった
908デフォルトの名無しさん
垢版 |
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
2019/01/01(火) 00:00:01.96ID:7rl7mk2H
2019年もawkのお世話になります
2019/02/05(火) 18:58:36.44ID:9Z2hbdGL
60くらいの教授が40年くらい前にAWKでアセンブラ作ったとか言ってたんだけど
当時に既にあったということと当時から小規模なコンパイラなら作れるくらい高性能だったことに驚いた
2019/02/05(火) 19:10:49.73ID:dIIT7BCG
アセンブラをコンパイラとは呼ばないが
912デフォルトの名無しさん
垢版 |
2019/02/06(水) 10:31:17.59ID:+qagyc5o
aho
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

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

具体的にはBEGINの中で

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

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

もしファイルがすでにあったら処理は終了、無ければ以後の処理をそのファイルにリダイレクトする、という感じです。
2019/02/24(日) 00:16:02.91ID:Cwr1i6xY
if(getline<fn!=-1)exit
とか?
2019/02/24(日) 11:45:53.93ID:FuDjIOWV
>>916
できました!ありがとうございます!!
918デフォルトの名無しさん
垢版 |
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;
}
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) の判定を行う順序が逆。
920デフォルトの名無しさん
垢版 |
2019/03/21(木) 14:19:16.55ID:pGDO/F2C
>>919
ありがとうございます。
そっか。returnがいるんですね。
perlだと最後はreturn省略可能だけどawkは省略不可みたい。
あと、引数名も間違っていました。
正しい答え出ました!
2019/03/21(木) 21:25:33.68ID:ZeSQsBE1
それぐらいの処理は、Ruby で作れ!
2019/03/21(木) 23:54:47.78ID:7AyLRSvD
オーク英雄物語 〜忖度列伝〜
https://ncode.syosetu.com/n8418ff/1/ 👀
Rock54: Caution(BBR-MD5:0be20a4887bc3d3353f527d3636c44e3)
2019/04/01(月) 17:01:28.78ID:nwflCE8J
>>921
awkの方がいいときもある

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

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

理由
俺が慣れてるから。
2019/04/01(月) 22:48:54.89ID:0AqZLgzF
Perlはまぁ慣れ以外に使う意味はあまり見出せない。
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 は、最初から入っているけど
2019/04/02(火) 10:00:50.55ID:USFH8Mum
>>926
死ね
2019/04/02(火) 10:29:57.68ID:egwP5Lwa
Perl脳だとdieなどと言いたがるんかね。
929デフォルトの名無しさん
垢版 |
2019/04/02(火) 12:24:56.71ID:exqjvsIl
Perl die好き
2019/04/02(火) 12:34:58.56ID:m0agfZtU
931デフォルトの名無しさん
垢版 |
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環境が想定されるようになっています。

そして新たに名前空間が実装されています(詳細はマニュアルを参照とのこと)。
932デフォルトの名無しさん
垢版 |
2019/04/17(水) 17:19:50.38ID:fsOEjVgH
sedとawkで簡単にできることを
他の方法でやってるアホを見ると優越感に浸れるよな
2019/04/17(水) 21:27:37.50ID:Cw3S472M
5.0.0じゃなくて4.3.0でいいじゃんって更新内容だな・・・
2019/04/17(水) 23:57:17.65ID:t5VcExa0
今時っぽく定期的にメジャーバージョンアップしていく作戦?
そろそろAWKCARD印刷してみようかな…
935デフォルトの名無しさん
垢版 |
2019/04/18(木) 00:37:48.90ID:y8/6ebia
>>932
簡単な変換なのにWindowsとかでいきなりExcelでやろうとしちゃう人を見るとそこまでせんでも良いじゃないかとは思ってしまうな。
まあ日頃Windowsで事務処理的な事している人からすればそれ以上最良で分かりやすい環境はないんだろうけどな。
なんでもかんでもそれでやろうとして余計に分かりづらく複雑になってうまく行かずにハマっているのを見ると哀れに感じる。
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}

(半角だと書き込みエラーになるので全角に変換)
2019/06/01(土) 01:15:01.39ID:QInzSHhj
>>936
あれ変換おかしい
{} → ()
2019/06/01(土) 05:25:56.80ID:cEFw76xP
ふふふ知ってた。
2019/06/05(水) 00:27:37.11ID:/Z5C9xDG
The AWK Programming Language (の邦訳本) から入ったので知ってはいるけど、
エスケープ文字を考慮してコードを書くのが面倒なので極力避けてるな。
文字列が正規表現へ「型変換」されるときの振舞いについて、本には一応書いてある。
940デフォルトの名無しさん
垢版 |
2019/06/19(水) 04:52:26.36ID:tVNS+22r
【出資】松本卓朗 人工知能詐欺【注意】
https://rio2016.5ch.net/test/read.cgi/rikei/1560859403/
2019/06/30(日) 05:07:43.82ID:1ALBmyOB
AWKが巨大なテキストファイルを処理できないみたいな話を知ってる方いらしゃいますか。
大体1.4GiBくらいのファイルをAWKで編集しようとすると「ファイルの空きがない」みたいなエラーが出るので。
942デフォルトの名無しさん
垢版 |
2019/06/30(日) 12:11:04.21ID:QU2Ls1X6
UNIXというかまともなPIPE実装されてるOSならそんなことはないが
WINDOWSとかいうアホなOSだと出るだろうね
2019/06/30(日) 12:19:57.44ID:pDzbN/vc
「ファイルの空きがない」っていうメッセージは "No space left on device" の事?
2019/06/30(日) 15:28:11.21ID:o/HVRPYj
>>942
コマンドラインでリダイレクト使ってればそうかも知れんが
スクリプト内で出力先を指定してたらわからんぞー
2019/06/30(日) 21:02:48.49ID:1ALBmyOB
>>942
なるほど。
946デフォルトの名無しさん
垢版 |
2019/06/30(日) 21:56:09.12ID:HbSturrb
>>941
改行コードの違いにより全体が長い一行と認識されてしまい・・・なんて事はないか?

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

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

まあ、RubyVM 起動時に、そのアプリが使うメモリのサイズを、指定できると思うけど。
JavaVM には、そういうオプションがある
952デフォルトの名無しさん
垢版 |
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..
953952
垢版 |
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
2019/07/03(水) 06:22:07.32ID:IYY9eTuR
gawkなら時間関数群あるんじゃ。
2019/07/04(木) 01:05:04.08ID:vxwYTSOB
ここいいね。Web上でawkの実行とその結果が見れるサービス。
https://www.tutorialspoint.com/execute_awk_online.php
2019/07/05(金) 19:29:13.12ID:p9vBdDGq
           fi
          、Jj
           Й 
         /⌒ヽ
         l_ 0..0
          }{ l冊
        -=-v=-
        }{ 彡ミノ{
        }{ 非 }{
        匁OTO)匁
         }{ }{
         }{ }{
         及 及
957デフォルトの名無しさん
垢版 |
2019/08/05(月) 11:42:29.38ID:N86fIT/u
Windows10 のコマンドプロンプトで awk を使いたいです。
vector で検索するといろいろでてくるのですが、
これがお勧めっていうのありますでしょうか。
日本語も扱えるのがいいです。
よろしくお願いします。
2019/08/05(月) 11:44:36.72ID:MNXFY7cg
Windows 10なら、標準機能のWSL(+Ubuntu)をインストールするのが一般的
vectorとかもうあんなのいらない
959デフォルトの名無しさん
垢版 |
2019/08/05(月) 12:04:58.85ID:N86fIT/u
WSLって使ったことなかったんですけど、
ググってみたらもう Win で Linux が標準で使えるんですね。
これなら cygwin とかも、もういらないのかな。
情報どうもです。
2019/08/05(月) 12:06:14.91ID:MNXFY7cg
cygwinもいらない。遅いし互換性低いし
961デフォルトの名無しさん
垢版 |
2019/08/05(月) 12:06:57.54ID:NOA3rn3w
WSL って pro だけ?
home だったら付いてない?
msys とか入れれば解決するけど
962デフォルトの名無しさん
垢版 |
2019/08/05(月) 12:18:30.48ID:N86fIT/u
マイクロソフトもビルゲイツがいなくなって
多少は良い事もするようになったかな。
963デフォルトの名無しさん
垢版 |
2019/08/05(月) 12:33:33.70ID:LhsszH09
>>962
いや、まだ足りない。何でもかんでもWindowsの上で動くようにしているだけだしね。すると何を動かすにしてもWindowsのライセンス料が掛かる。
まあ仕方のないことではあるがな。
2019/08/05(月) 12:42:57.45ID:MNXFY7cg
WSLはhomeでも使える。WSL2も使えるようにすると発表があった。
2019/08/05(月) 12:59:49.23ID:MNXFY7cg
>>963
> 何でもかんでもWindowsの上で動くようにしているだけだしね。すると何を動かすにしてもWindowsのライセンス料が掛かる。

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

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

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

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

正規表現無しの簡潔な部分はperl -lane より短くて最高
2020/08/02(日) 11:03:40.06ID:mglN/rTr
>>982
短かいのが正義!とは思わないけど、
perlと違ってSUSで定義されてるのがありがたいね。
984デフォルトの名無しさん
垢版 |
2020/08/02(日) 17:25:58.24ID:IlYSPDQE
ファッションでというと、写真撮影しているオシャレな感じのスタジオの受け付けにマックがあったのだが画面を見るとWindowsだったというのを見たことがあるな。
エミュでWindows動かしてそこで業務用のソフト動かして受け付け業務に使っているということだが、客から見るとディスプレイの裏側が主に見えるのでAppleマークが見えると。
2020/08/02(日) 19:24:52.35ID:mglN/rTr
>>984
誤爆?
986デフォルトの名無しさん
垢版 |
2020/08/03(月) 02:35:57.38ID:iGTWfWuc
>>985
>>981
987デフォルトの名無しさん
垢版 |
2020/08/03(月) 09:51:55.82ID:3aFKjSal
Aho
2020/08/03(月) 10:16:40.93ID:ZKD4yCvc
AWmae no Kachan debeso
989デフォルトの名無しさん
垢版 |
2020/08/03(月) 20:08:52.49ID:iGTWfWuc
awk の a は本当に Aho の略(人名)
2020/08/10(月) 14:00:21.38ID:l5zwQhnu
>>982 >>983
何事もないように書いてるけど実は1年空いてる
991デフォルトの名無しさん
垢版 |
2020/08/10(月) 14:01:04.64ID:l5zwQhnu
即レスも大概だが亀レスも大概やな!
2020/08/10(月) 22:16:10.09ID:DZgybkpe
AWesome Kame res
2020/08/13(木) 10:26:07.54ID:uwSNr/lm
真のawkerは多くを語らない。
awkを語らない…ナンチャッテ!
994デフォルトの名無しさん
垢版 |
2020/08/13(木) 16:09:43.86ID:GqR68DDy
は?
995デフォルトの名無しさん
垢版 |
2020/08/14(金) 13:41:25.37ID:H4TUvcZb
【審議中】
    ∧,,∧  ∧,,∧
 ∧ (´・ω・) (・ω・`) ∧∧
( ´・ω) U) ( つと ノ(ω・` )
| U (  ´・) (・`  ) と ノ
 u-u (l    ) (   ノu-u
     `u-u'. `u-u'
996デフォルトの名無しさん
垢版 |
2020/08/14(金) 15:50:04.19ID:XKPWE/tl
http://www.manabu-oshieru.com/hyakunin/064.html
997デフォルトの名無しさん
垢版 |
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
2020/09/14(月) 11:15:45.20ID:S/jhW9z+
bcはインストールされてないことが時々あるんで使わないね
まあその点はawkの方がマシだろう
999デフォルトの名無しさん
垢版 |
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を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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