トップページ⇒tech
665コメント224KB

awkについて語るスレ $2

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/02/23(金) 23:55:42
腐っても鯛? 騏��も老いては駑馬に劣る?
三人の碩学が生み出したスクリプト言語AWKについて語るスレ

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

◆ 関係スレ
シェルスクリプト相談室
http://pc10.2ch.net/test/read.cgi/tech/1112553783/
AWKでCGI
http://pc10.2ch.net/test/read.cgi/php/1171804314/
【sed】シェルスクリプト総合@LINUX Part2【awk】
http://pc10.2ch.net/test/read.cgi/linux/1154578200/

◆ 参考
The AWK Programming Language (Brian Kernighan):
ttp://cm.bell-labs.com/cm/cs/awkbook/index.html

GAWK (GNU Projedt):
ttp://www.gnu.org/software/gawk/
0615デフォルトの名無しさん2011/06/20(月) 18:37:26.17
gawkでBINMODEを設定すればバイナリーの入出力ができるのはわかるのですが、
入力されたバイナリーを16進ダンプして表示するにはどうしたらよいでしょうか?
od等の外部コマンドを使う意外に方法があればお教えください。
0616デフォルトの名無しさん2011/06/20(月) 19:17:07.50
printf("%02x\n", $1);
0617天使 ◆uL5esZLBSE 2011/07/05(火) 00:15:13.83
二度と話かけんなよ
お前らってどうみてもゴミだよな
0618デフォルトの名無しさん2011/07/06(水) 14:04:55.24
ゴミんなさい
0619デフォルトの名無しさん2011/07/14(木) 23:55:15.84
>>595
gawk4.0.0でa[0][0]=1も可能になったじゃないか
0620デフォルトの名無しさん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
0621デフォルトの名無しさん2011/07/30(土) 19:53:38.97
ddd 20 ではないかと思うがこんな感じかな
awk '{a[$1]+=$2} END {for (b in a) {print b " " a[b]}}' | sort
0622デフォルトの名無しさん2011/07/30(土) 23:15:27.52
Gawk4ならPROCINFO["sorted_in"]の設定で最後のsortが要らなくなる
06236202011/07/30(土) 23:22:20.03
>621
ありがとうございます!うまくいきました。
0624デフォルトの名無しさん2011/07/31(日) 15:24:48.76
gawkはもう別言語なイメージ。普段mawk使ってると
0625デフォルトの名無しさん2011/08/16(火) 22:48:21.64
ここって生きてますか?
0626デフォルトの名無しさん2011/08/18(木) 01:56:26.63
生きてますん
0627デフォルトの名無しさん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
アイウエオカキクケコサシスセソ
ココココサフサコココココ
ココココサフサココココ
ココココサフサコココココ
ココココサフサコココココ
サフサフサフサフサフサ
ココココサフサコココココ
ココココサフサココココ
ココココサフサコココココ
ココココサフサコココココ
サフサフサフサフサフサ
06286272011/08/19(金) 01:00:20.60
TEST.DATは、空白が入っています。
専ブラのポップアップをコピペして下さい。
0629デフォルトの名無しさん2011/08/19(金) 06:26:54.92
ウチに帰ってから調べてみるよ
0630デフォルトの名無しさん2011/08/19(金) 11:02:41.54
>>627−628
cygwinのawk(GNU Awk 3.1.8)で動くけど、どうなるはずがどう動かないと言っている?
>627のtest.datなら、当然「ソ」だけが変換されるけど。
0631デフォルトの名無しさん2011/08/19(金) 11:55:06.25
(CygwinならUTF8じゃないとうまく動かないけど)Shift JISで動作させたいってことかな?
事前にTEST.DATをnkf -wに通したら駄目かな。
06326292011/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やってリダイレクトしたファイルは正常な結果が出るよ。
リダイレクトしないでコマンドプロンプトに表示させると化けるけど。
0633デフォルトの名無しさん2011/08/19(金) 23:18:25.14
EUCなら半角カナもうまくやってくれるんだが…
0634デフォルトの名無しさん2011/08/24(水) 08:07:37.54
gawkはガンガン機能を拡張してるけど、
そろそろOOP対応してくれないかな。
awk++とかあるけど、標準でOOPできれは便利。
0635デフォルトの名無しさん2011/08/24(水) 22:44:37.24
> OOP
...もはやawkでやる意味が無いw 他にいくらでもある別の言語でいいじゃん
0636デフォルトの名無しさん2011/08/25(木) 01:14:17.45
awkに在ると便利かもと思うのは参照値くらいかな

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

でもあんまりややこしいことやるならPerlでいいから必須ではないね
0637デフォルトの名無しさん2011/08/25(木) 02:28:23.99
> 関数を呼んだり

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


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

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

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

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

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

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

まぁ、それやるくらいならGAWK自体に変更を加えて再コンパイルしろってことかもしれないけど。
0663デフォルトの名無しさん2011/11/15(火) 01:44:31.01
PとかR使え言われると思う。
0664デフォルトの名無しさん2011/11/15(火) 01:58:32.43
>>662
ttp://www.gnu.org/s/gawk/manual/html_node/Dynamic-Extensions.html
じゃダメ?将来的にさらに拡張される可能性はあるみたいだけど
0665デフォルトの名無しさん2011/12/09(金) 00:35:09.18
最近awkcardを知って座右に置いてるのだが、日本語版って存在するのだろうか。
■ このスレッドは過去ログ倉庫に格納されています