awkについて語るスレ

1たれ
まぁなんだ、Perlがあるからそんなもんいらんというのが結論かも
しれんが、awkにはPerlに無いエレガントさがある。
その辺愛好する人の発言きぼんぬ
ニダ
処理系の無料/有料
文法の具合と特徴すらわからーん
>>3
ベル研謹製の本紹介ページでも見れ
http://cm.bell-labs.com/cm/cs/awkbook/
5デフォルトの名無しさん:02/06/09 09:56
BASICの次にやったのがAwkでした。
C言語の勉強に最適だと思いますよ。インタプリタだし。
ただし、正規表現と文字列型がないとやっていけなくなる罠。
素人にはお勧めできない。
6デフォルトの名無しさん:02/06/09 10:06
>>1が「awk」をどう読むかによってスレの流れは変わる。
7デフォルトの名無しさん:02/06/09 10:06
>>5
漢字違うよ
awkの守備範囲はawk使うのが吉
9デフォルトの名無しさん:02/06/09 10:16
入力ファイル無しで動かしたいときってどうしてる?
今は
echo aaa | awk -f ~.awk
ってやってるんだが、もっとスマートな方法ないんかね
awk -f ~.awk /dev/null でしょ
GNU awk なら /dev/null は不要
awk -f hoge.awk[RET]
aaa

ってことじゃないの?
12デフォルトの名無しさん:02/06/09 10:36
>>1 は?
1310:02/06/09 10:39
awk -f ~.awk <<EOF
そーだったのか!
EOF
149:02/06/09 10:52
具体的には
testdata000001
testdata000002
・・・
・・・
testdata009999

ってのつくるのに
===hoge.awk====
for(i=0;i<10000;i++)
{
printf("testdata00%04d\n",i);
}
===============

echo aaa | awk -f hoge.awk > output.dat
と実行してるがなんかダセェ・・・
viからawk使うのがたまらん
しかし10行程度の修正だと
手で打った方が早かったりする罠
>>14
% for i in `seq 0 10`; do printf "aaa%3d\n" $i; done > file
こんなのとかダメ?
# zsh だけど他のは知らん
1716:02/06/09 11:39
bash でもできた。
でも zsh ならもっと簡単なのが多分ある。。
zsh
printf "testdata00%04d\n" {0..9999} > output.dat
19デフォルトの名無しさん:02/06/09 11:52
gawkの日本語パッチはどうなってるのかな。
教えてエロい人!
20たれ:02/06/09 12:44
漏れはNTなので、mawkを使ってるが。
ちなみに入力ファイルなしのときは、すべてをBEGIN{}のパートに
入れてしまう。
21たれ:02/06/09 12:48
しかし、漏れはトッパンの「プログラミング言語AWK」を買っておいた
ので助かってるが、トッパンがつぶれて以後マトモな教科書ってある
んだろうか。
22デフォルトの名無しさん:02/06/09 13:32
アホが作った言語。
23るびきち:02/06/09 14:22
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> awk=あほ
24デフォルトの名無しさん:02/06/09 19:38
>>21
AWKの教科書なんて、man awkで十分だよ。
2524:02/06/09 19:46
一番多いのは、/^$/{......}かな。

Windowsだと、ファイル1つでやれるから楽チン。
おれ最近、

『プログラミング言語AWK』
発行 株式会社シイエム・シイ 出版部
発売 シーブック24ドットコム株式会社
ISBN4-901280-40-6
C3055 \3300E

を買ったよ。買ったのは、ラオコンだったかな。あとは、

オライリー・ジャパン『sed & awkプログラミング』
ISBN4-900900-58-3

だな。

ASCII『AWKを256倍使うための本』
ISBN4-7561-0612-3
C3055 \1165E

というのもまだ買えるね。

トッパン潰れたのか。良書を結構出してたと思ったが。
良書なんか出してたらダメなんだろうな、今の時代。
27たれ:02/06/09 20:50
>>23
まぁたしかにAho先生も制作者に入ってるわけだが( ・・)/
28たれ:02/06/09 20:53
>>26
トッパンが出してた本の再販ができたのはめでたいことではある。

ASCIIの256倍ははっきり言って裏技集に近いので、初心者には
お薦めできない。

しかし、漏れは大学の研究室に入るなりsedと正規表現の特訓を受けたので
awkもどうにか使えてるが、今時の若いもんはどうしてるんだろう。
>>28
コマンド組み合わせるより Perl 使っちゃった方が手っ取り早い。
sh の構文覚えるのがちょっと大変なんだよね。
空白一つでエラーになったりするのが。
30デフォルトの名無しさん:02/06/09 21:36
正直、perlがあるのに積極的にawk使う意義って何かある?
何か意義を見いださないと使おうっていう気には・・
>>30
軽い。用途に合わせて適切に道具を選ぶのがカッコイイ。
32デフォルトの名無しさん:02/06/09 21:43
>>30
今日、旧式SUNの不具合見に行ったら、
ディスク使用量をみるにもdu/lsがサイズでソートできない。
Perlもlessもないって状況。
du -k | awk '{printf("%08d %s\n", $1, $2);}'|sort
こんな風にしてメールスプールの使用量のでかいユーザーの
順位表を作ってきた。
GNUツールなしのSUNとかってまだまだある。
>>32
そういや最近の Solaris も /opt/fsw /opt/gnu はオプションインストールだしね。
34たれ:02/06/09 22:22
>>30
漏れの場合、「awkを覚えた後になってPerlが登場した」てのが一番でかいな。
Perlが最初に出てきたときに見て、「これならawkでも十分」と考えて以降Perlを
使ったことがない。CGIとかいじる仕事でもしてれば別だったかもしれんが。
35デフォルトの名無しさん:02/06/09 22:36
あと、WINDOS上ではPerlの漢字処理の不具合があるってことと、
PerlやRubyはフロッピー一枚では持ち歩けないがawkでは可能って
ことがある。
awkに後方参照と拡張正規表現がほすい
37デフォルトの名無しさん:02/06/09 23:39
>>24
awk聖書を知らないのか?
38デフォルトの名無しさん:02/06/09 23:40
>>28
初心者は裏技から入る
awkはCを使えれば覚えること少なくて済むのがイイ
40たれ:02/06/10 01:15
>>39
しかしawkを覚えてもcは使えないと言う罠
おまけにあらゆる事をawkで済ましてしまうのでタダでさえ知らないcを
さらに忘れてしまうという
41AWK猫。:02/06/10 01:32
オレのAWK猫。「猫に真珠。」などとくだらないギャグを
言ったせいでPerlを覚えてくれない。はっきり言って
仕事に支障が出ている。済まなかった。反省している。
だからそろそろPerlを覚えて欲しい。ver.4.36で構わな
い。頼む。
42デフォルトの名無しさん:02/06/10 01:47
Perlスレが上にあるのでちょっと・・・
Perlを覚えたらawkなんて覚える必要はないよね?
43デフォルトの名無しさん:02/06/10 01:49
二次元配列はawkの方が直感的
44shige:02/06/10 02:01
            __,,,,_
            /´      ̄`ヽ,
            / 〃  _,ァ---‐一ヘヽ
         i  /´       リ}
          |   〉.   ‐-  -‐ {!
          |   |    ー・‐ く‐・‐|
           ヤヽリ ´゚  ,r "_,,>、 ゚i
         ヽ_」     ト‐=‐ァ' !   / ̄ ̄ ̄ ̄ ̄ ̄ ̄
          ゝ i、   ``二´' 丿 < Rubyさいこー
              r|、` '' ー--‐f´    \_______
         _/ | \    /|\_
       / ̄/  | /`又´\|  |  ̄\


45デフォルトの名無しさん:02/06/10 02:03
>>42
フロッピー一枚持って外出すればどこででも
使えるawk。
対して
ダウンロードして環境変数を
設定せにゃならんPerlは他人のPCを借りて
使う場合にめんどくさい。
MSインストーラ版だとレジストリも汚染される。
46shige:02/06/10 02:04
AWKなんて過去の遺物、いや汚物
    ゝ、,,_  . . . . . , ./;::::;;;;;;;;/  ,,i/'''""""''''‐- 、ヾi   ;;;;;;;;;;;;;;;;;;ヾ;;;;;;;;;;;;;;;;;;;i;;;;;;;;;;;;;i;;;;:::::ヽ;;;;;;;;;;::::::;;;;i
  /. . . . "''''''':":":~i ;;;::l::;;;;;;;/ ,"    @    ヽ、   ;;;;;;;;;;;;;;;;;;;ヾ、;;;;;;;;;;;;;iヾi;;;;;;;;;i;;;;;;:::::ヽ;;;;;;;;;:;:::;;;;i
  ヽ. . . . . . . . : : : : : :i ;;:il::;;;;;;i  ゝ、,,,,,,,____      ヽ    ;;;;;;;;;;;    ヾ、;;;;;i  i;;;;;;;i;;;;;;;;:::::ヽ;;;;;;;;;;;:;;;;i
   ´"ヽ. . . : : : : : : : i ;;;i i:;;;;;;i ,,,,;;;;;;;;;;;;;;;;;~""''‐---‐"       _、-- 、 "゙'  l.i;;;;;;i;;;;;;;;;:::::i i;;;;;;;;;;;;;;;;i
=-''''""~~ヽ___..,,-‐''ヾ";;;;i i;;;;;;i,,;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,,,,         ",, @ ~"' 、 !;;i;;;;;i;;;;;;;;;;:::::i i;;;;;;;;;;;;/
     /:::;;i ヽ";;;;;;ヾ;;;;,i ヽ、i;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,         ~"''~、,,_,,) .i;;i;;;/;;;;;;;;;;;::::i .i;;;;;;;;;;/
     /::;;;;; i  ヾ;;;;;;/ヽ、;i ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;                i;i;/、;;;;;;;;;;;;::/ i;;;;;;;;/
    r"、;;;;;;/ヽ  "''i  ` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;    r--、_    ;;;;;;;;;;;;  /、,,ヾ;;;;;;;;;/ /;/
   i' ;;;; i ;;i::;;;;;i゙ヽ、__ヽ    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;    i:::::::::::)  ;;;;;;;;;;;;;;;;;;;;  ヽ;;;i;;;;;;;/ヾ/
   /! ;;;;; i..;i:;;;;;i:i;;;;;;;;;i_、'    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;.    i::::::::/  ;;;;;;;;;;;;;;;;;;;;;;;   !;/;/  ヾ
  /.i ;;;;;;;; i.i:;;;;i::i::;;;;;;;;;i ヽ    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;     i:::::/  ;;;;;;;;;;;;;;;;;;;;;;;;   i  rヽ   ヾ
ヽ i';;;i ;;;;;;;;; i'""i:::i::::;;;;;;;i、  ヽ    ;;;;;;;;;;;;;;;;;;;;;;.       ゝ"  ;;;;;;;;;;;;;;;;;;;;;;    ,' i' ;;; i   ヾ::,r-
;;;;ヽ,r'i, ;;;;;;; i  i:::ヽ:::::;;;;ヽ  `i'‐、                   ;;;;;;;;;;;;;;;;;   ,,x' i' ;;;;;; i   /;;;;
;;;;;;ヽ-' ;;;;;;;, i  \ヽ:::::::::ヽ  i l"'-、_                    _,,,-_'"  i ;;;;;;;; i  /;;;;;; /
;;;;;;;;;;;;;;;;;;;;;;;; i   \、::::::::ヽ  ヽ   "''-、_              _,,..-''" ,,;; /ヽ_i ;;;;;;;; i /;;;;;;;; /ヾ
自分もawkはperlを先に覚えたんでぜんぜんやらなかったな。
その前にsedを使ってたのでperlの方がなじみやすかった
ということもある。
4847:02/06/10 02:29
まだDOSの頃の話だけど awk は N88-BASIC や Perlより実行速度が
2倍程度遅かったというのも awk をやらなかった理由の一つだったな。
今と違ってCPU性能が低いので割と大きな問題だった。
>>46
その勢いで Ruby から begin を無くして下さいな。
>>48 その代り、Perlはダスエキスパンダーとか使わないと走らなかった
51デフォルトの名無しさん:02/06/10 22:56
awkでやるかperlでやるかで悩むことってあんまないな。
むしろexcelでやるかどうか一瞬迷う方が多い。
52shige:02/06/10 23:44
go64
53デフォルトの名無しさん:02/06/10 23:49
多くを語ることなかれ。
54デフォルトの名無しさん:02/06/10 23:51
awk をやりすぎると風邪引くんだってよ。
おお、くしょん。
なんて。
55デフォルトの名無しさん:02/06/11 01:18
開発環境に標準でawkはあるがperlはない、という状況。
4,5人ならいいけど何十人分のwinマシンにperlのインストールなんか
やってらんない。
ちょっとしたフィルタがほしいときにCで作るとバイナリを配布することに
なるがawkならたんなるテキストなので気兼ねがいらない。
CVSでソースと一緒にしておけばみんなが勝手に更新するのでらくちん。
でも、こんな環境は特殊かも。
56デフォルトの名無しさん:02/06/11 14:32
唐突にAwk関連の支援ツールとか紹介してみたり。

おーくの友達
ttp://homepage2.nifty.com/mozu/winToy/winToy.html
copal
ttp://homepage1.nifty.com/kaityo/copal.html
clipsed
ttp://hp.vector.co.jp/authors/VA021567/
58デフォルトの名無しさん:02/06/12 21:44
awkはいまだに関数つくったことないな
59木村 キタキタマシーン:02/06/12 21:46
>>54
ワラタ
awkってなんて読むの? アォク? エゥク?
61デフォルトの名無しさん:02/06/14 10:25
>>60
オークでしょう。
多くは語れない
63たれ:02/06/15 00:10
多くは聞かないでくれ
64デフォルトの名無しさん:02/06/15 00:16
不気味にたたずむ謎のホ tail awk ラ。
awk の怪奇現象が起こるという。
その awk にはなにが潜んでいるのか。

65デフォルトの名無しさん:02/06/15 16:08
ファイルを1行ずつ読み込んでなにかする処理の場合、
PerlやRubyやPythonより簡単に書けるのでは?
ファイルをオープンして、読み込んで、って所を書かなくていいから。
>>65
CSVのように何たら区切りファイルなんかの扱いも楽だよね。
PerlもRubyも-aオプションあるけどね。
68mu:02/06/17 02:09
>>55
ファイルサーバ上のPerlを使うんだったら一台一台にインストールする必要は
ないぞもし。
69shige:02/06/17 03:03
Rubyも小さいよ
70デフォルトの名無しさん:02/06/17 03:04
shigeの胸も小さいよ
71shige:02/06/17 05:01
oioi
出先の雲丹クス屋のおっさん
何でもこれとシェルでパイプして片づけやがんの・・・・  (´д`;)
いや確かにそう言うものなんだけどさ
「何でも」の種類によるな
>>72
尊敬すべき old type だな。
>>72
それで仕事が早くなるならいいね。
つーか、そうなりたい。
どきどきawk対決先手オレ

・ファイルAAAAAを使ってファイルBBBBBを作ってね。
 制限時間1分

【AAAAA】
gksid
・・・
・・・
・・・
resdf

【BBBBB】
SELECT * FROM tableA WHERE id = 'gksid';
・・・
・・・
・・・
SELECT * FROM tableA WHERE id = 'resdf';
77デフォルトの名無しさん:02/06/19 19:31
>>76
awk '{ printf("SELECT * FROM tableA WHERE id = '%s';\n",$1)}' AAAAA>BBBBB
sed "s/.*/SELECT * FROM tableA WHERE id = '&'/" AAAAA > BBBBB
79デフォルトの名無しさん:02/06/21 02:14
今更awkですか。
80デフォルトの名無しさん:02/06/21 03:00
>>79 コラー!! awkヲナメルナヨッ!!
・ファイルAAAAAを使ってファイルBBBBBを作ってね。
 制限時間1分

【AAAAA】
gksid 13566
・・・
・・・
・・・
resdf 94564

【BBBBB】
SELECT * FROM tableA WHERE id = 'gksid' AND num = 13566;
・・・
・・・
・・・
SELECT * FROM tableA WHERE id = 'resdf' AND num = 94564;
83デフォルトの名無しさん:02/06/21 03:41
なんとなくPerl

perl -ane "printf \"SELECT * FROM tableA WHERE id = '%s' AND num = %s; \n\",@F" AAAAA>BBBBBB
awkについては多くを語るまい。
8578:02/06/21 16:23
sed "s/ /' AND num = /;s/^/SELECT * FROM tableA WHERE id = '/;s/$/;/" AAAAA > BBBBB

つーか>>78は;見落としてたよ。
86デフォルトの名無しさん:02/06/21 21:01
・ファイルAAAAAとBBBBBを使ってファイルCCCCCを作ってね。
 制限時間1分

【AAAAA】
gksid
・・・
・・・
・・・
resdf

【BBBBB】
13566
・・・
・・・
・・・
94564

【CCCCC】
SELECT * FROM tableA WHERE id = 'gksid' AND num = 13566;
・・・
・・・
・・・
SELECT * FROM tableA WHERE id = 'resdf' AND num = 94564;
8778:02/06/21 22:28
paste -d' ' AAAAA BBBBB |
sed "s/ /' AND num = /;s/^/SELECT * FROM tableA WHERE id = '/;s/$/;/" > CCCCC

つーか、宿題は宿題スレでやれ。ぼけなす。
awkでやれよう
89awk初心者:02/06/22 12:19
>>81
awk 'BEGIN{FS=" "};{printf("SELECT * FROM tableA WHERE id = '%s' AND num = %s;\n",$1,$2)}' AAAAA > BBBB
>>89
FSは必要ないと思う。
ちなみにgawkだったら-Fオプションで指定できる。
awkの制限でハマッタ人とかいる?
入力レコード長が3000byteまでなんてビクーリしたよ
fieldは100までだっけ?
保守sage。
hoshu
ほしょ
しゅしゅ
保守
保守
gawkて何やねん!! (ムキィィィ---
perl使って欲しいから本貸してやったら
100ステップに20回位system使いやがる
オッサン(UNIX屋)
にオールド魂を見た!!! (鬱
エロ画像連番展開スクリプト。
URLと連番になる i は書き換えてね!!
頭に0を付加するのがミソです。
ぼくはこれをMeadowの中で実行して、できたURLをiriaに送っています。

BEGIN{
for( i = 1; i <= 100; i++ ) {
if ( i < 10 ) { i = "00" i }
else if ( i < 100 ) { i = "0" i }
print "http://hogehoge.com/hoge/images/gazou" i ".jpg"
}
}
>>99
awkは構文がようわからん。
i = "0" i って連結?
>>99
Cとかで、
for(i = 1; i <= 100; i++)
 printf("http://hogehoge.com/hoge/images/gazou%03d.jpg", i);
じゃ駄目なわけ?
>>101
コンパイルしなくても良いからじゃない?

まあ、awkでも printf 使った方が簡単だと思うけど。
10399(Awk初心者):02/08/14 09:42
(゚Д゚)ガーン
>>99
iriaに送るのになんでawkを使う必要があるんだ?
iriaでファイル展開できるだろ。。。
10599:02/08/15 01:59
>>100
コンカチネートであります。

>>104
(゚Д゚)ガーン

printfが使える処理系って他にもperlやschemeとかあるしね。
Meadowでやるならelispだろ

(do ((i 1)) ((> i 10))
(insert (format "http://hogehoge.com/hoge/images/gazou%d.jpg\n" i))
(setq i (1+ i)))
108awk初心者:02/08/15 21:12
>>106
まあそうなんですけどね。
>>107
なるほど。elispは全然わからないんですが、
elispで書くとこうなるんですね。
頭に0を付けることまでやっているんでしょうか……。

しかし、この板の人は親切ですね。
>>108
> 頭に0を付けることまでやっているんでしょうか……。
ああ、それは忘れた。>101と見比べれば分かるだろ。
110デフォルトの名無しさん:02/08/16 03:27
elispにもprintfあった気がするが。
formatはlisp知ってないとわからんと思う。
XEmacs 21.4 (patch 6)とGNU Emacs 21.1.1にはなかったんでな。Meadowは知らん。
それに>107で使ってるformatの書式指定もprintfと同じだよ。

(do ((i 1)) ((> i 10))
(insert (format "http://hogehoge.com/hoge/images/gazou%.3d.jpg\n" i))
(setq i (1+ i)))
11299(Awk初心者):02/08/23 03:48
「sort | uniq -c」みたいなの。
連想配列は便利だね。

{count[$0] += 1}
END{
for( name in count )
print name, count[name]
}
113デフォルトの名無しさん:02/09/08 09:37
csvファイルから特定の列だけ取り出したいときに、
さくっとやっつけるのがよいよね。

excelとか立ち上げないで、あくまでさくっと。
「えーっと」とかもいっちゃだめ。
sage
保守
117デフォルトの名無しさん:02/10/07 20:21
age
>>113
でもCSVって互換性とか無いよね。
エクセルの表をCSVで保存して、それをAWKでちゃんと
読みこめるかは、運だよね。
119デフォルトの名無しさん:02/10/12 12:58
計算プログラムのログ解析や 2D 配列(小)数値データの
簡易解析につかっています。

実験装置のメーター数値を表示させるようなもんですか。

$1== "error" {a[i]=$0;i++}

として、最後に a を表形式で吐き出させています。
簡単使い捨てフィルターがさくさく作れるのはうれしいです。
大抵の環境にもありますしね。
もっとも複数ファイルを処理させるために
sh スクリプトとペアを組ませるのは必須ですけどね。

もっともフィールド数 99 では 2D 配列の計算には
大抵使えません。

awk は坂本文の本で知りました。今は man awk を時々
見て思い出します。
awkを語らず
121デフォルトの名無しさん:02/10/12 14:17
でも, 複数のファイルを同時に必要とするような処理の場合,
パタン-アクション型の構文が生きてこないので, そうすると
別のスクリプト言語でもいいなか, と思ってしまう ...
Ruby!!
(・∀・)モレノ!!
この前見たんです。
同僚が、この最新のAwkというスクリプト言語は、
文字型の数値から本当の数値に自動的に変換されて凄いんだ、
と、そればかりを得意満面に別の同僚に話していました。
別に珍しくもない…
AwkとPerlは実際どちらが、速いのですか?
Delphi !!
>>127
実装による
130デフォルトの名無しさん:02/10/28 02:57
awkの解説サイトってありませんか?
おおくはない。
132デフォルトの名無しさん:02/10/28 11:40
awkを語らずage
あんま知られていないawkを流行らすのもいいかな。
昔はそれなりに流行ってたんだがなぁ…。
知られてないって、sedやgrepと同じくらい超基本だと思うんだが。
/bin/grep
/bin/awk

いつの日か
/bin/perlになる日がくる。
137:02/10/29 22:30
坂本文の本で UNIX 学習したから、 term で
vi と awk, sed です。後別途 sh スクリプト
やりました。

GUI 以外は、大抵これで用が済むように
なっています。

awk が知られていない。。。なんて時代に
なったとは。
138デフォルトの名無しさん:02/10/29 22:33
すでに/bin/rubyですがなにか?
256倍sage
140デフォルトの名無しさん:02/10/29 22:45
Ruby最高!
フィールド切り出しなどは、awkのほうがperlよりはやい。
だから、zshの補完候補作る時にはperlは使われないが
awkは使われる。
142デフォルトの名無しさん:02/11/01 10:11
man gawk より引用

gawk 'BEGIN { print _"hello, world" }'
might print bonjour, monde in France.

冗談だろうかと一瞬悩んだ。
144デフォルトの名無しさん:02/11/01 23:38
awk は、シェルすくりぷと書くとき使う罠。
grep や sed、 各種コマンドと併用しないと,
使いもんになりましぇん。
145デフォルトの名無しさん:02/11/01 23:58
正直、printと $1~しか使ったことない
BEGIN {
 print "保守";
}
Cより先にawkを覚えたので正規表現なしでは生きていけなくなりますた。
よく使うのはGNUのregexです。
二次元配列はawkの方が直感的
直感的と言うより直線的
150デフォルトの名無しさん:02/11/07 22:53
system()使えば、結構いろいろできるからAWKから抜けれん。
system("echo " Data " >" OutoutFile);
とかよくやるしなー。
151デフォルトの名無しさん:02/11/08 00:19
awk で最初に書いてしまったことで、
そこから進歩できなくなった人を知ってます。
>>148
awkとCの2次元配列は同じですか?

awkの2次元配列って、連想配列でしょ。
CやPerlのような本当の配列じゃないよね。
何処で落としたか忘れたけど……
いちおう

#!/bin/awk -f

# tablemaker
# tekezo 11/21 1999
#
# オプション解析は awk のほうでやってくれるので、
# オプションは awk のそれと同じです。
# 例えば、$ tablemaker -F ','
# gawk ならば tablemaker -W copyleft なんてことも…。

BEGIN { print "<table border=\"1\">";}

{
print "<tr>";
for (i=1; i<=NF; ++i){
gsub(/&/,"\\&",$i); # こいつらが、for 文のなかに入っているのは、
gsub(/</,"\\<",$i); # セパレーターとして、"&" とかが指定された
gsub(/>/,"\\>",$i); # ときのことを考えて。
print "<td>" $i "</td>"; # TeX のおかげで実現性があるしね。
}
print "</tr>\n"; # 最後の改行は僕の趣味 :-)
}

END { print "</table>";}

#EOF
awkについては多くを語るまい。
awkはCを使えれば覚えること少なくて済むのがイイ
157デフォルトの名無しさん:02/11/25 22:51
>>150
出力先fileが一つだったら system() 使わなくても pipe でできるよね。

print Date | "cat > OutoutFile"

とか。

sh script の中から awk を呼んで、awk の中から pipe を使って
Unixコマンドを呼ぶ。非常にお奨め出来ない書き方だけど(w
>>150
>>157

それだけなら awk '{ print Data > "OutputFile" }' で、できるだろう。
もうちょい修行せよ。

> sh script の中から awk を呼んで、awk の中から pipe を使って
> Unixコマンドを呼ぶ。非常にお奨め出来ない書き方だけど(w

awk の中から pipe を使うんじゃなくて、awk の出力を pipe に繋ぐ
ようにするよな。その方が普通は効率的。
159157:02/11/26 08:05
>>158
あ、ごめんごめん。思い出しながら書いてたのだが冗長だった。
「print Data > OutputFile としてもうまく行かないな」
と思っていじってるうちに、出力先を文字列にしないと駄目だ(当り前)
ということに気がついたんだけど、そのとき余計な pipe を入れてた。

>awk の中から pipe を使うんじゃなくて、awk の出力を pipe に繋ぐ
うむ。
160デフォルトの名無しさん:02/11/30 02:24
今話題の Objective awk って使い型ご存知の方いらっしゃいますか?
ダウンロードしたけどさっぱり…… (>o<)
>>160
初めて聞く。
オブジェクト指向のスクリプト言語なら
普通に Python や Ruby 使った方が情報多くて楽じゃない?
162デフォルトの名無しさん:02/12/08 05:53
でも何か面白そう。
awkってプログラム言語に近いフィルターって感じだから、
しかもオブジェクト指向が使えるってあたりが。
awkなんてprintで項の入れ替え(一行野郎)ぐらいしか使わないから、
オブジェクト指向とか拡張されてもありがたみが無かったり。
sedと合わせて、どの環境にでもある標準コマンドっぽいのが
一つの売りなんじゃないかなあ。
>163
M$のOSには入って無いぞ
入っていたとしてもWinユーザにパイプだの正規表現だのが使えるわけがない
>>162
“OO”といいつつ、PHP レベルだったりすると萎え。
>>165
最近のWindowsには正規表現を扱えるスクリプトが標準でインストールされているが何か?
>>167
“標準でインストール”されていると“Winユーザでも使える”んですか?
>>168
ユーザーに使える状態になっていることを
“インストール”されている
というのだが。
170通りすがり:02/12/09 12:43
話が噛み合ってないよ
171デフォルトの名無しさん:02/12/22 03:23
MS-awk って MSDN サブスクリプションに入ってますよね。
使わんけど。
172のんべ:02/12/25 11:59
Linux上のgawkで日本語の単語をsubstrしたいのですが、これってバイト単位
でしか指示できないのですか?日本語対応できる方法をご存知の方は教えて
下さい。
 昔日本語対応でjgawkがあったのですが、ダウンロードサイトを見つけ
られません。滅びてしまったのだろうか?
あら、「オーク」って読むんだ、
「アウォック」って、いままで読んでた。

じゃ、sedは何て読むの?
「セッド」?「エスイーディー」?
174デフォルトの名無しさん:02/12/26 01:55
>>173
セド

>>172
Debian にならgawk-ja パッケージにありますね。
http://packages.debian.or.jp/stable-jp/interpreters/gawk-ja.html.ja
で、Debian の人は「Download it!」をクリック、それ以外の人は
[orig.tar.gz] をクリックすれば、オリジナルのソース・パッケージが
得られます。
>>173
SED == Super Extra Deluxe editor
176173:02/12/26 20:45
ありがとう>>174-175
マジレスすると Stream EDitor なわけだが。
178デフォルトの名無しさん:02/12/29 22:19
MS-awk で、パイプって使えないみたいですね。バグが多いのかな。
179デフォルトの名無しさん:02/12/30 15:54
ばかやろう
Stream Editorだああああああああああああああああああああああああああ
180デフォルトの名無しさん:02/12/31 00:41
>>179
同じじゃん、それが何か?
181 :03/01/04 15:55
>>160
( ´ⅴ`)ノ< これってどこにあるのれすか?
        検索したのれすけど見つからないれすよ
182デフォルトの名無しさん:03/01/07 04:14
oawk -f program.oawk infile > outfile
って感じになりますね。 < Objective awk
183デフォルトの名無しさん:03/01/07 07:46
awkでは、配列の初期化は一つ一つ代入していかないとだめですか?
すまん、Unixに初めて触った頃
Bシェルスクリプト, sed, awk から勉強してたんだが
Perlに出会って以来全く使って無かった
昔を思い出してawk に出来る事はawkにさせるようにするよ

# 今じゃ既に文法すらあやしい...
>>160
Objective awk検索してみたけど見つからん。
どこにあるのか教えてください。
186IP記録実験:03/01/08 21:40
IP記録実験
http://qb.2ch.net/test/read.cgi/accuse/1042013605/

1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。

27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?

38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27
鋭いです。

73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
どうなっちゃうの?
>>299
 う
こん


こうだよ
  ! | l l ヾ(:::::   ヽ〉ヽ)ヽ `l  ミ ー  .、 |
    | {レヽ〈:::~``'' ´  ソ |! l }   ミ. ミ    ト
    レヽ,;:::''''`':;|;il~,. -‐'  ル )ノl / ミ ノr^,ヾ !
     ゝ l;ュ=≡{., (;;,(ニ===、-.l! li /ソ ;;)|./
      `!;ェ‐・オ ""'''< `・ーz'ー'~ |/ フ;;i |!  <嫌だなあ・・・・
        |:'""`')'  ^ヽ;` ̄,. -‐'^  i|;;;;ノ/\ー-、-.,_
        !;:.. .:;i|   ;,  ~、´    ,/ |,..ノ;  \ ゝ ヽ``)、.,_
       ``ヽ(__,,,,...)  \_,,..-'   |;;;     |〉   トli ヽ
         |::::::::J..,,_ ^ヽ,  : 1, ;!;:     /l、    ) |
         ヽ::r,―--一' . , il/:::  ::  / !    ;  /
         .//'i`ー-'´; ' ;. ',/;;;:::::  .:::::∧  }    ヽイ
      /  /  L.;_';_._,`.ノ
「西村さんに何かあった時は、『2ちゃんねる』はどうなるのですか?」
との質問には
「今月10月分はもう支払いが済んでいますので大丈夫ですが、
もしも何かがあったなら、潰れてしまう」
とおっしゃっていました。


大阪大学大学院国際公共政策研究科
「2ちゃんねる」西村博之氏の講演
写真あり
http://www.dryamasaki.com/PhotoJ/2002/OSIPP2/p1.html
191デフォルトの名無しさん:03/01/09 14:53
「西村さんに何かあった時は、『2ちゃんねる』はどうなるのですか?」
との質問には
「今月10月分はもう支払いが済んでいますので大丈夫ですが、
もしも何かがあったなら、潰れてしまう」
とおっしゃっていました。


大阪大学大学院国際公共政策研究科
「2ちゃんねる」西村博之氏の講演
写真あり
http://www.dryamasaki.com/PhotoJ/2002/OSIPP2/p1.html
======2==C==H======================================================

         2ちゃんねるのお勧めな話題と
     ネットでの面白い出来事を配送したいと思ってます。。。

===============================読者数: 138720人 発行日:2003/1/9

年末年始ボケがそろそろ収まり始めた今日このごろのひろゆきです。

そんなわけで、年末に予告したIP記録ですが実験を開始しています。

「2ちゃんねる20030107」
こんな感じで各掲示板の最下部に日付が入ってるんですが、
20030107以降になってるところはログ記録実験中ですー。

んじゃ!

────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50
────────────────────────────
今日は暑いな
>>544
漏れも「今から危険な領域に突入しようと(以下略」みたいなとこまでは
いったんだが…。気になるけど見たくない…。
けんすうさん。

先程、「天才」と呼ばれた
ディカブラットさまには頭を下げておきました。
皆さんが何を考えるか知りませんが

個人的に、
「結構ヤバイ」んです。
貴方方は気楽でしょうが。

末期がんに近い感じで追い詰められています(実際のクランケ御免なさい)
コレ、嘘じゃないのです
聞いて下さい
お願いします
>>141
まだなハズ
急にレスの勢いがとまったな
2ちゃんねる が衰退していく

あるネット関連会社の社長は、
「いずれにしても2ちゃんねるは資金が底をつけば終わり。
あまり知られていないことだが、2ちゃんねる内部関係者によると今、
大手通信会社系が調査費名目で資金提供している。
だが、それが止まれば続けてはいけないだろう」
と証言する。
2ちゃんねるが判決によって力を失った場合、
資金提供の打ち切りも予想される。

http://ascii24.com/news/reading/causebooks/2002/07/01/636911-000.html

>>644
>>580
別に見られても困らないが

http://qb.2ch.net/test/read.cgi/accuse/1040063556/755
ここにも書いてきたけど、どの板だったか忘れるくらいあちこちの板に出没してます
ニュー速を閉鎖しないのは、やはりニュー速住人が他に行く事で2chから人がゆっくり離れていってしまう事を警戒してるのでは
ないだろうかと物凄い偏った邪推してみるテスト。
ひろゆき
お前にはがっかりした。
2chにも。さいなら。
俺の人生はIPそのものだった
なんてことしてくれたんだ、ばぼゆき・・・
そのサーバ管理者に責任が出てくるから
tripodとかはアカウントを閉鎖しまくると思うが。
隊長のことハ○とかって言えなくなるのかな、寂しいな
======2==C==H======================================================

         2ちゃんねるのお勧めな話題と
     ネットでの面白い出来事を配送したいと思ってます。。。

===============================読者数: 139038人 発行日:2003/1/10

なにやら、連日メルマガだしてるひろゆきです。

そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。

重くなって落ちたりしてもご愛嬌ってことで。。。

んじゃ!

────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50
────────────────────────────
人が増えすぎたんだろうなぁ。
検索キーワードの一位が「2ちゃんねる」になる時代なんて
ネオ麦前には想像すらできなかった。
アフォなユーザーが招いた結果。
匿名掲示板の有意を潰してしまった。
まあ、あnグラな話やりたきゃ他逝けってことかなぁ。
雑談、学問、技術系な板には関係ないな。
どこぞの宗教団体を批判するスレ・レス出現
  ↓
どこぞの団体が、管理人にスレ・レス作成IP教えろ
  ↓
管理人がIP教える
  │
  ├─────┐
  ↓普通     ↓異常
 裁判     VXガス

こうなるとオウムに個人情報を知らせ 大量殺人にまで発展した
TBSと同じになるな。 カルトは裁判を起こすことが目的ではなく
都合の悪い相手を特定して殺害することが
IPを得る真の狙いだから真実の書き込みができなくなる。

平和な日本の昼下がり、
創価学会脱税疑惑を追及した市議会議員が団地の自宅で家事をしている。
すると突然、化け物のような歪んだ力が襲い掛かり
自宅の窓からあっという間に空へ丸投げされて落下死する。
団地の部屋はコンビニへ買い物に行っているかのように
台所も洗濯物も何もかもがそのままの状態だ。
地元警察は創価学会と数日前から綿密な口裏合わせがあったかのように
他殺を自殺と決め付けてろくな捜査も現場検証もせず引き上げる。
http://www.sokamondai.to/

ちなみにフランス内務省は最高危険度カルト教団として
日本の創価学会を公式に認定した。
フランス政府公認のカルト教団と正義のために
たった一人実名で全面対決した市議に黙祷( ‐人‐ )
2ちゃねらーはプロバイダー責任法案を
国会で通過する前に反対しておけばよかったのに。
私は反対したが力が足りなかった。
ひろゆきがこれなくなるじゃないか!
俺はひろゆきにレスされたいんだよ!
リモホって何?
リモートホストって、用語辞典に載ってないよ
誰かおせーて
214デフォルトの名無しさん:03/01/12 00:08
Objective awk の場合、
class Hoge {
public void BEGIN {
 // ここがコンストラクタ
}
public void END {
 // ここがデストラクタ
}
}
だったんですね。
それと、class の最後の } を }; とするとエラーとなってしまうんですね。
はまってしまった……
215デフォルトの名無しさん:03/01/12 00:19
>>214
void は余計でしょ。Objective awk に型指定はできないよ。
内部告発されるようなことをするのが悪いと思うが。
実はおいらもそれをひしひしと感じている今日この頃(^_^;)
>>215
Objective awkってどこにあるんですか。URLを教えてください。おながいします。
2002年2ちゃんねるアニメランキング1位のアニメに・・・・

モナーが出演決定!!!!!!!!!!!!!!!!!!!!!

<<放送時間>>
1/12
大阪 テレビ大阪 (日)9:30~10:00
東京 テレビ東京 (日)9:30~10:00
名古屋 テレビ愛知 (日)9:30~10:00
福岡 TVQ九州放送 (日)9:30~10:00
札幌 テレビ北海道 (日)9:30~10:00
岡山・高松 テレビせとうち (日)9:30~10:00 
2002年2ちゃんねるアニメランキング1位のアニメに・・・・

モナーが出演決定!!!!!!!!!!!!!!!!!!!!!

<<放送時間>>
1/12
大阪 テレビ大阪 (日)9:30~10:00
東京 テレビ東京 (日)9:30~10:00
名古屋 テレビ愛知 (日)9:30~10:00
福岡 TVQ九州放送 (日)9:30~10:00
札幌 テレビ北海道 (日)9:30~10:00
岡山・高松 テレビせとうち (日)9:30~10:00 
ななも殺人教唆で逮(ry
俺らも人のこと言えないが年末年始に2ちゃんねるって恥ずかしくない?>アンチの皆さん
(・∀・)?
224山崎渉:03/01/13 18:37
(^^)
結局ひろゆきの年収っていくらなんだろう?
226山崎渉:03/01/15 17:58
(^^)
227デフォルトの名無しさん:03/01/22 03:14
>>218
Objective awk って、たしか http://hikita.org/netstation.html からたどって
ダウンロードできた気がする。
使ってないからようわからんけど。
228山崎渉:03/01/23 20:04
(^^)
ホシュ
本当にObjective awkなんてあるの?検索してみたけど・・・。
231デフォルトの名無しさん:03/02/09 12:33
>>230
いまクローズド期間中らしいよ。
closed.
233デフォルトの名無しさん:03/02/28 14:54
10進以外の数値文字列を数値として認識させるにはどうしたらいい?
自分で10進文字列に変換しないとだめ?
234デフォルトの名無しさん:03/03/10 07:19
>>233
gawk なら、
gawk 'BEGIN {a = sprintf("%d", 0x12); print a}'
とかで変換できるね。
オリジナル awk や mawk だと、
gawk 'BEGIN {a = sprintf("%d", "0x12"); print a}'
だね。
235デフォルトの名無しさん:03/03/13 01:17
今日はじめて mawk を知ったんだけど, 結構有名なんだね.
このスレでも名前挙がってるみたいだし.
Web ページに書いてあるように, 確かに配列は激速だった.
awk '$1 ! /[a-z]/ {}' で syntax error っていわれるんですが、どこがおかしいのでしょうか?
GNU Awk 3.1.2(Cygwin)を使用しています。
!~
238 :03/04/14 21:11
AWK って Windows Scripting Host に組み込まれた実装はないの?
Active AWK とか妄想してみる。
>>238
なぜそんなものを欲しがるんだ?
それ以前にWSHは別のプログラムの標準入出力を処理できないだろうが。
240山崎渉:03/04/17 15:25
(^^)
242山崎渉:03/04/20 04:32
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
243デフォルトの名無しさん:03/04/24 05:52
$ echo $str | command | xargs ...のように、
ある文字列をコマンドに渡して、
その結果を受け取るような処理がしたいのですが。

print str | command
では、標準出力に書かれてしまいますし、
print str | command | getline s
このように書くと、
sh: 1: command not found
というエラーで、うまく動きませんでした。
244デフォルトの名無しさん:03/04/24 06:00
Objective awk だと、

new Pipe("command"); print str | p | getline s;

だけど。
245デフォルトの名無しさん:03/04/24 06:00
間違えた。
p = new Pipe("command"); print str | p | getline s;
246動画直リン:03/04/24 06:26
247243:03/04/24 06:58
>244-245
せっかく教えてもらったのに悪いですが、
Objective Awkは入っていないみたいです。
これだけのために入れるのも考えものなので。。。
248デフォルトの名無しさん:03/04/24 08:43
>>247
中間ファイルしかないかな。

print str > "/tmp/重複しない名前"
"/tmp/重複しない名前" | getline str
249デフォルトの名無しさん:03/04/24 08:44
close せなあかんですね。

print str > "/tmp/重複しない名前"
close("/tmp/重複しない名前")
"/tmp/重複しない名前" | getline str
close(""/tmp/重複しない名前")
250 :03/04/24 15:25
唐突に Windows や DOS で使える awk 処理系を挙げてみる。

cygwin のやつ
http://www.vector.co.jp/soft/win95/util/se015007.html
http://www.eco.osakafu-u.ac.jp/~kazuhisa/awk.htm
ここにもあるよ(日本語未対応だけどね)。
http://gnuwin32.sourceforge.net/packages/gawk.htm
>243
cmd = "echo " str " | command"
cmd | getline s

echoが無いとだめだが、
その程度ならすぐ書けるだろ。

BEGIN { for (i = 1; i < ARGC; i++) printf ARGV[i]; print "" }
253 :03/04/25 23:45
254 :03/04/25 23:46
どれつかったらいいんでしょうか??
http://www.vector.co.jp/vpack/filearea/win95/util/text/awk/index.html
255 :03/04/25 23:50
gawk-3.06マルチバイト文字対応版WIN32バイナリ2001.5.15版
http://www.hinadori.atnifty.com/~wills/program.html
これは?
256 :03/04/26 10:17
>>255
漏れは Copal + >>255 を使ってます。
ところで、Windows でも UNIX みたく #!/usr/bin/awk -f とかやりたいんですが。
つまりawkスクリプトをコマンドのように使いたいんですが。
>>256
Cygwinでできるよ。Bashとかも使えておすすめ。
http://www.cygwin.com/
258デフォルトの名無しさん:03/04/26 11:46
>>256
もしくは、hoge.awk 同名の hoge.bat を作って、
awk -f hoge.awk %1 %2 %3 %4 %5 %6 %7 %8 %9 %10
とか。
259 :03/04/26 11:50
>>258 なるほど、そう言うトリッキーな方法しかやはりありませんか…
>>257 cygwin は使ってます。便利ですよね。

またまた質問なんですが、
awk ですべてのパターンマッチングに際して
大文字と小文字を区別しないように
強制するオプションってありましたっけ?

grep における -i (--ignore-case) みたいな。
260 :03/04/26 11:52
どうやら IGNORECASE って変数が用意されているらしいんだが…
これってどの実装にも用意されているんだろうか。
POSIX 準拠?
261 :03/04/26 11:54
Extensions in gawk Not in POSIX awk
http://www.gnu.org/manual/gawk-3.1.1/html_node/POSIX-GNU.html

Version 2.10 of gawk introduced the following features:
The IGNORECASE variable and its effects (see Case Sensitivity in Matching).

ってことなので、これは POSIX では規定されていないみたい……ちょっと不安。
262 :03/04/26 11:57
Case Sensitivity in Matching
http://www.gnu.org/manual/gawk-3.1.1/html_node/Case-sensitivity.html#Case-sensitivity

によると tolower はどの POSIX 互換 awk 処理系でも使えるということなんで、
tolower 使います。 では、皆さんよい週末を。
263デフォルトの名無しさん:03/04/26 11:59
>>256
あとは、.awk の拡張子を awk.exe に関連付けして、start /b hoge.awk とかはできる。
もしかすると、PATHEXT に .AWK を加えると、単に hoge で起動するかも。
264デフォルトの名無しさん:03/04/26 12:07
>>263
できるねえ。
265デフォルトの名無しさん:03/04/26 14:17
set PATHEXT=%PATHEXT%;.AWK
すると hoge で起動できました。Windows 2000 でつ。
266 :03/04/26 14:26
>>265
ども、ありがとうございます。
PATHEXT なんてのがあるんですねぇ……
267動画直リン:03/04/26 14:26
268 :03/04/28 14:22
*.awk を関連付けるときに、カコイイアイコンをつけたいんですが!!!
269動画直リン:03/04/28 14:26
多くは書かない。1行のみ。
271デフォルトの名無しさん:03/05/08 23:41
掲示板のログの順番を逆にする awk スクリプトを書いているのですが、

・空行があると、そこでレコードが区切られてしまう
・配列にレコードを納めるときに、画面に表示されてしまう

という二点がうまくいかず、悩んでいます。
分かる方、お教えください。


なお、環境は Cygwin に付いてきた GNU Awk 3.0.4 を NT4.0 上で動かしています。


Sep = "[:digit:]+/[:digit:]+/[:digit:]+ [:digit:]+:[:digit:]+ ID:"

BEGIN {
RS = Sep
# このレコードセパレータ以外でも、空行で区切られてしまう
ORS = Sep "\n\n"
}

{
array[NR] = $0
# この時にレコードが画面に表示されてしまう
}

END {
for ( x = NR; x >= 1; --x){
print array[x]
}
}
272デフォルトの名無しさん:03/05/09 00:28
>>271
複行レコードは BEGIN { RS = "" } でつ。
273デフォルトの名無しさん:03/05/09 00:32
>>271
なら、空行を取り除くフィルタを awk で作ればいいんじゃない?
{ if(strlen($0) > 0) print }
274デフォルトの名無しさん:03/05/09 00:46
>>271
もとのデータがどういう構造なのかわからない。
275デフォルトの名無しさん:03/05/09 00:48
>>271
わからないけど、推測だと、

BEGIN {
Sep = "[:digit:]+/[:digit:]+/[:digit:]+ [:digit:]+:[:digit:]+ ID:"
RS = ""
FS = Sep
ORS = "\n\n"
}
シェルスクリプト(awkスクリプト?)を勉強し始めたんですが、
同じファイル(a.txt)の1列目と2列目の和を出力させるのは、
awk '{sum=$1+$2;print sum}' a.txt
で確認できたんですけど、2つ以上のファイルの任意の列の和(例えば、
1つ目のファイルの1列目と2つ目のファイルの2列目の和)を求めることって
できるんでしょうか?
277デフォルトの名無しさん:03/05/09 03:15
>>276
できる。
getline < "filename.txt"
とかかな。
1 回の getline < "filename.txt" で 1 行目、2 回目の getline < "filename.txt" で
2 行目が読める。$0、$1、…の意味は標準入力のときと同じ。
最後に close("filename.txt") を忘れへんこと。

278276:03/05/09 03:38
>>277さん
レスありがとうございました.ちょっと調べた感じですと,getlineは
“非常に複雑なため,初心者は使うべきではありません”なんて書いてありました...
でもちょっと試してみます.
279271:03/05/09 07:42
フォーマットは、たとえばここのログなら
「271 :デフォルトの名無しさん :03/05/08 23:41」
で分け、下から上に並べ替えるといった感じです。

FSはいらないような気がするのですが、やってみます。
また書き込みます。
>>271
なんとなく、ファイル構造を変更しないと面倒な気がする。。。
ま、なんにしても、配列に入れる時に表示されるのは変だよね。
>271 こんな感じ?
動かしてみたら分かると思うけど、先頭に余計な改行が付いたり、RSに設定した行が消えたり、
split(",a,b,c", a, ",")のように、ログの最初に「空ログ」が来るから、
getlineで1つずつ読んだほうがいいかと思われ。

BEGIN {
  RS = "[0-9]+:[^:]*:[0-9]+/[0-9]+/[0-9]+[ \t]*[0-9]+:[0-9]+"
  hr = sprintf("%78s", "")
  gsub(/ /, "-", hr)
  ORS = "\n" hr "\n"
}
{ a[NR] = $0 }
END {
  for (i = NR; i >= 1; i--)
    print a[i]
}

# 以下ログ
1:デフォルトの名無しさん:03/05/08 23:41
2ch

net

2:デフォルトの名無しさん:03/05/08 23:42
age
sage
282271:03/05/09 20:33
どうもです。

>280
なんだか、
Sep の初期化を BEGIN の前に行うと滅茶苦茶な動作になってしまうようです。
BEGINの中に入れるとOKでした。

>>281
>RSに設定した行が消えたり

そう、今日はこれで悩んでいました。
getline関数にも挑戦してみますが、
素朴に対応する方法はないでしょうか?
>>276
paste 使って各ファイルをくっつけてから awk で足し算する。
>>282=>>271
>滅茶苦茶な動作
たぶんそれは、{}の外での定義は無視されて、
RS = ""だから空行で切れるようになったんだと思われ。

>RSに設定した行が消え
awk -F: '{ print $1 }' /etc/passwdってやると、区切り文字の:は消えるでそ?
FSとRSだから$0の扱いのほか多少は違うけど、どっちも区切り文字は消えるかと。

んで暇だったんで、getline版書いてみた。参考にでも。
http://cgi.members.interq.or.jp/hokkaido/asato/upload/jam3ddr/OB000618.txt
285276:03/05/10 20:59
>>283さん
おおっ!
pasteで簡単にできました.ありがとうございました.
286271:03/05/13 07:49
>>284

>たぶんそれは、{}の外での定義は無視されて、

BEGIN の前では定義できなかったのですね。 納得。

>んで暇だったんで、getline版書いてみた。参考にでも。

美しいコードをどうもありがとうございます。 早速動かしてみました。
awkで関数なんて書いたこと無かったので、ちょっと驚きです。
コードをトレースして勉強したいと思います。
このスレに含まれる「多く」と awk をかけたネタの数を数えるスクリプト書いて。
288デフォルトの名無しさん:03/05/19 10:33
BEGIN { counter = 0 }
/多く*awk/ { ++counter }
/awk*多く/ { ++counter }
END { print "ネタの数 = " counter }
289デフォルトの名無しさん:03/05/19 10:34
* じゃなくて .* か。 >>288
290_:03/05/19 10:37
291山崎渉:03/05/28 12:58
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
sed スレがないからここに書いて見ます。
sed じゃ複数行マッチってできないんですか?

sed -e "/ab\nc/mp"
sed -ne '/ab$/{;N;/\nc/p;D;}'
複数のファイルから任意のフィールドを抜き出して一つのファイル(横方向に連結)
にしたいんですけどうまい方法が見つかりません.
初めは,pasteで該当ファイルを全部一つにしてからawkで抜き出す方法を考えた
んですが,pasteの引数を指定する方法(正規表現が使えない?)がわかりません
でした.

くだ質で質問したところ,Perlでできるということだったので,調べてみると
ttp://bopper.t.u-tokyo.ac.jp/cgi-bin/WebObjects/Yukawa/tips/t1.shtml
というページがあって,試してたら,空のファイルが9個できただけでした...
Perlをいじったことがないため,ソース理解するのは厳しかったです.

pasteやawkでできるうまい方法ってありますでしょうか?ヒントだけでもうれしいです.
横方向に連結って意味が良く分からないけど、多分、

  file1  file2  file3  file4
  1_1   2_1   3_1   4_1
  1_2   2_2   3_2   4_2
  ...   ...   ...   ...

  (要素 = fileナンバー_行数)

の意味だと仮定して、次のようなスクリプトを考えてみた。

コマンドラインから、awk スクリプトを起動する。
このとき、読み込みたいファイルを、awk スクリプトへの
オプションとして渡す。 (./a.awk -v filename="foo bar")

処理自体は、BEGIN ブロックの中で完結させる。

ファイル名を切り出す。(split()。セパレータは空白)
getline で各々のファイルを読み込みつつ、任意のフィールドを
  field[file_no, line_no] = str;
のように代入。ファイルごとに行数は違っているだろうから、
どっかで最大行数を記憶しておく。

後は、最大行数とファイル数を使って for ループか何かで
field[] を出力。
296294:03/06/11 01:25
>>295さん
丁寧な指針どうもありがとうございました.
言葉足らずですみません.“横方向に連結”というのは,ファイルが
file1 file2 file3 file4
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
という内容だとして,例えば各ファイルの第2フィールドだけを取り出して,
2 4 6 8
10 12 14 16
18 20 22 24
という出力を得たいという意味で使ってました.実際のファイル(ログファイル
のようなもの)は“管理+月日.tsv”という名前で毎日自動生成されてまして,
各ファイルから特定のフィールド(列)だけを取り出して,Excelにかけたいと
思ってます.
極論すれば,Excelにカット&ペーストでぺたぺた貼っていけばいいだけの話なん
ですけど,例えば3ヶ月のデータ(約90回)をやるとなるとさすがに苦しいので
なにかいい方法がないかと模索してました.
pasteの引数には複数ファイル指定できて,これはイケると思ったんですけど,
カレントディレクトリにあるtsvファイルを一括して指定することができません
でした.
297294:03/06/11 01:29
↑ずれました...fileはそれぞれ4行2列のつもりです.
298デフォルトの名無しさん:03/06/11 03:35
こんなかんじでどう?

gawk -f hoge.awk -v field=2 *.tsv

hoge.awk*****
FNR==1{ fcnt+=1; fname[fcnt]=FILENAME; }

{
src[FILENAME,FNR] = $field;
if(maxline < FNR) maxline=FNR;
}

END {
for(i=1; i<=fcnt; i++) printf("%10s ", fname[i]);
printf("\n");

for(i=1; i<=maxline; i++) {
for(j=1; j<=fcnt; j++) printf("%10s ", src[fname[j], i]);
printf("\n");
}
}
299295:03/06/11 05:36
>>294
いえいえ、何かの役に立てればうれしいです。

>>298
やっぱり、他人のソース見るのは勉強になるなあ。
FNR == 1 で、次のファイルを読み込んだのを検出できるんですね。
300294:03/06/12 00:58
>>298さん
わざわざソースまで載せていただいてありがとうございました.
こちらの環境に合わせてちょこっと修正したところ,完全に期待する
出力が得られました!
age
ヽ( ・∀・)ノ ウンコー 
sage
303デフォルトの名無しさん:03/07/08 00:33
Cygwinを使わずに、
Windows上で、Gawk 3.1.2を使いたいんだが、
・BCC5.5でメークかかるモンなんだろうか?
・マルチバイトパッチとかは、どこで手にはいるだろう?
304デフォルトの名無しさん:03/07/08 11:36
awkは語らねぇ
素直にPerlかrubyにしとけ。
1.全部で、ひらがな(長音符は除く。< br >は改行を表し、また、 それは除く)は何文字あるか。
2.全部で、句読点はいくつあるか。
3.全部で、文はいくつあるか。
4.一番多く出現する単語は何か。
5.一番多く出現する品詞は何か。
6.一番長い文の長さは何文字で、何単語か。
7.一番多い品詞の並べ方はどのようなものか。
という課題にて、
;;;; $Id: 01.cor,v 1.22 1995/02/09 06:29:11 hkoiso Exp $
0100010 DB-- - <br>
0100020 ZN-- - けもの
0100030 HP-- - は
0100040 DTT- - 、
0100050 ZN-- - からだ
0100060 JB-- - じゅう
0100070 HP-- - に
0100080 ZN-- - け
0100090 HP-- - が
0100100 ZV2- - はえ
0100110 HP-- - て
0100120 ZV4- - いる
0100130 ZN-- - どうぶつ
0100140 HP-- - の
0100150 ZN-- - こと
0100160 HA3- - です
0100170 DTK- - 。



のように続いていく文章が与えられたのですが、どうすれば良いのか分かりません。
どういうプログラムを組めばよいのでしょうか?
宿題○投げかよ。
1,2,3ができなきゃ、スクリプト書いてやっても
理解できないだろう。4以降は、連想配列使う。
連想配列って知ってる?
使ってよいのはマルチバイト対応のawkなのか。

309306:03/07/11 19:00
すみません
教授がほとんど説明せずに課題を出しているので、awkプログラム自体はっきりとは飲み込めていない状況です
説明なしで始めさせられ、5~6時間程度しかやっていないので・・・UNIXのコマンドなども併用して良いそうなのですが・・・
連想配列という言葉自体始めて聞きました
少し調べてみます
上三問のヒントだけ、いただけないでしょうか?
man awk

まずマニュアル読め。
http://www.kt.rim.or.jp/~kbk/gawk/gawk_toc.html
Awkの作者の書いた本もよいかと。
プログラミング言語AWK
314306:03/07/12 12:50
有り難うございます。もう少し頑張ってみます
315306:03/07/13 22:59
_| ̄|○
>>315
進展したのか挫折したのかはっきりせい。
そのAAだとどっちか分からん。
四つんばいだから挫折ってことでは...
_| ̄|○
↑ ↑↑
足 手頭
>>317
「ありがとございますた」に見えなくもないんスよね。
319306:03/07/14 17:43
すみません、なかなか理解できず・・・
期限は明後日・・・ ひ ら が な の数を数え出す方法が分かりません。
もう少し手がかりを与えてくれないでしょうか?

できれば、上三問だけでも答えを知りたいですが・・・
問題読み間違いしてる気もするけど、意外と難しいかもね。
1,2,3フィールドの意味が分からないので1のヒント。
$4には<br>かひらがなだけと仮定してるから、そこんとこ。

substr($4, 1, 2)# 1文字目のひらがな
substr($4, 3, 2)# 2文字目のひらがな
...
substr($4, length($4)-1, length($4))# 最後のひらがな
321306:03/07/14 19:48
有り難うございます。考えて見ます

DB-- - <br>
ZN-- - けもの
HP-- - は
↑↑↑
ここいら辺りは品詞とかそういうものの区分らしいです
>>321
ぐちゃぐちゃ言っとらんで出来た所までコード見せい。
間違ってるの指摘するのは簡単だが、作ってないものにアドバイスするの
は無理だ。
このペースじゃ明日後の完成は無理だぞ。
質問があった直後に書いたんだがね。
締め切りすぎに出すのは意地悪?だって、あまりの厨振りに・・・
もっとうまいまとめ方もあるだろうが・・・

bun_bango = 0
{
# 1.ひらがなの数
mojiretu = $4
while(match(mojiretu,/\x82[\x9F-\xF1]/)){
hiragana += 1
mojiretu=substr(mojiretu,RSTART+RLENGTH)
}
# 2.句読点の数
mojiretu=$4
while(match(mojiretu,/\x81[\x41-\x44]/)){
kutoten += 1
mojiretu=substr(mojiretu,RSTART+RLENGTH)
}
# 3.文の数
mojiretu=$4
while(match(mojiretu,/\x81[\x42\x44]/)){
bun_bango += 1
mojiretu=substr(mojiretu,RSTART+RLENGTH)
}
# 4.一番多く出現する単語
mojiretu=$4
while(match(mojiretu,/(\x82[\x9F-\xF1]|\x83[\x40-\x96]|[\x88-\x98][\x00-\xFF])+/)){
tangosuu += 1
bun_tango[bun_bango]=tangosuu-bun_tango[bun_bango-1]
tango[substr(mojiretu,RSTART,RLENGTH)] += 1
mojiretu=substr(mojiretu,RSTART+RLENGTH)
}
# 5.一番多く出現する品詞
hinsimei=$2
sub(/-+/,"", hinsimei)
hinsi[hinsimei] += 1
# 6.一番長い文の長さは何文字で、何単語か。
mojiretu = $4
while(match(mojiretu,/([\x88-\x98][\x00-\xFF])+/)){
kanji += 1
mojiretu=substr(mojiretu,RSTART+RLENGTH)
}
bun_moji[bun_bango]=kanji+hiragana-bun_moji[bun_bango-1]

# 7.一番多い品詞の並べ方はどのようなものか。
# 7.の出題は意味不明です。
}
END {
# 1.ひらがなの数
print "1.全部で、ひらがなは", hiragana, "文字ありました。";
# 2.句読点の数
print "2.全部で、句読点は",kutoten,"個ありました。";
# 3.文の数
print "3.全部で、文は",bun_bango,"個ありました。";
# 4.一番多く出現する単語
max=0
for (i in tango) {
if (max <= tango[i]) {
max = tango[i]
}
}
for (i in tango) {
if (tango[i] == max) {
maxtango[i] = i
}
}
printf("%s","4.一番多く出現する単語は")
for (i in maxtango) {
printf("「%s」と",maxtango[i])
}
print "で",max,"回でした。"

# 5.一番多く出現する品詞
max=0
for (i in hinsi ) {
if (max <= hinsi[i]) {
max = hinsi[i]
}
}
for (i in hinsi ) {
if (hinsi[i] == max) {
maxhinsi[i] = i
}
}
printf("%s","5.一番多く出現する品詞は")
for (i in maxhinsi) {
printf("%sと",maxhinsi[i])
}
print "で",max,"回でした。"
# 6.一番長い文の長さは何文字で、何単語か。
max = 0
maxindex = 0
for (i=0; i<=bun_bango; i++) {
if (bun_tango[i] >= max) {
max = bun_tango[i]
maxindex=i
}
}
printf("6.一番長い文の長さは%d文字で、%d単語でした。\n", bun_moji[maxindex], bun_tango[maxindex])

# 7.一番多い品詞の並べ方はどのようなものか。
print "7.の出題は意味不明です。"
}
328山崎 渉:03/07/15 10:03

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
329323-327:03/07/15 13:40
うぜえ
330山崎 渉:03/07/15 14:01

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
331306:03/07/15 21:08
>>323-327
ご親切にどうも・・・すみませんでした
お手数をおかけしました。有り難うございます
ん、そのプログラム動く・・・?
>>322
ばかやろう。当然確認済みだ。エラーメッセージ見せてみろ。
>>333
かばやろう
WindowsXPのコマンドプロンプトでawkプログラムを使うにはどのような操作をすればいいですか?
googleで検索してみたのですが、いまいちよくわからず・・・
>>335

Cygwin 入れる(gawk)か、awk を単体でインストール
(Vector に mawk というのがあるから検索汁)
>>336
サンクス
>>333
出力がおかしいよ
全部で一文あるとか言ってるし、明らかに自分の打った語数に足りない
文数とは「。」の個数です。
あなたの打った語数とは、ひらがな・漢字の連続の個数です。
題意をよく理解してデータを作ってください。
どうでもいい話でモメんな。
どうでもいい話じゃない。
PG(漏れは違うが)にとって死活問題だ
言い方まずかった
全部で一文あるとか言ってるしでひとつ
丸がいくつもあるはずなのになぜか全部で文はひとつありましたとでる。
明らかに自分の打った語数に足りないでひとつ
ひらがなの数が打った数の表示に合わないし、確か何故か単語数のほうが多かった
ほか、すまそ。
最初の行のbun_bango=0をBEGIN{}に入れればいい。
そのくらいすぐ気付や。>漏れも
>全部で一文あるとか言ってるしでひとつ
>丸がいくつもあるはずなのになぜか全部で文はひとつありましたとでる。
これ同じことじゃん
>明らかに自分の打った語数に足りないでひとつ
>ひらがなの数が打った数の表示に合わないし、確か何故か単語数のほうが多かった
「自分の打った」?データはたぶん古いchasenの出力を加工したものだろ
ほなら、テストデータあげるよ
01000010 名詞=代名詞-一般-- - あなた
01000020 助詞=係助詞-- - は
01000030 記号=読点-- - 、
01000040 名詞=一般-- - かだい
01000050 助詞=格助詞-一般-- - を
01000060 動詞=自立-- - だし
01000070 助動詞-- - た
01000080 名詞=一般-- - どうぶつ
01000090 助動詞-- - でしょ
01000100 助動詞-- - う
01000110 記号=句点-- - 。
01000120 -- - EOS
01000130 副詞=一般-- - まず
01000140 記号=読点-- - 、
01000150 名詞=一般-- - かだい
01000160 助詞=連体化-- - の
01000170 名詞=一般-- - なかみ
01000180 助詞=格助詞-一般-- - が
01000190 名詞=形容動詞語幹-- - ふめいりょう
01000200 助動詞-- - です
01000210 記号=句点-- - 。
01000220 名詞=一般-- - ぶん
01000230 助詞=副助詞-- - なんて
01000240 名詞=さ変接続-- - ていぎ
01000250 助詞=連体化-- - の
01000260 名詞=ない形容詞語幹-- - しかた
01000270 助詞=格助詞-一般-- - で
01000280 副詞=助詞類接続-- - どう
01000290 助詞=副詞化-- - に
01000300 助詞=副助詞-- - でも
01000310 動詞=自立-- - かわる
01000320 助詞=接続助詞-- - し
01000330 記号=句点-- - 。
01000340 -- - EOS
01000350 名詞=一般-- - ひんし
01000360 助詞=格助詞-一般-- - の
01000370 動詞=自立-- - ならび
01000380 名詞=一般-- - ジゅん
01000390 助詞=副助詞-- - なんて
01000400 記号=読点-- - 、
01000410 名詞=一般-- - はんい
01000420 助詞=格助詞-一般-- - を
01000430 名詞=さ変接続-- - してい
01000440 動詞=自立-- - し
01000450 助動詞-- - なけれ
01000460 助詞=接続助詞-- - ば
01000470 名詞=さ変接続-- - いみ
01000480 形容詞=自立-- - ない
01000490 助詞=接続助詞-- - し
01000500 記号=句点-- - 。
01000510 -- - EOS
01000520 名詞=代名詞-一般-- - あなた
01000530 助詞=係助詞-- - は
01000540 記号=読点-- - 、
01000550 名詞=一般-- - さいてい
01000560 助詞=連体化-- - の
01000570 名詞=一般-- - けだもの
01000580 助動詞-- - です
01000590 記号=句点-- - 。
01000600 -- - EOS
01000610 副詞=一般-- - どうせ
01000620 未知語-- - chasen
01000630 助詞=連体化-- - の
01000640 名詞=さ変接続-- - しゅつりょく
01000650 助詞=格助詞-一般-- - を
01000660 名詞=さ変接続-- - かこう
01000670 動詞=自立-- - し
01000680 助動詞-- - た
01000690 名詞=非自立-一般-- - もの
01000700 助動詞-- - でしょ
01000710 助動詞-- - う
01000720 助詞=接続助詞-- - から
01000730 記号=読点-- - 、
01000740 名詞=一般-- - でーた
01000750 助詞=格助詞-一般-- - を
01000760 動詞=自立-- - つくっ
01000770 助詞=接続助詞-- - て
01000780 接頭詞=名詞接続-- - お
01000790 動詞=自立-- - みせ
01000800 動詞=接尾-- - し
01000810 助動詞-- - ましょ
01000820 助動詞-- - う
01000830 記号=句点-- - 。
01000840 -- - EOS
>>344
その文章は明らかに
>全部で一文あるとか言ってるしでひとつ
↑問題
>丸がいくつもあるはずなのになぜか全部で文はひとつありましたとでる。
↑その解説
>明らかに自分の打った語数に足りないでひとつ
↑問題
>ひらがなの数が打った数の表示に合わないし、確か何故か単語数のほうが多かった
↑その解説
という構成だから上二つが同じ事言ってるのは(以下略
350338-349:03/07/25 20:58
うぜぇ
>>350
うっせぇ
352山崎 渉:03/08/02 02:53
(^^)
(,,・θ・)
awkの場合、

「使用言語にawkを選択した時点で勝ち」

つーのがあるよね。one liner とか。
>>354
awkの場合、

「使用言語にawkを選択した時点で負け」

つーのがあるよね。遅い、制限多し(ディレクトリ操作、Socket、モジュール、Oop・・・)
356山崎 渉:03/08/15 17:58
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン
フィールドの指定で、
$3 から行末まで全部とか
$2 から $20 までとか って指定できますか?

$2 $3 .... $20 って全部書かないと駄目でしょうか?
>>357
for でループして望みのことはできない?

for (i = 2; i < 20; i++) {
buf = buf" "$i
}
# buf を使って何かする

上のは単に例だが。
359357:03/08/29 00:18
>>358
レスありがとうございます。
もっと簡単にできるとうれしいんですけど
for で地道にやっていくことにします。
>>357
ああ、それイライラするときあるな
全部書くか、forで回すか
先にcut -fでフィルタしてから処理してるけど
awkでやるいい方法あるんかね
3から全部なら...
substr($0, index($0,$3))
362デフォルトの名無しさん:03/08/31 21:48
$1==$3だったら?
index()って裏もあるの?
>>361
バグってるっぽいなw
364デフォルトの名無しさん:03/09/01 23:04
さんざんお世話になったawkを見捨てられない俺はオヤジ
しかし「あおく」って発音する奴いるんだが。。。
青臭いな
366デフォルトの名無しさん:03/09/02 02:17
オライリーの「入門awk/sed」最強だよ。これで日々の作業が60%楽になった。
367デフォルトの名無しさん:03/09/02 20:31
>>366
ほとんど遊んでますな。
368デフォルトの名無しさん:03/09/02 20:39
目隠しをされ、男優2人から好き放題されます。
梨奈ちゃんは本当にかわいくセーラー服が似合います。
現役といっても通用するそのロリ顔にはファンが多いのも納得です。
気持ちいい、とうっかり言ってしまうと止めてしまうという
男優のいじわるに結構楽しんでしまっている梨奈ちゃん。
感度良好の彼女にとっては焦らし作戦に匹敵する快感なのでは?
こんなエロエロ無料ムービーが見てみたいなら
http://www.uradouga.com/
>>366
それだけで60%楽になるなら
シェルスクリプト書けるようになってcron使うようになれば
もう40%いけるぞw
おおー
371デフォルトの名無しさん:03/09/10 06:19
すいません
例えば、awk で syslogのデータを逐一監視してマッチしたデータを、摘出ってことをしたいんですが、syslogが大量に出てきたときに
データのとりこぼしとかって事はないでしょうか?

やりたいことは、各ユーザ(UID)がFTPサーバにUPLOADやDOWNLOADしたときのバイト数をそれぞれカウントしていき、保管したいのですが、
awkでそういったことは可能でしょうか?
>>371
出来ると思う。アクセスの頻度によっては現実的じゃないかもしれない。
逐一ってのが問題になりそうだが・・・
まあなに使っても問題になるからいいか
そういうときは tail -f LOGFILE | awk -f SCRIPTFILE で。
375デフォルトの名無しさん:03/09/11 00:23
>>374
ありがとうございます!!
そういえば、ログなんかぼ~と眺めるときに、tail -f /var/log/messages とかやります。
あとは、awkの方をじっくり考えていきたいと思います
376デフォルトの名無しさん:03/09/13 00:36
NF ==9 {
total = total + $5;
}

END {
printf("%d bytes\n",total);
}

こう記述して、
ls -l * | gawk -f bytes.awk としたら
6.1369e+10 bytes
このように出てしまったんですが、どんなに大きな数字でもきちんと表示できるようにするにはどうすればイイデスカ?
丸め誤差が許容できるなら
%.0f
378デフォルトの名無しさん:03/09/13 03:00
>377
ありがとうございます。
うまくいきました。
Javaのスレで質問したら、awkを使えばいいそうなんですが、どうやればいいのか、さっぱりです。。。

今このような作業をしています。

No.1 鈴木 Feb-01
No.2 松園 Mar-03
No.3 黒澤 Apr-04
No.4 鈴木 Jan-02
No.5 松園 Dev-02


この様な、リストを、以下のように一括で編集できるスクリプトを、書きたいのですが、
どのように書けばいいですかね?実際のファイルは4000個くらい並んでます。

鈴木 Feb-01,No.1 Jan-02,No.4
松園 Mar-03,No.2 Dev-02,No.5
黒澤 Apr-04,No.3

名前 半角スペース 日付,番号 と、言う形にしたいのですが・・・。

どんな風に書けばいいのでしょうか・・・。
$ cat a.awk
{ a[$2] = a[$2] " "$3","$1; }
END { for (n in a) print n, a[n]; }

$ cat data.dat
No.1 鈴木 Feb-01
No.2 松園 Mar-03
No.3 黒澤 Apr-04
No.4 鈴木 Jan-02
No.5 松園 Dev-02

$ awk -f a.awk data.dat
松園 Mar-03,No.2 Dev-02,No.5
黒澤 Apr-04,No.3
鈴木 Feb-01,No.1 Jan-02,No.4
>>379
読み込んでフィールドを並び変えてフォーマットするだけ
>>381
いや、重複してるの横につなげてるから
>>376 を見て、漏れが真っ先に思いついたのが(plala規制で書けなかった)

http://infoshako.sk.tsukuba.ac.jp/jdoc/GNU/AWK/jgawk-jman/html/jgawk_97.html#SEC102

の OFMT の変更だったのだが、

>丸め誤差が許容できるなら
>%.0f

の方が良いのかな。どうなんでしょうか?
384379:03/09/13 17:28
>>381
>>382

ありがとうございました、おかげで、効率があがりました。
私も、もっと勉強して、聞くほうから教えるほうに成りたいものです、
では、失礼します。
385380:03/09/13 17:32
(⊃д`) 俺は無視かよ。
>>385
泣くな。お天道様はちゃあんと見ておられる。
>>385
結局380になると思うよ。
388379:03/09/13 20:47
>>380

ぐあああ、すみません。
一番使わせていただきました^^;
どうも、みなさんありがとうございました。
>>383
383の方が正統っていうか王道っぽい
377は邪道っていうか脊髄反射
けどOFMTさわったことないんだよな
なにを設定すればいいんだ?
%.6gって・・・
390ruby-awker ◆Q13MAht0qk :03/09/14 00:26
ずっと名無しでやってきたけど
ちょっと変わった事したいのでコテってみました

awkでやるのは大変そうなものは
perl使えとか、ruby使えとか、良く言われるけど
んなもんいきなり使えるかヴォケ!!
今からperlやrubyなんてやってられねーよ
って時の助けになるようにちょっとづつtipsを書き込んでいきたいと思います

問題を解決するためのawk+αが欲しいんだけど
perl、ruby全部なんて覚えてられない。(それはコスト高すぎ)
必要最小限なものってなに?
ってのを追求していきたい(perlは苦手なんでrubyで)
なのでawkだけで問題なく出来ることはawkを使う方向で。
シェル、unixコマンド、sed、awk等を組み合わせれば簡単に出来る場合も
そちらを優先する方向で。
391ruby-awker ◆Q13MAht0qk :03/09/14 00:44
まずは、awkで出来ることを両方でやってみてawkとrubyの差異を確認

あんまり意味ないけど、まあ、欄が100超えててawk使えねーぞ、ヴォケ!!って時の役には立つかな
infile
---------------------
001,aaa,AAA
002,bbb,BBB
---------------------
期待するoutput
---------------------
開始
aaa
bbb
終了
---------------------
コマンドライン
awk :% awk -f a.awk infile
ruby:% ruby -anl a.rb infile

a.awk
---------------------
BEGIN {FS=",";print "開始";}
{print $2;}
END {print "終了";}
---------------------
a.rb
---------------------
BEGIN {$;=",";puts "開始";}
puts $F[1]
END {puts "終了"}
---------------------
a.pl
---------------------
print "開始\n";
while(<>) { split(/,/); print "$_[1]\n"; }
print "終了\n";
---------------------
393ruby-awker ◆Q13MAht0qk :03/09/14 01:10
コマンドラインオプション解説
a: 区切り文字で文字列を分割する
  分割した文字は、配列【$F】に格納される
  awkとの対応
  $1→$F[0]
  $2→$F[1]
  ・・・
n: 入力を一行づつ読み込んでループさせる
  一番awkらしい部分
  入力行は【$_】に格納される
  awkとの対応
  $0→$_
l: 文字列に付いている改行を削除
  これを入れないと最後の欄に改行がついてます
  あと、printに影響
printfはawkでもrubyでも同じ動作をします
printは慣れるまで使わない方がいいかも。
(lオプションありなしで動作が変わるのがいやん)
※使うならBEGINで【$,】と【$\】を明示的に設定するようにする
なのでprintの代わりにputsを使う
変数を混ぜないでただ文字列を出力するならawkのprintと同じ感覚で使えます
混ぜる時はこんな感じで
puts "aaa" + foo + "bbb"
けど個人的には使い分けをしないで済む(余計なことを考えないで済む)
printfを使うのがお勧め
awkとの対応
print→puts(変数を混ぜないでただ文字列を出力するなら)
printf→printf(同じ動作をすると考えていい)
注意点:
rubyだとメイン部分の波括弧がいらない
rubyだとセミコロンはあってもなくてもいい
394ruby-awker ◆Q13MAht0qk :03/09/14 01:20
>392
ああ、、、スマートですね
わたしの場合、perlでもnオプション付けてBEGIN付けてEND付けてってやりそう・・・
次はawkじゃ面倒くさそうだなあ・・・
とruby使った例です
infile
-------------------------------------------------------
001,A01/aaa/101,A02/bbb/199/BBB,A03/ccc/109/CCC,・・・
002,A01/zzz/0/YYY,A02/vvv//,A03/eee/10/FFF,・・・
-------------------------------------------------------
・・・には,WWW/XXX/YYY/ZZZの構造の文字列が続きます
欄の数は不定

やりたいこと
1:,WWW/XXX/YYY/ZZZ
  のYYYの部分に
  1または2桁の数字があった場合は先頭0埋めして3桁にする
  0桁の場合は000
2:WWW/XXX/YYY/ZZZ
  のZZZの部分が存在しなかったら
  AAAを付与する
  この場合、最後の"/"はあるかないかわからない
期待するoutfile
-------------------------------------------------------
001,A01/aaa/101/AAA,A02/bbb/199/BBB,A03/ccc/109/CCC,・・・
002,A01/zzz/000/YYY,A02/vvv/000/AAA,A03/eee/010/FFF,・・・
-------------------------------------------------------
395ruby-awker ◆Q13MAht0qk :03/09/14 02:39
awkで出来るじゃん・・・ _| ̄|○

BEGIN{FS=","}
{
printf("%s", $1);
for(i=2;i<=NF;i++) {
printf(",");
cnt = split($i, ary, "/");
printf("%s/%s", ary[1], ary[2]);
if(ary[3] == "") {
printf("/000");
}
else {
printf("/%0.3d", ary[3]);
}
if(cnt == 3 || ary[4] == "") {
printf("/AAA");
}
else {
printf("/%s", ary[4]);
}
}
printf("\n");
}
396ruby-awker ◆Q13MAht0qk :03/09/14 03:30
まあ、せっかくだからruby版も・・・
   ||
 ∧||∧
(  ⌒ ヽ
 ∪  ノ
  ∪∪

BEGIN {$;=","}
printf("%s", $F[0])
$F[1, $F.size].each { |str|
ary = str.split("/", -1)
if(ary[2] == "")
ary[2] = "000"
else
ary[2] = sprintf("%0.3d", ary[2])
end
if(ary.size == 3 || ary[3] == "")
ary[3] = "AAA"
end
printf(",%s", ary.join("/"))
}
printf("\n")
397デフォルトの名無しさん:03/09/14 05:55
いま、awkでいろいろ遊んでみてるのですが、ファイルを抜き出す部分で、少し困ってます

ls -il --full-time したものを、list.logに入れて現在下のような感じになってます。

cat list.log
4407301 -rwxrwsr-t 1 sakura hoge 1736 2001-08-13 05:08:20.000000000 +0900 (ハイスクール!奇面組)象さんのすきゃんてぃ.txt
5029910 -rwxrwsr-t 1 sakura hoge 855 2001-08-13 05:12:18.000000000 +0900 (アイドル天使ようこそようこ) 恋文ブギ.txt
5128240 -rwxrwsr-t 1 sakura hoge 1263 2001-08-13 05:12:57.000000000 +0900 (小公女セーラ)ひまわり.txt

そして、ファイル名を抜き出すものをawkで書きました
cat filecut.awk
NF == 10{
cnt++;
printf "%d File inode:%d %s\n",cnt,$1,$10;
}

そしたら、inodeが4407301と5128240 のものは、きちんと表示されるのですが、5029910に関しては、ファイル名に最初からスペースが入ってるので、
おそらく NFが11となっている為きちんと表示できません。

NF == 11{
cnt++;
printf "%d File inode:%d %s\n",cnt,$1,$11;
}
というのも、付け足してみて表示してみたんですが、そしたら、今度は、スペースが2つ入ってるものが取れませんでした。
スペースに関係なく、ファイル名を取得できる方法はないでしょうか?
>>397
決め打ちやめて、for で $n を増やして取得するようにすれば
(汚いけど)出来るが。

>>357-363 見たら参考になるかも。
ざっくり作ると↓な感じになると思う。
あとは適当にアレンジして。

func aaa( i,tmp) {
  for (i = 10; i < NF; i++) {
    bbb = bbb" "$i
  }
  return(bbb)
}
>>399
バグった。

func aaa( i,bbb) {
  for (i = 10; i < NF; i++) {
    bbb = bbb" "$i
  }
  return(bbb)
}
401デフォルトの名無しさん:03/09/14 06:35
>>398
ありがとうございます。
こんな感じで、思い通りに表示できました。


{
    cnt++;
    if(NF >= 10){
       printf "%d file inode:%d ",cnt,$1;
       for(i=10; i <= NF; i++){
            printf "%s ",$i;
       }
       print "\n";
    } else {
       printf "%d File inode:%d %s\n",cnt,$1,$10;
    }

}
402397:03/09/14 06:59
>>399-400
ユーザ定義関数版のサンプルありがとうございます。
見た目がスマートそうだったので、作り直してみました。

func FileCut(FileName){
    for(i=10;i <= NF; i++){
        FileName = FileName" "$i;
    }
    return(FileName)
}

{
    cnt++;
    FileName=FileCut($10);
printf "%d File inode:%d %s\n",cnt,$1,FileName;
}

func aaa( i,bbb) となってましたが、for文で iを初期化してるみたいなので、引数は、1つにしてみました。
403ruby-awker ◆Q13MAht0qk :03/09/14 22:53
なんとなくruby版
cntにローカル変数使えなくてビックリ・・・(グローバル変数にしました)
あとバグもってるけどどうしたものやら
・ファイル名に空白が2以上連続してると喰われて1つになる
------------------------------------------------------------
BEGIN{$cnt = 0}
$cnt = $cnt + 1
printf("%d File inode:%d %s\n", $cnt, $F[0], $F[9, $F.size])
------------------------------------------------------------
404ruby-awker ◆Q13MAht0qk :03/09/14 23:12
バグ修正
aオプションで文字列分割してたのを
明示的にsplitさせて回避
% ruby -nl a.rb a.in
------------------------------------------------------------
BEGIN{$cnt = 0}
$F = $_.split(/\s/, -1)
$cnt = $cnt + 1
printf("%d File inode:%d %s\n", $cnt, $F[0], $F[9, $F.size].join(" "))
------------------------------------------------------------
405397:03/09/15 09:30
>>397 >>401-402 でお世話になってるものです。
現在やっと、まともに動くようになりました。

今現在は、ls -il --full-time /hoge/hogehoge/* を打って、FileCut.awkを通したときに下のように表示されるようになりました。

5029940,-rwxrwsr-t,sakura,hoge,1726,2001-08-13, /hoge/kashi/00_歌詞/魔法少女&戦う少女:, (ファンシーララ)トランス・パランス.txt
inode   chmod   UID  gid  size  time          FullPath                         FileNmae


今の問題点は、ls -il --full-time /hoge/hogehoge/* を実行したとき、ディレクトリだけが表示されてしまう行があるので、
パターンの NF == 1 とのところで、Directoryだけを抜き出すように、ユーザ定義用関数を用意して対応しました。

今現在の問題は、NF == 1 としてることによって、$1にパス名は確保されているが、Directoryにスペースが入ってる場合は、
$2以降は何も代入されていないのでは?という点です。
長文になって申し訳ありませんが、NF == 1 の場合$1が受け取るパスは、かならず、/hoge/hogehoge/ 以下と決まってるので、
現在 NF == 1になってるパターンを、正規表現に置き換えてしまったらいいのかな?と思っているのですが、妥当でしょうか?

正規表現は、あまり知らないのですが、$1~\/hoge\/hogehoge\/\* こんな感じをパターンに置けばいいのかなと思っています。
406デフォルトの名無しさん:03/09/15 09:35
>>397 >>401-402 >>405
下のソースで現在の、ls -il --full-time /hoge/hogehoge/* から、各カラムを、','で区切って一覧を出しています。
上手くいったらこれを、PostgreSQLなどに投げたいと思っています。
BEGIN { FS = " "; }
# ファイル名抜き出し用ユーザ定義関数
func FileCut(FileName){
    FileName = "";
    for(i=10;i <= NF; i++){ FileName = FileName" "$i; }
    return(FileName)
}

# ディレクトリ名抜き出し様ユーザ定義関数
func DirCut(DirName){
    DirName = "";
    for(i=1;i <= NF; i++){ DirName = DirName" "$i;}
    return(DirName)
}

#問題となっている正規表現に置き換えたらいいのかどうか迷っているパターン
NF == 1 { path = DirCut($1); }

NF > 9 {
    cnt++;
    FileName=FileCut($10);
    printf("%s,%s,%s,%s,%s,%s,%s,%s\n",$1,$2,$4,$5,$6,$7,path,FileName);
}

END { printf("%s件\n",cnt); }
407デフォルトの名無しさん:03/09/15 09:38
>>405-406
遊びでやってるだけですので、ウザイ様でしたらそのまま放置でも結構ですので(^^;;
まいどまいど長文ですみません;;
408397:03/09/15 11:20
>>397 >>401-402 >>405-406
あってるか判りませんが、このような正規表現をパターンに入れて実行したら動きました。
どんな条件がきても、大丈夫かどうか不安なので引き続き調べてみたいと思います。

$1~/\/hoge\/hogehoge\//
409デフォルトの名無しさん:03/11/03 08:57
例えば,以下のファイル(A.txt, B.txt, C.txt,…)を入力にして,output.txt
のような出力を得たいと思います。(<>部分はファイルの内容ではなくファイ
ル名)

どのようなawkスクリプトが考えられるでしょうか?

<A.txt>
X1,X2,X3,X4,X5,X6

<B.txt>
X1,X2,X5

<C.txt>
X1,X3,X4,X5,X6

:

<output.txt>
X1,X2,X3,X4,X5,X6
B,1,1,0,0,1,0
C,1,0,1,1,1,1
:

つまり,A.txtと,B.txtやC.txt内のkeywordを比較し,マッチすれば1,しな
いなら0として表示したい。そのとき出力の形式として表頭にはA.txtの
keywordを,表側にはB.txtやC.txtなどファイル名を連想させるものを配置し
たい。
>>409
連想記憶による擬似2次元配列じゃないだろうか。
411デフォルトの名無しさん:03/11/04 20:02
>>410
では,連想記憶による擬似2次元配列を利用した手頃なサンプルスクリプトを
ご存じでしょうか?
>>411

{

/* 1ファイル目について項目のリストを作る。*/

ITEMS[項目名]=1;

/* 2ファイル目以降について、出現項目で以下を実行する。*/

TBL[ <ファイル名> "," 項目名] = 1;

/*同時にファイル名のリストも作っとく。*/

FILES[<ファイル名>]=1;
}

END{

 for (file in FILE) {
   for (item in ITEMS){
     printf ("%d,", TBL[file "," item]);
   }
  print;
 }
}

/* こんな感じってことで勘弁して。もう生意気なこと言わないから */
413デフォルトの名無しさん:03/11/05 04:51
デバッグはしてないけどこんな感じかな

gawk -f hoge.awk a.txt b.txt c.txt
----hoge.awk
BEGIN{FS=","}

{
  if(FNR==NR) {
    for(i=1;i<=NF;i++) keys[i]=$i;
  }
  else {
    for(i=1;i<=NF;i++) {
      dat[FILENAME,i]=0;
      for(j in keys) if(keys[j]==$i) dat[FILENAME,i]=1;
    }
    cnt[FILENAME]=NF;
  }
}

END{
  for(i in keys) printf(keys[i]",");
  printf("\n");

  for(fname in cnt) {
    printf(fname",");
    for(i=1; i<=cnt[fname]; i++) {
      printf(dat[fname,i]",");
    }
  }
}
414デフォルトの名無しさん:03/11/05 05:04
omg!
問題勘違いしてました。
>>412さんのでできましたね。
はずかすぃ
415デフォルトの名無しさん:03/11/05 19:50
>>412
>>413
なるほど。
両者を参考に,こんな具合にしてみました。
ところで, if(FNR==NR) は,どういう意味でしょうか。

----hogehoge.awk
BEGIN{FS=","}
{
if(FNR==NR) {
print;
for(i=1;i<=NF;i++) ITEMS[$i]=1;
}
else {
for(i=2;i<=ARGC -1;i++) FILES[ARGV[i]]=1;
for(i=1;i<=NF;i++) {
TBL[FILENAME "," $i]=1;
}
}
}

END{
for (file in FILES) {
printf(file",");
for (item in ITEMS){
printf ("%d,", TBL[file "," item]);
}
printf ("\n");
}
}
416デフォルトの名無しさん:03/11/05 21:25
リファレンス
http://infoshako.sk.tsukuba.ac.jp/jdoc/GNU/AWK/jgawk-jman/html/jgawk_toc.html

FNRとNRの説明があります。
ttp://infoshako.sk.tsukuba.ac.jp/jdoc/GNU/AWK/jgawk-jman/html/jgawk_98.html#SEC103

総レコード数とファイルレコード数が一緒なら最初のファイル。
違えば2番目以降のファイル。
417デフォルトの名無しさん:03/11/05 22:50
>>416
> 総レコード数とファイルレコード数が一緒なら最初のファイル。
> 違えば2番目以降のファイル。

ありがとうございます。
処理開始時だけ,FNR=NRで,後はずっと,FNR<NRとなることを利用してる訳で
すね。これって,今回のケースのように,複数のファイルを引数にとったとき
に,各ファイルによって処理内容を変更するための常套手段だと覚えておけば
いいでしょうか?
418413:03/11/06 00:09
常套手段なんて立派なもんでなく、書いてる時に思いついただけのもんです。
最初のファイルだけ特別な時に使えますね。

各ファイルごとに処理を変えるなら、FNR==1かFILENAMEを直接参照ですね。
419デフォルトの名無しさん:04/01/31 11:59
教えてください。以下の2つのファイル(input-1,input-2)からoutputのような
結果を得たいと思います。

input-1 inpu-2 output
1 1,10,11 1,10,11
2 3,30,13 2,NA,NA
3 4,40,14 3,30,13
4 4,40,14
5 5,NA,NA

input-1とinput-2の第一列目を比較して,同じならinput-1の第一列目と
input-2の第二列目以降を出力し,違えばNAを表示するということです。
何をしたいのかが、ちっともわかりません
・input-1, input-2 の例
・上記例から得たい output の例
を晒せ
>>420
晒したつもりでしたが書き方が悪かったようでした。
input-1は以下のコマンドを実行して作成したものです。
echo -e '1\n2\n3\n4\n5' > input-1
input-2は以下のコマンドを実行して作成したものです。
echo -e '1,10,11\n3,30,13\n4,40,14' > input-2
得たい結果は以下のコマンドを実行して作成したようなものです。
echo -e '1,10,11\n2,NA,NA\n3,30,13\n4,40,14\n5,NA,NA' > output
awk -f prog.awk input-1 input-2 > output
-----
BEGIN{ FS=",";
while((getline < ARGV[2]) > 0) Tbl[$1]=$2 "," $3;
ARGV[2]=""; }
{ print $1 "," (($1 in Tbl)?Tbl[$1]:"NA,NA"); }
-----
>>422
完全解答ありがとうございました。
カーニハン本はトッパンが潰れた後
>>26 のネット書店が扱ってたようですが、
今度はゲーヲタ向け出版社から新装版で出ますた。
http://w3.shinkigensha.co.jp/books/4-7753-0249-3.html
425デフォルトの名無しさん:04/02/26 21:58
そらりすでやな、「abcという文字列が含まれる行だけ」というのを
if(/abc/){
...
}

ってやると構文エラーって怒られるんだ。
でも、Linuxでは通るんだよね。

何か違うの?
Linuxのはgawkだからな。
/abc/ { ... }
と書くのが普通じゃないかと
428デフォルトの名無しさん:04/02/29 17:24
>427

すみません、-fオプションで別ファイルにしたいんですよ。
>>428 意味不明
430428:04/02/29 21:01
>429

え、そう?

コマンドラインから実行する場合は>472が書いた方法でやるけど、スクリプトファイルを別に作る場合は-fオプションじゃなかったっけ?
で、そのスクリプトファイルの中に記述する場合に>425の方法でやりたいわけですよ。
431430:04/02/29 21:02
あ、ごめん

>472じゃなくて>427ね。
>>431 おちつけ。完璧に意味不明だぞ。

#!/usr/bin/awk -f
/abc/ { print }

という感じで一行目が違うだけで下は普通のawkのコード。
awkは死滅していないYO!
Apacheのインストールにも使われているしNE!
しょうがない、俺様がぐぐって見つけてあげたよ
↓ほれ
ttp://superk.physics.sunysb.edu/~kenkou/program/awk/node19.html
435428:04/03/01 01:04
>432

え? ソラリスの場合は、シェルスクリプトみたいな感じでやらないとダメなの?

そんなことAWKの本には書いていなかったよ。ただスクリプトファイルを別に作る場合には云々というだけで。実際、WINもLinuxもそれでOKなんだけど。

なんかこんがらがってきた。
>>427 をちゃんと読んだのか。読んだとして文句を言っているから周りが推測してやろうとしてやってるんじゃないか。ちなみに #!行があってもコメントとして無視されるから別にいいんだぞ。
>>430
よーするにだ、スクリプトファイルに >427 のよーに書けと
言っている訳なんだが理解できんか?
ま。いろいろ端折って言うと。

if(/abc/)ってのは、本来の文法には違反するわけで。
gawkってコマンドが、文法を拡張したから使えてるだけで。
たぶん正規表現だけ書くと、if($0 ~ /abc/)と同じ意味になるんだろう。

で、ふつうシェルから書くと、
awk '/abc/{print}'
って書くと思うけど、
fオプション使った場合は、その''で囲んだ中身を、
#!/usr/bin/awk -f
の後に続けて書けばいい、と。
ねえ。awkのsystemってみんな使う?
無きゃ困る?
fおぷ つかうなら
>#!/usr/bin/awk -f
はいらね-だろがヴォケ!
>439
OSのsortとか使うときに必要
>>441
うーん、そっか。面倒くせーなぁ。
さんきゅ。
443デフォルトの名無しさん:04/03/01 17:33
>>439=>>442
面倒くさいって、どういうこと?
awkの実装書いてるの?

>>440
その引用した行の、最後のところ。。。
>>443
いや実はポーターで。
system抜けば多くの実装がすぐにでも動かせるんだけど、
入れようとすると途端に面倒に。
まあ不可能じゃねーからどうにかするけど。
せっかく久し振りに風邪ひいたから、明日も仕事休んでやってみるかな。

実装書くのも面白そうだね。
規模はそんなに大きくないから細かい部分を好きに弄りながら楽しめそう。
渋くて好みには合うから、その内やってみるかな。
>>443
>>434読め
>>444
どこが難しいんだ?
つか、system() 使わなければ、実装せずに済みそうな言い回しに聞こえたんだが。
>>446
パイプが少し。
面倒なだけで難しくはない。

肝心な物抜きで人前に出すのは間抜けだけど、
多少表に見える形で動いた方が自分が安心出来るとか。
そんで少しでも多めに時間かかりそうな部分は後回しにして
取り敢えず経過物出していこうかなとか。そういう考え。
不完全な状態でも便利に使えるものってあるし。
まあ焦らずやる事に。
448デフォルトの名無しさん:04/03/03 23:15
超初心者質問かもしれませんが、
例のようなリストを下のような結果に整列させたいです。
条件は、まず、上から順に001を探す。
001の$2が一致する002を探して001の下に出力し、以下繰り返し。
001があったら002は必ずあるものとして考えます。

【例】
001 AAA ****
001 BBB ****
002 AAA ****
001 CCC ****
002 CCC ****
002 BBB ****
  ↓↓
001 AAA ****
002 AAA ****
001 BBB ****
002 BBB ****
001 CCC ****
002 CCC ****

awkは行単位で処理をするから、
1番目の001を見て、その中のデータを元に全行を検索、
見つかったら2番目の001を見て・・・というのは無理なのでしょうか。
もしよろしければ教えて頂けないでしょうか。
2ステップでやる

awk '{print $2,$1,$3}' data | sort | awk '{$2,$1,$3}'
>>447
何が面倒なのか、あんまりわかんなかったよ。ポーティングなんだよね?
シェルかパイプに制限があるの?
>>448
その例のままなら、sort +1 +0でよさそうな気がする。やってることは449とほとんど同じ。
ま、環境がWinなら話は別だが。

それから、逆読みしたいなら、多くの場合は、
行ループで配列に詰めて、ENDで処理している気がする。
>>450
制限と言うより不足かな。
なまじ不可能でないのが何とも。
端的に言えばコマンドの解釈と実行にシェルが介在してくれないし、
popen()もそれを作るのを助けるfdopen()も無い。
gawkのマニュアル見ると一部の環境でsystem()は使えないと書いてあるけど、
全部用意すれば使えない訳じゃないし、という。

風邪ひいてる間に作業して3分の1くらいは終わったので、
あと今週休日が取れれば終われるかも。
453デフォルトの名無しさん:04/03/05 21:30
>>499
>>451
どうもありがとうございます。
ちょっと例の文章がわかりづらくてすいません。

$2なんですが、順番にソートさせたいわけではなく、
001が出てきた順に表示させたいんです・・・。
001 X
001 A
001 C
だったら
001 X
002 X
001 A 以下略

のようにしたいんです。どうかご教授お願いします。
454499(だれ?):04/03/06 00:14
{ if(!($2 in tbl)) tbl[$2]=cnt++; printf("%5d %s\n", tbl[$2], $0); }

awk -f pre.awk data | sort | awk '{print $2,$3,$4}'
>>453
あいかわらず日本語も例も意味不明
/^001/ {k[n++]=$2; l001[$2]=$0}
/^002/ {l002[$2]=$0}
END {for(i=0;i<n;i++){ print l001[k[i]]; print l002[k[i]]}
AWKで不特定長の文字列の後ろから4文字を取得したい場合
どうすればいいのでしょうか

文字列の長さが固定ならsubstr$1で指定すれるのはできるのですが、
不特定の長さの文字列から、というので行き詰まっています
もしよろしければ教えて頂けないでしょうか。
>> 457
いまいちかっこわるいが、
{gsub(/....$/, RS "&"); print $NF}
substr(length($str)-3, 4)
間違えた
substr($str, length($str)-3)
>>460
変数に $ はいらない。Perlのしすぎか?

…いやひょっとして、
str = 3
=> ($str == $3)

みたいなコードの一部なのか?
>>461
$が演算子だったというのをawk使い始めて
十数年にしてはじめて知ったよ...


.
463 460:04/03/18 23:09
>461
あー そうね $はいらんね
perlでなくphpだけど まあどうでもいいな
失礼
画面制御できないの
cursesみたいに
465デフォルトの名無しさん:04/03/22 02:36
あげとく
466デフォルトの名無しさん:04/04/09 22:54
>>464
awkの作者は1行プログラムを薦めている。
そもそもフィルタとして使われるべきツールである。
>薦めている
すすめてませぇ~ん
最初のバージョンのときはワンライナーのためのツールとして作ったのに
ユーザーが複雑なプログラムを組むのを見て驚いたとは言っていたな

最初のバージョンでは function すらなかったが、それでLispインタプリタを
作ったつわものもいた。
469デフォルトの名無しさん:04/04/23 16:04
シェルスクリプトなら

#!/bin/sh

a=`date +%H`

とか書くところ、awkだとどう書くの?
「gawk使え」ってのは無しでお願い。
>>469
gawk 使(ry

  #!/usr/bin/awk -f

  ("date +%H") | getline a;
471470:04/04/23 16:31
あー、いきなりアクション書くなよ?

  BEGIN {
  }

で挟んどけ。
472デフォルトの名無しさん:04/04/23 16:36
>>470 御返答ありがとうございました。
ttp://infoshako.sk.tsukuba.ac.jp/jdoc/GNU/AWK/jgawk-jman/html/jgawk_25.html
見て事故^H^H自己解決したところでした _o_

close しないで放置プレイでも桶なんでしょうか?
473デフォルトの名無しさん:04/04/23 16:42
シェルスクリプトとawkではどっちが高速かなぁ
474デフォルトの名無しさん:04/04/23 18:40
>>473 timeで計測汁!
>>472
>close しないで放置プレイでも桶なんでしょうか?
何度も通るアクションで使うんだったら close しないとだめでつ。
476デフォルトの名無しさん:04/04/23 20:29
それにしても蟹御飯の書いたawkのソースは綺麗だよな。良いCの勉強にもなりまつた。
477デフォルトの名無:04/04/23 20:58
>>476
ああ・・・「蟹御飯」=B.Kernighanね。
「蟹御飯」と「awk」でググってしまった俺。。。。_| ̄|○
478デフォルトの名無しさん:04/04/26 00:24
windows上でawk使ってる香具師はどのぐらいいるのかな?
かなり
480デフォルトの名無しさん:04/04/26 09:09
漏れはWindows用のjgawk使ってるよ。
前にawkで300行弱のプログラム(ラッパー)書いたけど、ギネス記録級だとどれ位に
なるのかな?まさか10kは逝かないと思うが…。
482デフォルトの名無しさん:04/04/27 14:19
AWKhttpdは335行だね
628行か。厨房の頃P6で遊んだ頃を思い出したけど、
やっぱUNIXのツールで書いてるとソースの寿命が長いね。
AWKは枯れてる分、Perlより安心感あるし。
アスキー出版局の「AWKを256倍使うための本」を入手しました。
Windows2000SP4のコマンドプロントで使うため、ベクターから
Japanized Gnu Awk (jgawk) 2.15.2 + 1.1
をダウンロードし、いじってみましたが、書籍の中に'NDP'、'DOSエクステンダ'
等の記述があり、上記のバージョンは自分の環境に適しているのでしょうか?
(たとえば、使用メモリの限界があるとか)もっとベターな処理系がありましたら、
教えていただければ幸いですが。
>>485
NDP(FPU)はPentium以降のCPUなら初めから内蔵しています。
Windows 2000が動く環境ならば気にする必要はありません。

DOSエクステンダはMS-DOS上で32Bit環境を使うための物です。
これもWindows 2000上でWin32用のawkを使う分には関係ありません。

その本は出版当時主流だったMS-DOS上の処理系を使うことを
前提に書かれていますのでそのような記述がありますが、
Windows 2000上では今お使いの処理系で特に問題ないと思います。

487485:04/05/02 21:32
>486
ありがとうございます。
488デフォルトの名無しさん:04/05/06 16:42
gawk-2.x と gawk-3.x で、「仕様変更」っていえるものはあるの?
機能拡張はウジャウジャありそうだけど…
ttp://www.kt.rim.or.jp/~kbk/gawk-30/gawk_18.html

>next file文はnextfileに変更された
>FSに空文字列がセットされたときの動作と、 splitの第三引数に空文字列を渡したときの動作
>RSが正規表現のときの動作
>IGNORECASEの値が、文字列比較だけでなく、正規表現演算にも適用されるようになった
490デフォルトの名無しさん:04/05/07 08:59
>>489
サンクス。
やはり --posix で動くように書いていた方がいいのかなぁ
491デフォルトの名無しさん:04/05/18 10:16
学校の授業でawkで簡単なプログラムを作れと課題が出てるのですが
awkがさっぱり理解できません。
どこかわかりやすく解説されてるHPがあれば教えてもらえませんか?
すまんが、どのレベルで理解できてないかがさっぱりわからない

さしあたり
ttp://www.vector.co.jp/soft/dos/util/se006218.html
ttp://aoki2.si.gunma-u.ac.jp/Hanasi/Algo/awk.html
>>492>>493
ありがとうございます。
授業で初めて知ったレベルなのでかなりわかってないかと。
組込み関数にどんなのがあるか、その使い方とか文法とか
全てさっぱりでして(^^;
495デフォルトの名無しさん:04/05/25 20:05
ファイル名に日付を付け足す為にawkを使ってこんなの書いたんですが、もっとシンプルになりませんかね?

awk -v outfile="${OUTFILE}" -v date="$(date "+%Y%m%d")" '
BEGIN{
outfilename=""
if(outfile ~ /\.[^\/\.]*$/){
   extension=splitoutfile[(split(outfile, splitoutfile, "."))]
   print (substr(outfile, 1, (length(outfile)-(length(extension)+1))))(date)"."(extension)
}else{
   print (outfile)(date)
}
}
' /dev/null

${OUTFILE}には/home/hogehoge/log.txtとかのファイル名を入れておいて、拡張子の前に日付を入れたいのです。
/home/hogehoge/log.txt→/home/hogehoge/log20040525.txtってな感じに。
拡張子がなかったらそのままケツに日付がつけばいいです。
/home/hogehoge/log→/home/hogehoge/log20040525ってな感じに。
置換でうまくできないかなぁ。
awk使えねえ
複数ファイルオープンってできないの?
498デフォルトの名無しさん:04/05/25 22:01
>>497
おまえはアフォか?
499デフォルトの名無しさん:04/05/25 22:02
AWKは良いツールだ。(しみじみ)
DOS(WIN含む)環境に、SORTFとAWKがあればコマンドライン操作は天下無敵。
MS-DOSが流行っていた頃、BASICでなくAWKとバグなしSORTがあったら
パソコンの使われ方は変っていただろうと思う。

ところで、私はWINDOWS上でGNU-AWKを使っている。
「スクリプティング言語資料室(仮)」内の
ttp://www.kt.rim.or.jp/~kbk/gawk/gawk_toc.html
から辿っていってほしい。
500デフォルトの名無しさん:04/05/25 22:03
500get
501デフォルトの名無しさん:04/05/25 22:03
gawkはawkにあらず
503デフォルトの名無しさん:04/05/25 22:11
SORTFは重複を操作できる。 早いし数十万LINEの操作も地道にこなす。
ttp://www.vector.co.jp/soft/win95/util/se000882.html

A,Bの2グループのAグループだけに存在する要素を探す事も出来きる。
これはポーティング元の性能が良いからなんですけどね。
504デフォルトの名無しさん:04/05/25 22:14
>>502
確かに動きが違うわな。

純粋が好きなら
ttp://www.cs.bell-labs.com/cm/cs/awkbook/index.html
をどうぞ。
>>499
> MS-DOSが流行っていた頃、BASICでなくAWKとバグなしSORTがあったら

あったらも何もAWKとSORTFはDOS全盛の頃の定番ツールですが
awkとあんま関係ないが
その頃はX68kでgccやμemacsとか動いてたな。
メモリ数メガでよくやってたもんだ。
当時awkは詐欺みたいな言語に見えたな。
C言語覚えた後、結局使う事はなかった。
>506 適材適所
awkで済む事をわざわざCで書くことはない
Windows環境のDOSモードでjgawkを使うばやい、
http://www.vector.co.jp/soft/dl/dos/util/se000208.html
ここで落とせるけれど、新旧2版があって
「256倍」本は2.15.2+1.1のほう準拠になってる。

2.11.1+3.0のほうではたとえば
FIELDWIDTHS組み込み変数が使えなかったんで往生した。

普通安定考えて古いほう使う癖がついていたんだが反省㊦。



>>495
すこし考えてみたが、シンプルにはならんと思う。
awkにはdirnameとbasenameに分離して渡して、IFSをdotにすれば少しは簡単になるが
basename自体に複数のdotが存在しなければ良いのだが
basename自体に複数のdotが存在する場合がアタマイタイ
仕様のこの点の説明が無いのでここまで
上の方でも言ってる人がいたけど、
(OS付属とかの)awkで複数ファイルをオープンするとかできないの?
外部ファイルのテーブルのデータを使って、
入力を切り分けしたい場合があったんで。
もうperlで組んじゃったけど。
511508:04/05/30 17:45
>>495
dosだとFS=\\
とやっておくと、$NFで名前は取り出せるからsplit使って
あとはrenだな。
512495:04/05/30 20:21
>>509
考えてくれてありがとうございます。
なるほど、dirnameとbasenameで分ける方法もありますね。
basenameにはdotがあったりなかったり複数あったりします。
仕様は、
・dotがない場合→末尾にdateを付ける
・dotが一つの場合→dot以降を拡張子と見なし、拡張子の前にdateを付ける
・dotが末尾に在る場合→dotの前にdateを付ける
・dotが複数ある場合→一番最後のdot以降を拡張子と見なし、拡張子の前にdateを付ける
って感じです。
う~ん、if使ってるのがちょっと気に食わないんですよねえ。

>>511
OSはUNIX(HP-UX)っす。
513デフォルトの名無しさん:04/05/30 21:29
>>510
getline a < ”aa.a”

しかし俺はあんまり複雑なものは好みじゃないんで、
なんとかフィルタの連続にしようとするな。
無理にawkでやろうと思ったら

1)外部ファイルのテーブルを入力としてawkのfunctionを出力するフィルタを書く
2)本処理用のスクリプトでは1が出力したfunctionを -f で取り込んで使う

と言う風に組むのも一手。
(プログラムを出力するプログラムってカーニタンが好きなパターンだよね)

515デフォルトの名無しさん:04/06/10 04:12
Objective AWK

トランスレータでも作ろっかな…。
>>495
面白そうだったから、awkじゃないけど考えてみた。

d=`date +%Y%m%d`
sed '/\.\([a-z0-9]*\)$/s||'$d'.\1|
  /\(^|\/\)[a-zA-Z0-9]*$/s/&'$d'/
  '
517495:04/06/11 21:04
>>516
面白そうなんでやってみたんですけど、エラーが出てしまいますた。
sed: -e expression #1, char 70: Unterminated `s' command
sedは詳しく知らないので使い方教えてくれませんか?
awkで四苦八苦するより、
perlで適当に書いたほうが早い。
そういう時代になった。
>>516 みたいに sed sed したやつを読めなくなっちまった。
Awk が使えるようになったら sed は一行モノしか書かなくなっ
たし、その awk も今じゃ「建前」として移植性が必要な場合し
か書いてないなぁ。Gawkism が抜けなくて、欝。

力技だけど、こんなんでどう。最初の置換で8桁の日付けを末
尾に付加して、次の置換で接尾辞と日付けを入れ替えてる。
y10k問題で 7996年後は使えないけど。

echo $OUTFILE | sed -e 's/$/'`date +%Y%m%d`'/' -e 's/\(\.[A-Za-z0-9]\{1,\}\)\([0-9]\{8\}\)$/\2\1/'
520516:04/06/12 21:32
>>517
2つ目のsedコマンド間違ってた。
こっちが正解。でも>>519のがいいかも。

d=`date +%Y%m%d`
echo $OUTFILE |
sed '/\.\([a-z0-9]*\)$/s||'$d'.\1|
  /\(^|\/\)[a-zA-Z0-9]*$/s//&'$d'/'
現在プログラム板にはHSP関連スレに凶悪な荒らしどもが住みついています。

・HSPに関係の無い話題でスレッドを上げまくる
・HSPオフィシャルサイトの住人を名指しで誹謗中傷する
・重複スレを乱立させる

などの荒らし行為を行っています。
みんなで団結してム板のゴミどもを追い出しませんか?

【HSP関連スレ】
【皆のレイプ魔】HSP初質P25【WWEヲタ=ハゲ】
http://pc5.2ch.net/test/read.cgi/tech/1086878505/
HSP>>>>>>>>>>>>>C=糞w
http://pc5.2ch.net/test/read.cgi/tech/1071899663/
今日もどこかでHSP初心者が質問ですP19
http://pc5.2ch.net/test/read.cgi/tech/1084089079/
HSPについて
http://pc5.2ch.net/test/read.cgi/tech/1085149790/
522495:04/06/13 00:36
>>516,519
ありがとうございます。
どちらも正常に動作しました。
516氏のほうは7996年後も使えそうですね。
sedもちょいと勉強せねば。。。
Plan9+rc+awk・・・・美しい
525デフォルトの名無しさん:04/07/14 20:29
$0の中の$1以外、ってどうやって取り出す?
もしくは$0から$1を削除するってことなんだけど
substr($0, length($1)+1)
>>526
即レスありがとうございました。
もうちょっと調べてから質問します。ゴミンよ
528デフォルトの名無しさん:04/07/18 01:26
O'REILLY の sed & awk 6.1.1 に N が失敗したら行を出力することなく、
sed が実行を止めてしまうと書いてありますが、 GNU sed は
N が失敗した後、b と同じ動作をしているみたいに思えるのですが、
この理解はあってますか?
完全に意味不明でつ。
>>529
N や b はわかりますか?
>>528
GNU の拡張。
version 4.0.8 までは N に失敗すると、 オプション -n 等で出力を抑制していない場合、
パターンスペースを出力して終了していた(ラベルなし b を実行しているようにも見えるか?)。
4.0.9 以降は環境変数 POSIXLY_CORRECT を設定すればこの出力を止められるようになった。
4.1 以降はオプション --posix で GNU の拡張を止められるようになった。

以上がソースを見てわかったこと。
ここはawkのスレであってsedのスレではないですよ
UNIX板にsedスレあるのでそっちへどうぞ
>>531
なんかわけのわからん拡張ていうか改変だな。
どんな役立つ場面を考えてそんな風に変えたんだろうか。
>>533
info sed の Reporting Bugs より

`N' command on the last line
     Most versions of `sed' exit without printing anything when the `N'
     command is issued on the last line of a file. GNU `sed' prints
     pattern space before exiting unless of course the `-n' command
     switch has been specified. This choice is by design.

     For example, the behavior of
          sed N foo bar

     would depend on whether foo has an even or an odd number of
     lines(1). Or, when writing a script to read the next few lines
     following a pattern match, traditional implementations of `sed'
     would force you to write something like
          /foo/{ $!N; $!N; $!N; $!N; $!N; $!N; $!N; $!N; $!N }

     instead of just
          /foo/{ N;N;N;N;N;N;N;N;N; }

     In any case, the simplest workaround is to use `$d;N' in scripts
     that rely on the traditional behavior, or to set the
     `POSIXLY_CORRECT' variable to a non-empty value.

うーん、1個目の例がなんで最終行を出力する理由になってるのかよくわからないし、
2個目はなんだよ面倒臭いだけかよって感じです。
ENVIRON["変数名"]で環境変数が見れるのを最近知った。
今まで-vオプションで渡してたわ。
つまりawkはsedと組み合わせて使うのが華じゃの
>>532は素人じゃて
537デフォルトの名無しさん:04/09/17 21:25:54
次の 2 つは等価だと思うのですが,そうではないようなんです.
理由を教えてください.

while ( (getline line < "hoge.txt") > 0 ) {

その 1:
if ( line ~ /^[0-9]/) {
...
}

その 2:
if ( match(line, /[0-9]/) == 1) {
...
}

}
538デフォルトの名無しさん:04/09/17 21:30:44
それは537の頭が異常だからです
539デフォルトの名無しさん:04/09/17 22:05:19
>>537
ちがうね
540デフォルトの名無しさん:04/09/17 22:40:00
awkって理論上はテラバイトのデータも処理できるものなのですか?
オブザベーション単位で処理をしているのなら可能なのかなと。
541デフォルトの名無しさん:04/09/19 17:44:51
誰か>>537に答えてくれ。おれも気になる。
542デフォルトの名無しさん:04/09/19 19:22:23
じゃあ540に答えて。
543541:04/09/19 22:57:59
スマソ。540のもわからん。試してみたいがそんなファイルを置く場所がない。
544537:04/09/19 23:25:20
>>541
入力ファイルをいろいろ削ってみたりして,問題を特定しようと試みました.
しかし,確かなことは分かりませんでした.
ただ,match の方が期待通りです.

ところで,以下で `...' の行が出力されるのはなぜ?

入力ファイル:
1,100,1000,...
2,200,2000,...
...
10,1000,10000,...
11,1100,11000,...

awk ファイル:
BEGIN {FS=",";}
/^[0-9]/ { print $1; }

match にすると出力されません.$0 ~ /^[0-9]/ の省略ではないのでしょうか.
545537:04/09/19 23:26:21
追記: `...' は,全て文字通りのドットです.
546デフォルトの名無しさん:04/09/20 01:31:59
>>544-545
俺の環境では `...' は出力されないんだけど
547デフォルトの名無しさん:04/09/20 02:54:41
>>537
if ( line ~ /^[0-9]/) {??# 1文字目が0-9
if ( line ~ /[0-9]/) {?? # 0-9がある
548541:04/09/20 08:58:14
自分で試してみた。

>>544-545
おれの環境では期待通りの出力になる。
GNU Awk 3.1.3

>>537
これもおれの環境では期待通り(頭が数字のレコードが真となる)の出力になった。
hoge.txtの中身と、どんな出力を期待しているのか教えてけろ。
549537:04/09/20 09:30:07
なんかおかしなことになってる...

# cat hoge.txt
1,100,1000,...
2,200,2000,...
...
10,1000,10000,...
11,1100,11000,...

# cat a.awk
BEGIN {FS=",";}
/^[0-9]/ { print $1; }
#match($0,/[0-9]/) == 1 { print $1; }

# gawk -f a.awk < hoge.txt
1
2
...
10
11

コメントアウトを /../ の方にして,,,

# gawk -f a.awk < hoge.txt
1
2
10
11
これが期待する動作です.GNU Awk 3.1.4
550デフォルトの名無しさん:04/09/20 10:07:33
>>549
Windows上のGNU Awk 3.1.2では同じ結果(下の方)になる。
551デフォルトの名無しさん:04/09/20 11:54:40
FreeBSD 上の GNU Awk 3.1.1 と awk の両方で期待した通りになるけど。
552デフォルトの名無しさん:04/09/20 13:23:18
Debian, mawk-1.3.3, GNU awk-3.1.4で試してみたけど
mawkだと期待どおりの結果になる。
gawkはLANG=CだとOK、LANG=ja_JP_eucJPだとNG。
553537:04/09/20 18:17:46
>>552
> gawkはLANG=CだとOK、LANG=ja_JP_eucJPだとNG。

それです! 環境を書かないでごめんなさい.
いつから壊れて (?) いるんだろう...?
とりあえず全て match で書いてしまいました.
あまり長いものは awk で書かれないから,
「とりあえず」でもいいところがいいですね.
554537:04/09/20 18:18:47
良くないか.短く書けるところが書けなくなったわけだ orz
555カメソライダー:04/09/20 19:07:03
556デフォルトの名無しさん:04/09/21 10:21:53
バグレポした方がいいんでない?
557デフォルトの名無しさん:04/09/22 15:02:46
>>553
> いつから壊れて (?) いるんだろう...?

3.1.3 は無問題。
3.1.4 は駄目。
558デフォルトの名無しさん:04/09/28 00:07:32
chmod u+x したファイルの 1 行目が

#! /usr/bin/gawk -f

なら正しく動くのですが,

#! /usr/bin/env gawk -f

では実行するときのコマンドが awk プログラムと認識され parse error になります.
なぜなのでしょうか.
559デフォルトの名無しさん:04/09/28 10:01:07
>>558
改行が \r や \r\n になっているとか?
560558:04/09/28 12:54:18
>>559
それではありませんでした.vi で書きましたし.
そちらでは動きますか? hello world 程度のを晒していただきると助かります.
561デフォルトの名無しさん:04/09/28 13:43:58
#!ってインタープリタの引数2つ書けたっけ?
562デフォルトの名無しさん:04/10/01 21:20:04
書けないね。foo というファイルであれがsharp-bangなら
/usr/bin/env "gawk -f" foo
という呼ばだしになるはずなんで、"No such file or directory"
あたりのエラーメッセージが出るはずなんだが。
563デフォルトの名無しさん:04/10/05 23:39:04
結局,みなさん #! /usr/bin/gawk -f の決め打ちで使っているわけですか?
564デフォルトの名無しさん:04/10/06 11:05:18
調べてみたら#!にインタープリタの引数を2つ以上与えたときの
挙動はOSによって違うようだった。

FreeBSD4.2: 2つ以上あっても渡る(/usrbin/env gawk -f foo)
Linux(2.6.8): 空白を含めて1つの引数として渡る(/usr/bin/env "gawk -f" foo)
Soraris(5.8): 2つめ以降の引数は無視(/usr/bin/env gawk foo)

結局/usr/bin/env使った書き方はgawkのインストール位置の差を
吸収しようとしてるんだろうが、動作はOSによっててんでばらばら
なのであまりお勧めできないということだろうか。
565dos窓でawk:04/10/06 15:23:39
jgawk使っています。
行頭に「|」半角の縦棒がある行だけprintしようとしたのですが、
うまくいきません。どうしたらいいのでせうか?
566デフォルトの名無しさん:04/10/06 16:10:47
エスパーじゃないけど勘で。
半角の縦棒は正規表現のメタ文字だから '\' でエスケープする

例:
#!/bin/awk -f
/\|/ { print }


「うまくいきません」だけでなく、実際のスクリプトや、
期待した結果と得られた結果がどう違ったかも具体的に書いてね
567デフォルトの名無しさん:04/10/06 16:14:17
訂正。行頭だから

/^\|/ { print }

だね。
568デフォルトの名無しさん:04/10/06 22:53:18
>>567
早速ありがとうございました。うまくいきました。

実際のスクリプトですが下記のような形で書いておりました。
$0 ~ "~\|" {print}
そうしましたら、半角縦棒があろうが無かろうが出力されてしまいました。

括弧でくくってみたりもしましたが
$0 ~ (^\|){print}
^parse error

でした。今回は行頭なので教えていただいたスクリプトで行けそうですが、
もしも、$2や$3などで指定したいときなどはどうすればいいのでしょうか?



ええと
569デフォルトの名無しさん:04/10/07 08:06:03
$2 ~ /^\|/ { print }
570dos窓でawk:04/10/07 11:42:19
重ね重ね、ご教示ありがとうございました。
大変参考になりました。たすかります。
どーもでした。
571デフォルトの名無しさん:04/10/12 22:37:13
module sample(
a,
b,
c,
d,
e
);

inputa;
input[3:0]b;
inoutc;
outputd;
output[7:0] e;
hogef;
これを
a input
b input [3:0]
c input
d output
e output [7:0]
のように整形するにはどのように書いたらいいのでしょう。

{ if($1 ~ /input/ | $1 ~ /output/)
{print $2,$1,$3}
}
だと[3:0]がある行がおかしくなるし。
レコード毎にフィールド数みて2つだと{print $2,$1}で
3つだと{print $3,$1,$2}って分岐させればいいのかな

わかる方お願いします。
572デフォルトの名無しさん:04/10/13 00:33:42
inputa;
input[3:0]b;
inoutc;
outputd;
output[7:0] e;
hogef;
これを

???どれ
573デフォルトの名無しさん:04/10/13 05:45:19
#cat hoge.txt
module sample(
a,
b,
c,
d,
e
);

input a;
input [3:0] b;
inout c;
output d;
output [7:0] e;
hoge f;

↑が入力です。
sample( )内の文字列とそれに対応するinput/output を
a input
b input [3:0]
c input
d output
e output [7:0]
のように出力したのです。
574デフォルトの名無しさん:04/10/13 05:58:58
>>573
inout は input にするのか?
575デフォルトの名無しさん:04/10/13 07:05:39
>>574
inputの間違いです><
576デフォルトの名無しさん:04/10/13 11:12:49
awk '/^(input|output)/{a = $NF; $NF=""; print a,$0}'

あたりで。いらない「;」やお尻の空白はsedで削った方が楽だと
思うのでとりあえず放置したがgsubとかしてもいいよ。


577デフォルトの名無しさん:04/10/14 03:09:11
a=substr($NF,1,length($NF)-1)
でええやん
578デフォルトの名無しさん:04/11/04 10:22:37
ほしゅ。
579デフォルトの名無しさん:04/11/28 10:23:52
awk ゴックン
580デフォルトの名無しさん:04/12/07 15:06:26
ほしゅ3000行
581shige:04/12/14 02:19:49
懐かしいな
582デフォルトの名無しさん:04/12/18 14:15:17
set file = ..\/scr\/awk\/path.list
sed -e s/\$file/$file/g hoge

これもっと奇麗にならない?
583デフォルトの名無しさん:04/12/18 14:18:06
バックスラが消えやがった。もっかい
set file = ..\\/scr\\/awk\\/path.list
sed -e s/\\$file/$file/g hoge

これもっと奇麗にならない?
584デフォルトの名無しさん:04/12/18 17:31:05
私、綺麗?
585デフォルトの名無しさん:04/12/18 17:38:23
awkって日本語扱えるの?
586デフォルトの名無しさん:04/12/18 22:10:12
jgawkなら。
587デフォルトの名無しさん:04/12/19 13:22:55
しょうもない駄洒落を思いついたが書き込むのはやめておくか
588デフォルトの名無しさん:04/12/19 14:16:17
awkスレを読んでなぜ「sedをマトモに使えない劣等感」を再確認させられなければならないのかorz
589デフォルトの名無しさん:04/12/19 17:54:58
ごめん。やりたいことは、あるファイル中のファイルパスを置換したいのです。
sedの場合、正規表現にs|./hoge|./ore|gとかs/{/usr/bin}/{/usr/local/bin}とかが出来なくて、
バックスラを/の前に付ける必要があり、よくありません。
awkを使うと余裕なんでしょうか?正規表現やSEDの使いかたに問題があるだけ?
ゾーンにはいってしまっています。
590デフォルトの名無しさん:04/12/19 17:57:27
うぇfげwc89うぇy8いぇ0tgq-tfvg78う
591デフォルトの名無しさん:04/12/21 15:34:52
>>587 勝手に類推w
awkについてはawkを語らない
592デフォルトの名無しさん:04/12/21 19:52:35
>>589 sed で前の方は出来るはずだけど。| がシェルでパイプとして解釈され
ているので、-e "s|./hoge|./ore|g" とクォートしてやればいいのだが。クォー
トがいやなら、, とか解釈されない文字を使えばいい。

ただ、不思議なことしたいんだね。hoge を ore に置き換えるのはともかく、/
の前の任意の一文字を . に置き換える処理って想像がつかない。
593デフォルトの名無しさん:05/01/28 06:27:33
perl -wpe 's#/usr/bin#/usr/local/bin#g'
594デフォルトの名無しさん:05/01/28 15:55:50
前者の方はたぶん本当にやりたいのは
perl -wpe 's#^(.+?)/hoge#$1/ore#g'
みたいな事なんだろうな。
595デフォルトの名無しさん:05/01/29 00:19:47
sed 's/sed/perl/' 588 > 594
596595:05/01/29 00:21:33
no... 594スマソ
595ネ
597デフォルトの名無しさん:05/02/06 22:33:21
awkでMIMEのエンコード、デコードするスクリプトってどこかにありませんか。
598デフォルトの名無しさん:05/02/12 11:50:48
スクリプトで「print | "sort"」の出力を得たいので、
print | "sort" |getline
とやってみたら、だめでした。なんで動いてくれないの。
一度ファイルに書き出せばできましたが、ファイルに書き出ししない方法はないでしょうか。
599デフォルトの名無しさん:05/02/13 23:32:46
print と getline は行ごとに処理するけど、sort は全部の入力を
読み終らないと出力できないからだと思うが。

2つのスクリプトにして、
awk -f script1.awk file | sort | awk -f script2.awk
とでもする? getline も多分使わなくてよくなるし。
600デフォルトの名無しさん:05/02/16 22:04:46
gawk 3.1.4 Windows用日本語バイナリが2/15にでてるけど
書庫破損してるっぽい。
ttp://www.kt.rim.or.jp/%7Ekbk/index.html
601デフォルトの名無しさん:05/02/17 00:42:14
>>600
試しにダウンロードして解凍してみたけどちゃんと解けてる.
602デフォルトの名無しさん:2005/05/26(木) 09:26:22
ttp://www.tasoft.com/tawk.html

↑ AWK のコンパイラってあるんだね。Perl や Ruby がスクリプト言語の
王道であるにしろ、言語を人間の思考を描きだす道具であるとするならば
AWK にも Perl や Ruby にも劣らないだけの個性があると思うんだよね。

次スレのテンプレには awklisp とか tawk コンパイラのリンクを載せたり
して盛り上がればイイなぁ。前にデータベースに問合せて出力されたデー
タを awk で整形して、シェルを使って処理させるための対話型 FEP 作っ
たけど ( 500 行弱 ) あの時ほど awk に感謝したことはなかった。

ところで皆様はどんな時に awk を使っていますか?やっぱり Unix じゃ
ないとイケないのかなぁー。
603デフォルトの名無しさん:2005/05/26(木) 12:52:47
>>602
> ところで皆様はどんな時に awk を使っていますか?

cutの使いかたを思い出すのが面倒くさい時。
604デフォルトの名無しさん:2005/05/26(木) 13:40:13
awk使うのはコマンドラインで打ち込んで終わりみたいな
使い捨てで、perlで書くより楽そうなとき。

perlより楽ってのは人によると思うが、オレがそう思う
のは、複雑な文字列操作や正規表現で置換とかはやらないで、
$nでフィールドとりだして連想配列でごにょごにょぐらいで
済むときかな。

awk '{a+=$1}END{print a}'

とか、

awk '{a[$1]+=$2}END{for(i in a){print i,a[i]}}'

みたいのはほとんどイディオムとなっていてよく使う。

逆にある程度の規模でスクリプト書くとかなるとほとんど
perlです。
605デフォルトの名無しさん:2005/05/28(土) 03:16:23
>どんな時

趣味のprogrammingする時
606デフォルトの名無しさん:2005/05/28(土) 10:14:11
そういえば台湾に天才少年がいて、Haskell で Perl6 のコンパイラ作ってましたよね。
いま Compiler 読んでるから、読了したら習作として Scheme で AWK コンパイラ書い
てみようかな。本当は Scheme で仮想マシンを実装して、中間コードで実行してみたい
んだけど Scheme の多倍長計算の機能はそのまま引き継げるかなぁ?多倍長計算をする
AWK なんてカッコよすぎる!
蟹御飯先生の AWK の実装も公開されてるし、いい C の復習にもなりそう。もしかして
自作の AWK とか実装した人いますか? >ALL
607デフォルトの名無しさん:2005/05/28(土) 15:09:46
仕事で使うだけだから・・・
ツールを自作することまではしない
Perlという前例は存在するにしても、結局劣化コピーになるし
608デフォルトの名無しさん:2005/05/30(月) 21:41:50
>どんな時

Perlの載っていないUNIX機でちょっと便利なスクリプトを書くとき。

ユーザーの俺が書いた30行足らずのスクリプトを理解できないベンダーSEってどうよ。
Emacsでログ追うのにカーソルキーしか使わないし。
シェルスクリプト書くのにcsh使うし。(すまん愚痴になった)
609デフォルトの名無しさん:2005/05/31(火) 15:05:40
>ってどうよ

それがベンダーSEクオリティ
610デフォルトの名無しさん:2005/06/05(日) 02:14:51
助けてくれぃ

あああ いいい ううう えええ おおお ・・・ んんん

ってログがあった場合に、「あ」と「い」を入れ替えて

いいい あああ ううう えええ おおお ・・・ んんん

としたいときにはawk使ってどうやります?
611デフォルトの名無しさん:2005/06/05(日) 02:17:52
>「あ」と「い」を入れ替えて

思いつき
1.あ を 出てこなさそうな文字(ぱっと思いついたのが"^")にいったん置き換える
2.い を あ にする
3.先の文字を い にする
612デフォルトの名無しさん:2005/06/05(日) 02:27:22
>610
もし明確に $1 と $2 だってわかってるなら
{printf("%s%s%s", $2,OFS,$1);
for(i=3; i<=NF; ++i) printf("%s%s",OFS, $i);}
613AWK初心者:2005/07/14(木) 22:22:04
突然ごめんなさいAWKの課題がでて困ってます。http://cogsci.l.chiba-u.ac.jp/~tutiya/Classes/Literacy/071305kadai.html
にあるやつ手伝ってください。
614デフォルトの名無しさん:2005/07/14(木) 22:33:19
今ちょっと忙しいから、来週の水曜日まで待て。
615デフォルトの名無しさん:2005/07/14(木) 22:40:01
>>613
それで? 「手伝って」とのことだが、自分ではどこまでこなしたのだね?
616t:2005/07/15(金) 00:09:44
>>613
良い問題じゃん。
問題の並べ方は変だけれど。
自分で解いて
tutiya2@kenon.l.chiba-u.ac.jp
に送ろうか知らん。2ちゃんで見ましたって書いて。
 
4 このテキストに含まれる文はいくつあるか調べよ。

は、
{}
END{
print NR;
}
だとおもう。1行1文になっているようだから。

あやしければ、

BEGIN{
s=0
}
{
n=gsub(/[。!!??]/,"\f",$0)
s=s+n;
}
END{
print s;
}

句点「。」や ? !
で区切られていれば」文だから。
617デフォルトの名無しさん:2005/07/15(金) 01:43:09
awk だけでやるのは結構難かしいような気がする。

3行目と4行目で一つの文章だから一行一文ではないし、
一単語の「たべもの」が「たべ」と「もの」に分割されていたり、
格助詞の「に」と「似る」の語幹の「に」を判別しなきゃならなかったり。
618デフォルトの名無しさん:2005/07/15(金) 03:22:42
BEGIN{ OFS="。"; }
END{ print NR; }

742
619デフォルトの名無しさん:2005/07/15(金) 03:56:37
RS

なのかも
620デフォルトの名無しさん:2005/07/15(金) 19:32:51
問題の全てで「文」、「単語」、「句読点」を別個に定義すれば簡単だけどねw
621613:2005/07/20(水) 11:49:54
課題いろいろとありがとうございました。
622デフォルトの名無しさん:2005/07/22(金) 07:35:18
awk勉強しようと思うんですけど awk初心者から学べる本ってないですか?教えて下さい
623デフォルトの名無しさん:2005/07/22(金) 09:01:41
>>622
書籍ではありませんが、
 
1991年4月1日
例題で学ぶ 簡易言語「AWK」
弘前大学 教育学部
教育実践研究指導センター
小山智史
 
が分かりやすいです。
どこかにあると思うので、探しましょう。
昔、アスキーのおまけディスクについていました。
624デフォルトの名無しさん:2005/07/22(金) 19:04:12
>>622
私は「256倍」本でしたが、、、、
ttp://www.amazon.co.jp/exec/obidos/ASIN/4756101623/249-2185545-6517934
625デフォルトの名無しさん:2005/07/24(日) 00:01:08
基本はやっぱりコレかな
ttp://w3.shinkigensha.co.jp/books/4-7753-0249-3.html
626デフォルトの名無しさん:2005/07/24(日) 09:38:39
>>624
>>625
その2冊は、
>awk勉強しようと思うんですけど awk初心者から学べる本ってないですか?教えて下さい
という人には難しすぎて向きません。
多分プログラミング初心者だと思われます。(cが使えるような人なら、自分でいくつかのawk script を検索して、使えるようにするから)
627デフォルトの名無しさん:2005/07/24(日) 10:54:33
最初の言語がawk?
お勧め出来ない
628デフォルトの名無しさん:2005/07/24(日) 18:15:51
やっぱ最初はsedだよな
629デフォルトの名無しさん:2005/07/24(日) 18:56:42
というわけで、「sed & awkプログラミング」
http://www.oreilly.co.jp/books/4900900583/
630デフォルトの名無しさん:2005/07/30(土) 22:02:26
配列を、添字のソートした順で処理するにはどうしたらいいでしょうか?
perlで書くとこんな感じの処理です。
for my $i (sort(keys(%hoge))){
print($i, %hoge{$i} . "\n");
}
631デフォルトの名無しさん:2005/07/30(土) 22:28:56
awkには組み込みのソート機能がないので、

1.添え字を取り出して別の配列につっこむ
2.別途用意したソート関数で並び替える
3.本来の処理をする

という感じかな。
2の関数はquick sortでよければサンプルはそのへんに転がってるだろう。
632デフォルトの名無しさん:2005/07/30(土) 23:35:25
「sortコマンドにパイプする」つうのは?
633630:2005/07/31(日) 09:54:52
>>631
quicksortというのを初めて知りました。
awkのプログラムは見つけられませんでしたが、
他のソースを見て作ってみたいと思います。

>>632
出力するイメージ的には、↓のような表な感じですので、
表題までソートされてしまうとダメなんです。

表題
時刻 値
時刻 値
時刻 値
時刻 値

なのでawk内でソート処理をしたいんです。
とりあえず現状は表題をソートの一番上にくるような文字列にしてsortコマンドをかませていますが。。。
634デフォルトの名無しさん:2005/07/31(日) 11:19:30
俺ならソート済みのデータをawkに食わせるけどね
635デフォルトの名無しさん:2005/07/31(日) 12:08:17
あるいはsystemか
636630:2005/07/31(日) 12:21:45
>>634
その「データ」をawkで生成してるんです。
だから634さんの方法だと↓な感じになりますよね?
awk '{表データ作成}END{表データ出力}' 読み込みファイル | sort | awk 'BEGIN{print "表題"}{print}'

でも実は表題は読み込みファイルを処理して生成されるので、
awk '{表データ作成;表題生成}END{表題出力(sortで一番上に来させる為に半角スペースを加えて);表データ出力}' 読み込みファイル | \
sort | \
awk 'NR=1{print}NR>1{print}'

という風に邪道な方法で表題を一番上に表示させるようにしています。
今回はsortキーが時刻ということが分かっていますので、表題は頭にスペースを入れることで解決出来ますが、
sortキーがどんな文字列かがわからない場合、この方法は使えませんので、awk内でソート処理をしたいと思った次第です。
637デフォルトの名無しさん:2005/07/31(日) 12:42:04
awkを卒業してSASやろうぜ!便利
638デフォルトの名無しさん:2005/07/31(日) 15:50:06
gawkならいちおーasortとかasortiとかあるよ。
オレはそこまでややこしくなったらperl使うけどな。
639デフォルトの名無しさん:2005/08/01(月) 04:47:50
カーニハン本、一行野郎集の短さにド肝を抜かれ、
2章も言語マニュアルなのに読んでてためになる筆運びに感心。
ですが例題集は2題くらいで頭がバーストして挫折してまする。
難解数学パズルを最短距離でさらっと解いてしまう
先生の知能指数の高さにため息が出ますわ。
馬鹿はUNIXに向いてないんでしょうね。べーしっ君に戻りますか
640デフォルトの名無しさん:2005/08/01(月) 10:22:23
カーニハン先生も、
本として完成したものはさらっとしているが、
本を書いている段階では何度も試行錯誤して
間違いを見つけては直し、思い直しては書き換え、
という作業を繰り返した結果だと
「プログラミング作法」で書いてるから
それほど悲観するものではないと思われ
641デフォルトの名無しさん:2005/08/01(月) 10:53:12
#「べーしっ君」。・・・年齢がばれるよ
642デフォルトの名無しさん:2005/08/02(火) 22:29:02
>>641
微妙な下ネタもあって好きだったなぁ・・・
当時としてはかなりシュールだったし。
643デフォルトの名無しさん:2005/08/03(水) 19:01:13
あるフィールド以降の文字列を取得するにはどうしたらいいでしょうか?

例えば以下のような文字列の場合、
A B     C  D   E        F  G
(全角スペースで区切っていますが、本当は半角スペースです)

第4フィールド以降の文字列、
D   E        F  G
を取得したいです。
644デフォルトの名無しさん:2005/08/03(水) 19:37:05
>>643
自信は無いが、気が向いたので書く。

awk '{for(i=4;i<=NF;i++){printf $i " "}printf "\n"}'

とか、

awk '{for(i=4;i<=NF;i++){LINE = LINE $i " "}printf LINE "\n"}'
645デフォルトの名無しさん:2005/08/03(水) 19:56:52
>>643
a=$0
sub(/^([^ ]+ +){3}/, "", a)

あたりですかね。正規表現に+や{3}が使えないawkのときは
適当に直してくれ。

区切りが空白1つに置き換わってよければ
$4~$NFを空白はさんでつなげるという手もある。
646643:2005/08/03(水) 20:42:11
レスありがとうございます。

>>644
んー、それだと、
D E F G 
になってしまいますよね。
フィールド間の区切文字は保持したいんです。

>>645
置換ですね。
それでちょっと試してみたいと思います。
647デフォルトの名無しさん:2005/08/04(木) 06:23:50
>>633
表題はBEGIN{}の中でprintすりゃいいんじゃね?
648630=633:2005/08/04(木) 08:22:29
>>647
表題はファイルを処理して生成されるので、BEGINの中ではprint出来ないんです。
まあgetlineでファイルを読めば出来るけど、それではファイルを2回読むことになって非効率的かなぁと。
649デフォルトの名無しさん:2005/08/04(木) 22:26:26
>>648
表題が1行目に入っているなら、
NR==1{}
NR>1{}
で場合分けする
650630=648:2005/08/04(木) 23:49:43
>>649
表題は、ファイル内の数値の統計結果が含まれますので、
ファイルを全て読まなければいけません。
651デフォルトの名無しさん:2005/08/05(金) 11:53:51
じゃあ表題以外の部分を全部溜め込んで
END{}で表題と表題以外の部分を全部出力すればいい

・・・いや
統計結果(表題)を求める機能と表題以外の部分を求める機能は別物だと考えれば、分けて作ってcatするのも手だな。
#こちらに話題がshiftするとスレ違いになってしまうかもw
652630:2005/08/05(金) 23:29:04
>>651
>END{}で表題と表題以外の部分を全部出力すればいい
表題以外の部分はソートされないですよね?

>統計結果(表題)を求める機能と表題以外の部分を求める機能は別物だと考えれば、分けて作ってcatするのも手だな。
分けて作る方法も考えたのですが、以下の理由でやめました。
・同じファイルを2回読むのは非効率的?
・2回目読み込み前にファイルが更新された場合、表題と表で不整合が発生する?
653デフォルトの名無しさん:2005/08/05(金) 23:41:01
>>652
データ処理して作っている表題は、具体的にどんなデータ?
 
それだけ、別の変数に入れておいて
データとは別に、最初に出力すれば良いだけではないかなぁ?
654630=652:2005/08/05(金) 23:57:25
>>653
表題は、ファイル中に書かれた数値の「最大値と最小値」です。

>データとは別に、最初に出力すれば良いだけではないかなぁ?
↓のような感じですか?これだと表部分がソートされないので困っています。
かと言って、この出力をsortに渡したら表題もソートされてしまいます。
END{
 print(hyoudai) #表題出力
 for(i in data){ #表出力
  print(i, data[i])
 }
}
655デフォルトの名無しさん:2005/08/06(土) 00:48:13
『プログラミング言語awk』7章1節じゃダメな理由は?
656デフォルトの名無しさん:2005/08/06(土) 02:03:19
表題と表部分をheadとtailで切り分けて表部分だけsortして
表題の後ろにくっつければ?
657630=652:2005/08/06(土) 07:09:00
>>655
その本は読んでないのでわからないです。

>>656
なるほど。「2行目以降をソートする」ということですね。
>headとtailで切り分けて
awkの出力結果を、変数かファイルに保存して、表題と表部分を抜き出すということですよね。

なるべく変数やファイルを使わないでワンライナーで実現したいのですが方法はないでしょうか。
658デフォルトの名無しさん:2005/08/06(土) 07:47:44
>>657
なにかのパズルですか?
実用にするだけならば、以下のようなのをさっさと書いて処理を済ませますが。

{
data[NR]=$0;
if(max<$0){max=$0}
if(min>$0){min=$0}
}

END{
 printf"表題 最大値=%s\t最小値=%s\n",max;min; #表題出力
#バブルソートでもデータ量が少ないと速いよ
for(i=1;i<NR;i++){
for(j=i;j<=NR;j++){
if(data[i]<data[j]){ #昇順・降順は<>を変えて
temp=data[i];
data[i]=data[j];
data[j]=temp;
}
}
}
 for(i=1;i<=NR;i++){ #表出力
  print(i, data[i])
 }
}
659デフォルトの名無しさん:2005/08/06(土) 09:52:13
>>657
「実現できれば良い」なのか「シンプルな解が欲しい」なのかがはっきりしていない罠
前者ならもう答えは出ているし、
後者ならその答えは「教えられて得るべき種類の答え」ではないと思うが
660デフォルトの名無しさん:2005/08/06(土) 13:21:19
ようするに、ソートして表題が上、表が下ならいいんじゃねの?
HEAD 表題
TABLE 表
:
って最初のEND部で出力して | sort | awk '{ 2番目のフィールド以降を表示 }'
661デフォルトの名無しさん:2005/08/06(土) 14:11:41
>643
ふつう index()とsubstr() つかわねーか?
662デフォルトの名無しさん:2005/08/06(土) 14:27:41
>657
これでええのんか?
{ data[n++]=$0; }
END{
print "1行目は表題ね";
for(i in data) print data[i] | "sort";
}
663630=657:2005/08/06(土) 14:49:10
>>658
バブルソートという方法でソート出来るんですね。
クイックソート、バブルソートと試してみます。

>>659
「実現できれば良い」は自己解決していました。
しかし自分の知らない他の案もあるのかな、と思い書き込みました。

なぜ、「シンプルな解」は「教えられて得るべき種類の答え」ではないのでしょうか?
自分で考えてひらめいて発見することも大事ですが、教えてもらって得てもいいと思います。

>>660
今はその方法を使っています。
HEAD,TABLEではなく、1,2といった番号ですが。
664デフォルトの名無しさん:2005/08/06(土) 15:01:57
口開けて餌を待ってる割には注文が多いな
665デフォルトの名無しさん:2005/08/06(土) 17:57:41
>>663
バブルソートという「馬鹿ソート」さえ知らないことから考えて、
スクリプト内でソートする方法が知りたかったんだろうと思う。
 
data.sort
だけでソートできる他の言語を囓っていて、「awkにはないんかい?」と思うのは、まぁあり得るかなぁ。
666デフォルトの名無しさん:2005/08/06(土) 20:19:43
>>664
すいません。。。

>>665
そうです。最初に質問した通り(>>630)、awk内でソートする方法が知りたかったんです。
awkにソート関数がないのは知ってましたが、ソートしたい場合どう対応するのかなぁと。

ソートアルゴリズムはいろいろようですね。
自作ソート関数を作って対応します。一度作ればいろいろ使えそうですし。

とりあえずこの件は解決ということでお願いします。

ありがとうございました。
667630=666:2005/08/06(土) 20:21:02
しまった、名無しになってしまった。
666=630です。
668デフォルトの名無しさん:2005/08/07(日) 14:06:50
>666

>662 は読んだのか?
669デフォルトの名無しさん:2005/08/07(日) 23:52:33
>>661
どやんの?
670デフォルトの名無しさん:2005/08/08(月) 00:30:42
俺ならこう書くかな。かなりどんくさいけど

/^ *[^ ]+ +[^ ]+ +[^ ]+ +[^ ]/ {
match($0, /^ *[^ ]+ +[^ ]+ +[^ ]+ +/)
print substr($0, RLENGTH+1)
}
671>669:2005/08/08(月) 01:52:26
361 :デフォルトの名無しさん :03/08/31 21:33
3から全部なら...
substr($0, index($0,$3))
672671:2005/08/08(月) 01:59:44
元のすれにもあるが、$4以降が欲しいとき、
$1~$3に$4と同じ文字列があると使えないけどな
673630:2005/08/11(木) 11:00:40
ソート関数作ってみました。
拾ったソースをユーザー定義関数化しただけですが。。。

#バブルソート
# 引数
# 1 配列(添え字は1からの連番)
# 2 添え字の最大値
# 3 ソートの方向(昇順:0,降順:1)
function bsort(array, num, order, i, j, temp){
 for(i=1;i<num;i++){
  for(j=i;j<=num;j++){
   if((order == 0 && array[i] > array[j]) || (order == 1 &&array[i] < array[j])){
    temp=array[i]
    array[i]=array[j]
    array[j]=temp
   }
  }
 }
}
674630:2005/08/11(木) 11:01:15
#クイックソート
# 引数
# 1 配列(添え字は1からの連番)
# 2 ソート開始行
# 3 ソート終了行
# 4 ソートの方向(昇順:0,降順:1)
function qsort(v, left, right, order, i){
 if(left >= right){
  return
 }
 swap(v, left, int((left+right)/2))
 last=left

 for(i=left+1;i<=right;i++){
  if((order == 0 && v[i] < v[left]) || (order == 1 && v[i] > v[left])){
   swap(v, ++last, i)
  }
 }

 swap(v, left, last)
 qsort(v, left, last-1, order)
 qsort(v, last+1, right, order)
}

function swap(v, a, b, temp){
 temp=v[a]
 v[a]=v[b]
 v[b]=temp
}
675630:2005/08/11(木) 11:03:12
処理速度

bsort
real 10m2.810s
user 10m2.247s
sys 0m0.810s

qsort
real 0m2.199s
user 0m2.170s
sys 0m0.076s

sortコマンド
real 0m0.239s
user 0m0.154s
sys 0m0.153s

TEST PC
CPU:Pen4 2.8G HT
RAM:1G
awk:cygwin GNU Awk 3.1.4
TESTFILE:15,187line
676デフォルトの名無しさん:2005/08/11(木) 11:46:35
>>630
エライ・・・というか。真面目な人ですね。面白かった。
#bsortが異様に速い気がするけど・・・まあデータに依存するしな
677デフォルトの名無しさん:2005/08/12(金) 15:12:05
>673
微妙にバグがw
しかもバブルソートではないし。。。
2つめのるーぷはfor(j=i+1;j<=num;j++)
(たしか単純選択法とかいってた希ガス)

単純なバブルソート
for(i=2; i<=num; ++i){
 temp=array[i]
 for(j=i; j>1 && array[j-1]>array[j]; --j)
  array[j]=array[j-1]
 array[j]=temp
}
678デフォルトの名無しさん:2005/08/14(日) 22:48:19
 初歩的な質問で申し訳ないのですが、以下の col 行の
平均値を求めるプログラムでいつも入力を

% awk -f average.awk col=3 input


 と入力しているんですが、col=3 の 部分を 3とだけ入力
して計算というのは出来るのでしょうか?つまり↓の入力
にしたいんですが。

% awk -f average.awk 3 input


---------average.awk--------
BEGIN{
ave=0
}

$0!~/#/{
n++
data[n] = $col # 第 $col 列のデータを取り込む
}
END{
# 平均の計算
for(m=1; m<=n; m++)
ave = ave + data[m]
ave = ave / n

# 結果の出力
printf("%f\n",ave)
}
679デフォルトの名無しさん:2005/08/14(日) 22:51:48
'BEGIN {
for (i = 0; i < ARGC; i++)
print ARGV[i]
}'
ためしてみそ
680デフォルトの名無しさん:2005/08/14(日) 23:27:58
>679
レスありがとうございます。下の様に書き直してみたのですが
ARGV[1] (対象の列) がデータファイルとしても読み込まれて
いる様で、上手くいきません。対応する引数のみをデータファイル
とするやり方は有るのでしょうか?度々申しわけありません。

入力
average.awk 2 test

*エラー(下記のエラーが出ます)
awk: /・・・/bin/average.awk:4: fatal: cannot open file `2' for reading (そのようなファイルやディレクトリはありません)


BEGIN{
ave=0
col=ARGV[1]
}

$0!~/#/{
n++
data[n] = $col # 第 $col 列のデータを取り込む
}

END{
# 平均の計算
for(m=1; m<=n; m++)
ave = ave + data[m]
ave = ave / n

# 結果の出力
printf("average = %f\n",ave)
}
681デフォルトの名無しさん:2005/08/14(日) 23:33:55
ARGV[1]=""
682デフォルトの名無しさん:2005/08/14(日) 23:39:45
-v col=3
とすれば
683デフォルトの名無しさん:2005/08/14(日) 23:40:58
>677
単純選択法はいちいち値を交換せず、比較だけしていくやつだ
よって>673のは違う(値を交換していくのでバブルソートになるのであろう)
684デフォルトの名無しさん:2005/08/14(日) 23:51:43
>682
コマンドラインで指定されたファイル名が var=val という形式ならば、
それは変数への代入であると解釈されます。変数 var は値 val に設定されます
(これは、すべての BEGIN ブロックを実行したあとに行われます)。
コマンドラインでの変数の代入は、AWK が入力をフィールドやレコードに分割する
ためのセパレータを実行時に変更するのに便利です。また、1 つのデータファイル
に対し数回処理を行う必要がある場合、状態をコントロールするのにも便利です。
685689:2005/08/15(月) 00:00:33
>681
レスありがとうございます。このやり方で解決しました。

>682
686689:2005/08/15(月) 00:02:09
途中で送信してしまいました >685

>682
もともとその様にしてまして、col=3と打つのを3のみで
できないかなぁと思って質問しました。分かりにくくて
申し訳ありません。
687デフォルトの名無しさん:2005/08/15(月) 10:25:50
shでラップすればスクリプトを変に複雑化しなくても済むよ

% ./average.sh 3 input

--- begin average.sh ---
#!/bin/sh
/bin/awk -f average.awk col=$1 $2
--- end average.sh ---
688デフォルトの名無しさん:2005/08/15(月) 16:48:12
shってあんた
環境依存やん
689687:2005/08/15(月) 18:25:24
プロンプトを % と表記するのは csh 系で、$ は bsh 系。
command.comとかcmd.exeの場合は > になる。

csh が使えるということは Linux か BSD系、あるいはSYSVR系に
自前で入れたとか、そんな感じだろう。
だから /bin/sh が使えるのは当たり前と考えた。

っつうかawkが使えて/bin/shが使えないケースってDOS環境くらいしか
思いつかないんだけど? cygwinだって当然使えるし。
690デフォルトの名無しさん:2005/08/15(月) 20:34:03
>>689
dos or winのdos窓 環境でawkを使う人は多いと思うよ。
691デフォルトの名無しさん:2005/08/15(月) 20:56:34
>>687-690
どうでもよろしい
692デフォルトの名無しさん:2005/08/15(月) 20:59:50
まあ、>>687くらいならDOSでもバッチファイルで出来るということで。
693687:2005/08/15(月) 21:13:49
たしかにどうでもよろしい話だ
690が食いついてこなければとうにお㍗る。

>>690
winのDOS窓環境でawkを使う場合、awkだけを単体でインストールする人は
少ない。っていうかAWK.EXEだけを配布しているサイトなんてアリエナイ。

たいていはcygwinとか他のUnix like Toolsをインストールする。
そしてそういうツールにはsh.exeとかbash.exeとかが必ずセットでついて来る
694デフォルトの名無しさん:2005/08/15(月) 21:38:32
これとsedとsortさえあれば大抵用が足りるので
Vectorでgawk単体で拾ってきて使ってる私は
アリエナイ人なんですね…
695デフォルトの名無しさん:2005/08/15(月) 22:00:24
どうでもいいけど
>677 のは挿入sort

この辺参照↓
ttp://www.geocities.jp/ky_webid/algorithm/index.html
696デフォルトの名無しさん:2005/08/15(月) 22:27:02
>>694
テキスト処理用のunix like tools が必要なだけで、unix環境までは要らんぞ とか、win環境が必要でその上でちゃっちゃとテキスト処理したいぞという人はアリエールと思うよ。
それとも、unix使ったら偉いとか?
697デフォルトの名無しさん:2005/08/15(月) 22:37:02
awkだけ使えれば構わない人

cygwinまで必要な人
の人数なら前者が圧倒的に多そう

そもそも
cygwin入れた人

cygwinでのawkが必要な人
ってほとんどいないんじゃねの?
698デフォルトの名無しさん:2005/08/15(月) 22:53:46
unix系ではシェルと組み合わせて使うのがあたりまえ。
コーラを飲んだらゲップするくらいに。
699デフォルトの名無しさん:2005/08/15(月) 22:54:20
> っていうかAWK.EXEだけを配布しているサイトなんてアリエナイ。

ttp://cm.bell-labs.com/cm/cs/awkbook/index.html
700デフォルトの名無しさん:2005/08/15(月) 23:13:46
まあawkだけで済む人はawkだけを使うということで
701687:2005/08/16(火) 16:45:58
すまんかった。世の中にawkだけを使う人々が
まだたくさん生息していたなんて、漏れの視野が狭かった。
お詫びにバッチファイルというものを置いておく。

C:\> average 3 input

--- begin average.bat ---
@awk -f average.awk col=%1 %2
--- end average.bat ---
702デフォルトの名無しさん:2005/08/30(火) 09:44:21
xmlgawk注目あげ
703デフォルトの名無しさん:2005/08/30(火) 23:49:51
なにそれ?
704デフォルトの名無しさん:2005/08/31(水) 01:28:42
XMLgawk Home Page
ttp://home.vrweb.de/~juergen.kahrs/gawk/XML/

LLDN発表資料
ttp://ll.jus.or.jp/2005/files/lldn_awk_2005.pdf

> .XML 対応(node 単位でフィールドを扱える)
> .XML に関して入出力はUTF-8 だけでなく、EUC-JP も使用可能
> .PostgreSQL データベースの読み込み(MySQL も検討中)
> .gawk からのフォークではなく、先行開発
> .Arnold Robbins 氏好みのpatch を提供(苦笑)
> 以前、xmlgawk という名称で開発をスタートしたが、現在Xgawk と名称を変更。
> 本家gawk 3.1.5 に追従予定。(未了)

というわけで今は Xgawk という名前らしいです。
705デフォルトの名無しさん:2005/09/03(土) 18:23:57
ウィンドウライブラリみたいな名前だな
706デフォルトの名無しさん:2005/10/05(水) 02:23:06
いいんじゃない?awk。
707デフォルトの名無しさん:2005/10/05(水) 19:47:53
>>1を見てawkって何か知った。
708デフォルトの名無しさん:2005/10/16(日) 22:37:11
awk(もしくはperl)にて次のことをしたいのですが、教えてください。

以下の入力ファイルから、StateがFAILEDであるID
(この場合cb14ab2b-8fcf-4c36-83c3-fb2f30e69fda)を抜き出す

--入力ファイル--

Id...........: a5650e23-c2e3-4188-ab91-e2f4a21eba44
Job Name.....: OfflineClone
Submitted....: 05/10/11 18:09
Last Modified: 05/10/11 18:10
State........: COMPLETED

Id...........: cb14ab2b-8fcf-4c36-83c3-fb2f30e69fda
Job Name.....: OfflineClone
Submitted....: 05/10/11 17:47
Last Modified: 05/10/11 18:02
State........: FAILED

Id...........: 9b1f08bf-76d1-4a5d-9e19-abe07bae284d
Job Name.....: OfflineClone
Submitted....: 05/10/11 18:13
Last Modified: 05/10/11 20:11
State........: COMPLETED

--ここまで--

すいません、よろしくお願いします。
709デフォルトの名無しさん:2005/10/16(日) 22:51:23
awk=N88BASIC

perl=VB.NET
710デフォルトの名無しさん:2005/10/16(日) 23:32:42
>>708
/^Id/ { id = $2 }
/^State/ && $2=="FAILED" { print id }

# 但し、入力データの各欄の順序が固定されているものと仮定
711デフォルトの名無しさん:2005/10/18(火) 11:40:01
&& ($2 ~ /^FAILED/)
の方がよくね?完全一致よりも
712デフォルトの名無しさん:2005/10/18(火) 12:14:28
>>711
そしたら
FAILEDhoge
でもマッチングしちゃうからダメじゃない?
713デフォルトの名無しさん:2005/10/18(火) 12:20:48
・・・FSの設定が必要では?
714デフォルトの名無しさん:2005/10/18(火) 21:19:19
>>708の処理をするだけなら空白区切りのままでも問題ないでしょ。

全ての項目を見にいくのなら
BEGIN{ FS = ": "}
とでもするか、項目ごとに$nを適切に合わせるかすればいいんじゃない?
715デフォルトの名無しさん:2005/11/08(火) 14:18:12
vector から、gawk 3.1.5 for Windows (gawk (GNU awk) 3.1.5 の Windows版) をダウンしました。

gawk '{ print }' file.txt

の所でエラーになります。

gawk "{ print }" file.txt

これは問題なし。何が悪いのでしょうか。(Windows2000 コマンドプロンプトです)
716デフォルトの名無しさん:2005/11/08(火) 14:20:17
>>715 訂正

の所でエラーになります。

' の所でエラーになります。
717デフォルトの名無しさん:2005/11/08(火) 16:50:30
Windowsのコマンドプロンプトでは '' は使えない。仕様。
718デフォルトの名無しさん:2005/11/08(火) 17:34:02
readmeかなんかに書いてあった希ガス
719デフォルトの名無しさん:2005/11/08(火) 18:39:58
jgawkなら ' 使えた希ガス
720715:2005/11/08(火) 22:34:06
皆さん、ありがとうございます。
jgawk を捜し求めて、
http://www.hinadori.atnifty.com/~wills/ から
gawkm115.zip
をダウンしました。

gawk '{ print }' file.txt

問題なく通りました。

というわけで、vector の gawk 3.1.5 for Windows 捨てました。
721デフォルトの名無しさん:2005/11/10(木) 01:22:59
>>720

そんなにシングルクォートが好きなのか・・・

722デフォルトの名無しさん:2005/11/11(金) 13:36:04
gensub() があるから gawk2 には戻りたくないなぁ。
723デフォルトの名無しさん:2005/11/11(金) 14:15:53
あ。>>720 のは gawk3 のマルチバイト版拡張版か。
3.0.6 ね。

http://www.gnu.org/software/gawk/manual/html_node/POSIX_002fGNU.html#POSIX_002fGNU

を見ると 3.1 から TCP/IP 通信とか双方向パイプとか
binmode とかまた色々増えたんだなぁ。
724デフォルトの名無しさん:2005/11/14(月) 00:17:48
>>720
それって、cmd.exe の問題では?

本来 shell のやるべき仕事を全て gawk.exe で抱え込むのは
どうかと思うけどね。
725デフォルトの名無しさん:2005/11/14(月) 21:53:25
元々cmd.exeは * の展開もやってくれないから

726デフォルトの名無しさん:2005/11/14(月) 22:03:07
dos版 bash.exe とか tcsh.exe とかは無いんですか?
727デフォルトの名無しさん:2005/11/14(月) 22:34:15
sh.exeならどこかで見かけた希ガス

GNU utilities for Win32 辺りでググって見れ
728デフォルトの名無しさん:2005/11/14(月) 22:41:02
いや、ワスはMS-Windowsを持ってないから要らんのですが。
元記事の人が「'」を使いたいならと思って。
729デフォルトの名無しさん:2005/11/16(水) 20:57:10
gnuwin32 は確かに便利だな
cygwin みたいには遅くないし
結構ツール揃ってるし
730デフォルトの名無しさん:2005/11/22(火) 00:42:15
複数行がひとつのレコードの場合に、それをcatするawkプログラム
をつくりたいんだけど、
BEGIN
{ RECORD = ""; I = 0;}
{ RECORD += $0; I += 1;
if(I == 3) { print RECORD; RECORD = ""; I = 0; }
}

なんてできないんだよね。
しかたなくださいけど、
BEGIN{ A = ""; B = ""; STATUS = 0;}
{
if(STATUS == 0) { A = $0; STATUS = STATUS + 1;
}
if(STATUS == 1) { B = $0; STATUS = STATUS + 1;
}
else { print A " " B " " $0; STATUS = 0;
}
}
って作った。もっと簡単にできる?
731デフォルトの名無しさん:2005/11/22(火) 07:03:03
{    RECORD = RECORD $0;    I += 1;  
if(I == 3)    {        print RECORD;        RECORD = "";        I = 0;    }
}
空白が文字列連接演算子
getline使ったほうが読みやすい
BEGIN {
  while ((getline A) > 0) {
    getline B
    getline C
    print A, B, C
  }
}
732デフォルトの名無しさん:2005/11/22(火) 10:47:08
>>730
レコードたって、空白行が区切りとかじゃなく、単に(区切りなしの)3行ごと?
元データの構造がダサすぎて 所詮 awk向きでもないのでエレガントには
書けないのでは。(3行ごとに1行にまとめる、と考えると sedでも可?)
733デフォルトの名無しさん:2005/11/22(火) 12:27:24
>>730
NR%3{printf($0)}
!(NR%3){print}
734デフォルトの名無しさん:2005/11/22(火) 13:39:42
>>733
printf "%s", $0 とかしないと$0が%s含んでるとき等にエラーになるよ

% echo "%s" | awk '{printf($0)}'
awk: (FILENAME=- FNR=1) fatal: not enough arguments to satisfy format string
`%s'
^ ran out for this one
735デフォルトの名無しさん:2005/11/22(火) 17:16:34
>>734
確かに。ご指摘ありがとう。
じゃあこれで↓
NR%3{printf("%s", $0)}
!(NR%3){print}
736デフォルトの名無しさん:2005/11/22(火) 20:08:47
3項演算子で済みそうな。
{printf("%s", NR % 3 ? $0 : $0 "\n")}
とか。
でも、文末に\nがあったり無かったりがいやんな感じ。
737デフォルトの名無しさん:2005/11/23(水) 00:24:47
>>735
これに一票。
分かりやすくて、短い!
738デフォルトの名無しさん:2005/11/23(水) 00:27:18
>>731
変数が増えれば、直感的に理解しにくくなる。
NRが何のためにあるか、理解しよう。
739デフォルトの名無しさん:2005/11/23(水) 21:28:24
>>736
awkで3項演算子使えるのか。勉強になった。
740デフォルトの名無しさん:2005/11/24(木) 09:33:01
>>739
あれ、3項演算子って言うのか。勉強になった。
741デフォルトの名無しさん:2005/11/25(金) 03:30:28
age
742デフォルトの名無しさん:2005/11/26(土) 10:31:07
いろいろありがとうございます。勉強になりました。
さっそく、試してみます。

余談ですが、自分は、20代後半のSEですが、最近の新人は、
AWKを使わないですよね。
いかに自分が楽できるか考えないのかな?

という自分は、sedは置換でしかつかいませんが・・・。
743デフォルトの名無しさん:2005/11/26(土) 10:46:12
AWKにて、XMLみたいなタグの構造を読む時は、
みなさんはどう書きます。通常、
/<A>/,/<\/A>/{
print;
}
で<A></A>内のデータは抽出できると思いますが、
入れ子になっていた場合、つまり、
<A><B><C></C></B></A>

こんなときって、

/<A>/,/<\/A>/{/<B>/,/<\/B>/{/<C>/,/<\/C>/{print}}}
はできないですよね。
744デフォルトの名無しさん:2005/11/26(土) 11:38:48
awk の length() って、文字列の長さだと思ってある
プログラム作ってたら length("abcd\0efgh") = 4 に
なるんだけど、これは正しいの?
また、f("abcd\0efgh") = 9 を求める方法はあるので
しょうか?

環境は...

> gawk.exe --version
GNU Awk 3.1.5

です。
745デフォルトの名無しさん:2005/11/26(土) 11:46:18
わからんが手元のawkでは9になるようだ。

% awk 'END{print length("abcd\0efgh")}' </dev/null
9
% awk --version
GNU Awk 3.1.4
(以下略)
746デフォルトの名無しさん:2005/11/26(土) 14:01:57
>>745
追試ありがとうございます。

いま、gawk の NEWS 見てたら Changes from 3.1.4 to
3.1.5 の中に…

8. Gawk is now multibyte aware. This means that
  index(), length(), substr() and match() all
  work in terms of characters, not bytes.

とあったので、どうもこのあたりで仕様が変わってしまっ
たみたいですね。
747デフォルトの名無しさん:2005/11/26(土) 14:11:37
>>743
このスレを"XML"で検索しる
748デフォルトの名無しさん:2005/11/27(日) 04:05:10
>>744,746

ソース確認したけどバグだね。
報告しる。
749デフォルトの名無しさん:2005/12/02(金) 00:37:59
>>747
XMLgawkですよね。

それを入れることができない環境では、nawkとかしかつかえないんだけど。
750デフォルトの名無しさん:2005/12/02(金) 11:50:55
awk でやらなきゃいかんの?
他のスクリプト言語ならいろいろライブラリあるじゃん。
751デフォルトの名無しさん:2005/12/02(金) 23:53:43
>>750
Solaris8のデフォルト環境でやろうと考えています。
perl等は最初からはいっていますが、デフォルトバージョンで
XMLのライブラリが使えるか心配。
752デフォルトの名無しさん:2005/12/03(土) 17:00:03
>>744

なおした。
新しいので試してみて。
753デフォルトの名無しさん:2005/12/04(日) 02:32:54
>>752

試した。
新しいので試してみた。
ぐっじょぶ!
754デフォルトの名無しさん:2005/12/04(日) 02:44:22
>>743

とりあえず、xmlgawk でできますね。
XMLSTARTELEM 使えば node 単位でも depth でも検索できます。

755デフォルトの名無しさん:2005/12/04(日) 03:39:46
>>754
3 種類でやってみた
BEGIN { XMLMODE = 1; XMLCHARSET = "UTF-8";}
XMLCHARDATA {
depth++;
if ( depth == 3 ) { print $0; }
}
#----------
XMLCHARDATA { data = $0; }
XMLENDELEM == "C" { print data; }
#----------
XMLSTARTELEM == "A" { search = "a"; }
XMLSTARTELEM == "B" { search = search "b"; }
XMLSTARTELEM == "C" { search = search "c"; }
search == "abc" && depth == 3 { print $0; }
756デフォルトの名無しさん:2005/12/12(月) 00:32:09
age
757デフォルトの名無しさん:2005/12/14(水) 21:19:41
xmlgawkってSAX風に書くのか。xpath風かと勝手に思っていた。

758デフォルトの名無しさん:2005/12/15(木) 16:10:06
xmlgawkについて、特に明記がな場合、本文中では
eXtensible Markup Language, GNU Not UNIX, Alfred V. Aho, Peter J. Weinberger Brian W. Kernighan
とします。
759デフォルトの名無しさん:2005/12/17(土) 10:59:13
gawkはガウォークって読んじゃうよな
760デフォルトの名無しさん:2005/12/17(土) 11:37:04
そもそもawkは「ウォーク」が正しいのか?
オレはつい「オーク」と呼んでしまうんだが。
761デフォルトの名無しさん:2005/12/17(土) 17:15:49
>>760

auk と同じ音、「おーく」でいいんでないかい?
本の表紙にわざわざ使ってるくらいだし。
762デフォルトの名無しさん:2005/12/17(土) 19:16:50
>>761
オークってこんなのだっけ?

       _,ィヽ∧人从人)ヽ,、
     _チ;;:..  ..;;:...       ヽ    ヽ、从人乂人∧人/ヽハ
    `ヽ、;;::.. ヽ ..;;:...   i i ,   )ハ   `)  
   ,彡;;::.. 一 、 \ヽ ソノノノノ/ ノ  _ノ   
   `フ;;::::..  ..;;:.../;;;::.. ::.. .:)i( ... ヽミ ヽ `ヽ  うぉ!うぉ!うぉ!うぉ!
  _彡;;::::.. / /;;::.....  _,ノ' 'ヽ、_ |ヽ ゝ <  
  `フ;;:.. ,イ  /;;::....::《;・,,;》,:: .《・,;》  ソ _ノ   
  ノ;;:::.. 川レ';;::.. ..::.. ⌒ )::・_・),、^ヽノ `⌒ヽ、r'VWY`vw'YVwY
   ~フ;;::..ノノ;;;::.. ..::..┃イトョヨョョイ.}┃l
   ノ;;::.. ノ;;;;;::.. ..::..┃l |   |.l|┃l
, - ''"´イ ヘ ヽ;;;::.. ..::..┃!.l-t-、 |,!┃ノ`-、  ニシャーーーッ
;;;;;;;;:::::::::::::::::\ヽ、;;::....┗ヽニニソ┛/i|   `ヽ,
;;;::::::::::::::::::::::::::::::ヽ、;;;;ー─--一',;' !      ヽ
763デフォルトの名無しさん:2005/12/17(土) 19:42:31
ど素人ですまんが awkの守備範囲ってどの辺り?
764デフォルトの名無しさん:2005/12/17(土) 19:44:40
ファーストからセカンドへの3メートルくらい
765デフォルトの名無しさん:2005/12/17(土) 22:50:47
>>763
テキストの定型データ処理で
「まともにプログラム組むよりawkででっち上げた方が早そうだ」
と思える様なもの辺り。
766デフォルトの名無しさん:2005/12/18(日) 01:01:31
>>763
>テキストの定型データ処理で
sedで正規表現を使ってスクリプトを組むと、しんどいなぁという範囲。
767デフォルトの名無しさん:2005/12/18(日) 02:07:49
>>763

Perl, Ruby がなくって、実行環境が Solaris なのに開発環境がドサーな範囲。
768デフォルトの名無しさん:2005/12/18(日) 02:35:26
皆、悲観的な表現は控えるんだ
素人へは前衛的な表現で、この際嘘とかどうとか問題外だ
769デフォルトの名無しさん:2005/12/18(日) 02:47:21
前衛的な表現て…
ruby分子は革命の敵とか、
perl独占資本を倒せとか言うんかいな。
770デフォルトの名無しさん:2005/12/31(土) 20:20:02
awkにはそのファイルの総行数を表す変数はないのでしょうか?
あるファイルの上から60%だけ取り出して出力したいのですが...
現在はwcで数え上げていちいち行数を打ち込んでいる状況です
771デフォルトの名無しさん:2005/12/31(土) 20:56:17
>>770
NR

{
 d[NR]=$0;
}
END{
 e=int(NR*0.6);
for(i=1;i<=e;i++){
print d[i];
}
}
772デフォルトの名無しさん:2006/01/01(日) 01:16:17
awk 'BEGIN{srand()}{print $(int(rand()*101)%NF+1)}' <<-EOF
大吉 中吉 小吉 吉
EOF

新年早々くだらなくてすまん。
773デフォルトの名無しさん:2006/01/01(日) 04:26:53
えいっ
774 【中吉】 【272円】 :2006/01/01(日) 04:28:56
あ、まちがえた。
775 【中吉】 【1243円】 :2006/01/01(日) 18:32:51
>>771
ありがとうございます
776デフォルトの名無しさん:2006/01/03(火) 10:52:17
そのファイルの行数ならFNRじゃ?
まあ対象のファイルが一つなら
一緒だけど
777デフォルトの名無しさん:2006/01/03(火) 11:18:23
>771

っつーか、ファイル全部メモリに記憶すんなよ(w
BEGIN部で行数数えろ
778デフォルトの名無しさん:2006/01/03(火) 15:16:06
BEGIN部?どのawkでそんな事が可能なの?
メモリ格納が無理なら、wcで行数数えてそれをスクリプトに渡して、
NR/FNRと比べれば良いだけの話では?
779デフォルトの名無しさん:2006/01/03(火) 20:42:23
>>776
FNR か、使ったことがなかったよ。
780デフォルトの名無しさん:2006/01/03(火) 21:18:59
>>777
BEGIN部で行数カウントするなら、BEGIN部だけで終わらせてしまうそうだ。
BEGIN部を使わなくて、配列に読み込まないという条件なら、
  
{
#
}
END{
e=int(FNR*.6);
for(i=1;i<=e;i++){
getline < ARGV[1];
print $0;
}
}

配列に読み込めるサイズのファイルであれば、

{
 d[FNR]=$0;
}
END{
 e=int(FNR*0.6);
for(i=1;i<=e;i++){
print d[i];
}
}

が分かりやすいと思うが。
781770:2006/01/03(火) 23:49:31
質問したものですが配列に読み込めるサイズってどれくらいなのでしょうか?
一応wcでカウントしてやったものと>>771で教えてもらったものをdiffしても違いはなかったのですが。
782デフォルトの名無しさん:2006/01/04(水) 00:58:20
>>781
たくさん、というか実装に依ったと思う。
最近の物なら(仮想)メモリが十分にあればよほどでかいファイルを読ませない限り
問題ないと思う。

# ↓256本に載ってた物を手直ししたテストプログラム
BEGIN {
for (i=0; i<1024; ++i) { kilo = kilo " " }
i = 0
while (1) {
print ++i
s[i] = "" kilo
}
}
783デフォルトの名無しさん:2006/01/04(水) 22:30:57
昔、先行して舐めるプロフラムは作ったなぁ。
BEGIN {
while(getline<ARGV[1]>0) {nr++;}
close(ARGV[1]); #忘れないように
while(getline<ARGV[1]>0) {
i++;
if (i>=nr*0.6){exit;}
}
}
784770:2006/01/05(木) 13:24:24
もう一つ質問なのですがawkの関数で絶対値はないのでしょうか?
今は値を二乗してルートとってるのですが
785デフォルトの名無しさん:2006/01/05(木) 19:33:31
# 絶対値を返すユーザー定義関数
function abs(x) {return (x < 0) ? -x : x}
786デフォルトの名無しさん:2006/01/06(金) 21:00:25
>>785
返事が遅れましたがありがとうございました
787tk&ybh:2006/01/12(木) 11:22:57
学校でこんなことをやれと言われたのですが、まったくわからないので、ご親切な方、解答方法やヒントの教授をお願いします。

日付と予定事項と実行計画事項を入力データとする週間予定表の生成プログラムを作成せよ.但し,
・プログラムはawkスクリプトとし,ファイル名をmyplan.awkとする.
・入力データファイルはmyplan.dataとし,これにはデータだけを含み,各フィールドはコロンで分離する.
・予定表を生成するためのフォームを用意する,これをmyplan.formとする(英語表現,ローマ字表現)
 (ただし,先頭の行に学生番号,氏名の欄,末尾にmemo欄(実行計画記入)を入れる.すべて英数文字)
・生成した予定表は標準出力で確認すると同時にmyplan.txtにも出力する
・アクセス権の変更:chmod 644 myplan.txt
・確定した週間予定表myplan.txtを.planにコピーする(かな漢字のかわりに英語表現,ローマ字表現使用)
788デフォルトの名無しさん:2006/01/12(木) 12:16:36
宿題まる投げですか。いい度胸ですね。
789tk&ybh:2006/01/12(木) 12:47:57
その度胸を称えて教えてくださりませんか??(-_-;
790デフォルトの名無しさん:2006/01/12(木) 19:28:55
で? いくら出すんだい?
791デフォルトの名無しさん:2006/01/12(木) 20:38:14
これといってネタもないみたいだしヒントだけならいいんじゃないか?

まずは myplan.data, myplan.form, myplan.txt の例を作ってみな
792デフォルトの名無しさん:2006/01/15(日) 19:22:38
test01~test40までのファイルを順番に読み込みたいのですがどのようにしたらいいでしょうか?
793デフォルトの名無しさん:2006/01/15(日) 19:53:39
forとsprintfとでファイル名を生成
794デフォルトの名無しさん:2006/01/15(日) 20:09:34
$ awk -f hoge test??
では駄目なんすか?
795デフォルトの名無しさん:2006/01/15(日) 20:10:56
順番に
796デフォルトの名無しさん:2006/01/15(日) 20:13:25
test01~test40まで40個ファイルがあります
それぞれのファイルの最後の欄をまとめるという処理をしたいと思っています
>>793さんのレスを解釈して作ってみましたがなにか違うようです

#!/bin/bash

awk '{
for(i=1;i<=40;i++)
x=sprintf("test%02d",i)  ここでtest01~test40が生成?

{field=$NF}  最後の行の最後の欄を出力する
END {print field} x
}'
というソースです
797デフォルトの名無しさん:2006/01/15(日) 20:17:54
BEGIN部とかEND部でfor(i=1;i<=40;i++) x=sprintf("test%02d",i)
798デフォルトの名無しさん:2006/01/15(日) 21:31:55
>>796
何がしたいのかイマイチ見えないが、
{
print $NF, FILENAME;
}
ではダメなん?
順番は bash で順番に読み込まれるのでは?
ダメなら後から sort でもいいのでは?
799デフォルトの名無しさん:2006/01/15(日) 22:37:17
>>796
#!/bin/sh
for i in `seq -w 1 40`; do tail -n 1 test$i | awk '{ print $NF; }'; done > /dev/null
800デフォルトの名無しさん:2006/01/16(月) 01:45:20
>797
後、getlineな
801デフォルトの名無しさん:2006/02/05(日) 04:53:34
エイホ・ワインバーグ・クヌースw
802デフォルトの名無しさん:2006/02/05(日) 08:08:50
awkの読み方とその一般目的についてサラッとおせーて
803デフォルトの名無しさん:2006/02/05(日) 10:39:51
オーク。
主にホワイトスペースなどでフィールドに分かれているテキストデータに
対して何らかの処理を加えるフィルタを書くのに向いている。
最も基本的な構文は以下の通り。

BEGIN {
スクリプトの開始時に実行される
}

/パターン/ {
処理
}

/パターン/ {
処理
}

END {
スクリプトの終了時に実行される
}

ここには通常の言語で書かれる open や while などの構文が出てこないが、
この状態で

$ awk -f スクリプトファイル名 データファイル名

と実行すれば自動的にデータファイルを開き、順番に読み込み、
各行に対して /パターン/ にマッチしたら処理を加える、という動作を行う。
BEGIN, END は特殊で、これはスクリプトの開始時と終了時にしか実行されない。
804デフォルトの名無しさん:2006/02/05(日) 10:57:09
知ってると得するっていうか、まず知っとけっつー機能は

1. 処理対象となる行データから改行コードは落ちてる。chop とか必要ない。
2. FS という変数の設定によって各行は自動的にフィールドに分割される。デフォルトではフィールドセパレータはホワイトスペース。
3. 分割されたフィールドは $1, $2, $3 ,... に入る。元の行は $0 に入る。スクリプトの中で明示的に $0 に何かを代入しても自動的に分割される。逆に $1, $2, ... に代入すると $0 は再構成される。
4. Cっぽい構文が一通り使える。関数も作れる。スコープはデフォルトでローカル、ただしグローバル変数の参照は可能。JavaScript っぽいと言えば通じるか?
5. 型はルーズ。
6. 文字列は連結ではなく連接という形でくっつけることができる。str = "abc" "def" で str は "abcdef" になる。
7. パターンのないブロックを書けるので、複雑な処理や条件を書きたい場合は

{
この中で好きなように処理を書け
}

という形のスクリプトを書く。

補足、間違い指摘ヨロ。

気をつけなきゃいけないのは、awk には意外と多くの処理系があるってこと。
GNU/Linux しか使ってないと gawk しか触らないから分からないけど、BSD系
とか他の商用UNIXなんかだと gawk はデフォルトで入ってないことが多い。
自分の使ってる awk が何なのか、把握しておくこと。
805デフォルトの名無しさん:2006/02/05(日) 11:06:04
あ、話を単純にするため RS を無視して「行」っていう表現で
統一しちゃったけど、本当は「レコード=行」じゃないです。
まぁそこら辺は自分で追求したいやつが調べてくれってことで。
806緩和時点:2006/02/05(日) 11:59:39
すみません。テキストの分割方法についておしえてください。

2種類のログデータが1つになっているファイルがあります。
2種類のログデータは前半(AAAA情報)、後半(BBBB情報)と
わかれてます。
ログデータは、

AAAA情報
  XXXXX
AAAA情報
  XXXXX

   ~

BBBB情報
  XXXXX
BBBB情報
  XXXXX


AAAA情報とBBBB情報の2つのファイルに分割したいのですが
どのようにすればよいでしょうか。
BBBB情報の文字列が現れたら、それ以降の行を別のファイルとすれば
よいかと考えたのですがどのようにすればよいのかわかりません。
どなたかご教授の程お願い致します。


807デフォルトの名無しさん:2006/02/05(日) 14:37:12
これ以降は BBBB情報とはっきり分かるパターンがあったらそれの
出現をフラグにする

フラグが立ってなかったらファイルAへ出力
フラグが立ってたらファイルBへ出力
808デフォルトの名無しさん:2006/02/05(日) 16:16:52
>>804[4]

gawkではローカルなの?
function f(a,b,c) { d = 0 }

ここでのa,b,cはローカルだけど、dはグローバルだと思ったんだけど。
809デフォルトの名無しさん:2006/02/06(月) 00:40:52
>> 806
必ず奇数行目が「○○○○情報」、偶数行目がコンテンツなら、
NR % 2 == 1 && $0 ~ /AAAA/ {flag_a = 1;flag_b = 0}
NR % 2 == 1 && $0 ~ /BBBB/ {flag_a = 0;flag_b = 1;}
NR % 2 == 0 && flag_a == 1 {print $0 >> file_a}
NR % 2 == 0 && flag_b == 2 {print $0 >> file_b}
810デフォルトの名無しさん:2006/02/06(月) 00:44:00
>> 804
function f(a,b,c) で引数に書かれていないパラメータは基本的にグローバルでい
いんでは ?
故意に内部だけで使うのであれば、タブで区切って f(a,b,c,d) と書けば内部だけ
のローカル。(タブである必要はないけどお約束みたいなもの)
ということでなかったっけ?
811デフォルトの名無しさん:2006/02/06(月) 00:44:52
タブ消されるのか…orz
c,d の間に TAB ね。
812802:2006/02/06(月) 04:37:25
>>803
あり^^
vimとか多機能エディタのスクリプトで代用できそうな感じがするんですが、
浅はか?
813デフォルトの名無しさん:2006/02/06(月) 06:26:37
いちいちvimを動かしたくないとき使う。
814デフォルトの名無しさん:2006/02/06(月) 07:59:59
>>812
別にいいんじゃないの
vim が入っている環境なら
815デフォルトの名無しさん:2006/02/06(月) 09:18:19
awkは深いですか?
816804:2006/02/06(月) 09:37:58
間違いました。
みなさんご指摘の通りですた。ちょっと他のとごっちゃになってますた。

ローカル変数にしたい場合

function abc( foo, bar, [間あけて] baz, foobar ) {

}

みたいに書くのが常套手段でした。
817デフォルトの名無しさん:2006/02/07(火) 01:17:45
>>815
深くはないけど、浅くもない。
限られた命令の中で遊ぶのも悪くないし。
良いボケ防止だよ。
818デフォルトの名無しさん:2006/02/07(火) 05:48:07
確かオライリーから書籍でてましたよね。
個人的にはそれだけでも無視できない存在に見えてきます。
819デフォルトの名無しさん:2006/02/07(火) 07:58:22
まぁ使えりゃ便利だよ
Perl とか使いこなしてるなら改めてやる必要はないような気もするけど
820デフォルトの名無しさん:2006/02/07(火) 09:12:18
awk自体を造るのは大変ですか?
821デフォルトの名無しさん:2006/02/07(火) 19:52:20
大変かどうか判らない人が造るのは大変だと思う。
822デフォルトの名無しさん:2006/02/08(水) 01:04:41
>>818
とりあえず、オライリーからは 3 冊かな。
「sed & awk デスクトップリファレンス」
「sed & awkプログラミング」
「Effective Awk Programming」
最後は英語のみ。

個人的には、「プログラミング言語 AWK」がベストかな。
オライリーじゃないけど。
823デフォルトの名無しさん:2006/02/08(水) 01:07:39
>>820
確か awk のオリジナルソースは全部で 700 行じゃなかったっけ?
とどこかで見た記憶がある。

今や gawk は gzip しても 2 MB のコード。
824デフォルトの名無しさん:2006/02/08(水) 02:16:34
蟹飯大先生のページにソースがあったような気がする
825デフォルトの名無しさん:2006/02/08(水) 10:03:04
>>820
yacc, lex (または bison, flex) を使うのならそんなに苦労しないと思う。
ただ最新版の gawk などと同一のものを作ろうとすると非常に面倒だと思う。

学習のために作ってみたいという場合は必要最小限の機能をまず作り、
それをちょっとづつ拡張していけばいいんじゃないだろうか。
826デフォルトの名無しさん:2006/02/08(水) 11:31:08
>>823
awkの最初のバージョンではユーザー関数すら定義できなかったから。
それでLispインタプリタ(walk)を実装した剛の者がいたそうだが。
827デフォルトの名無しさん:2006/02/08(水) 21:24:07
以前、jgawk 1.3か1.5あたりのを、bison、flexの勉強がてら読んでみたなあ。ほどほどの規模なので勉強になった。
828デフォルトの名無しさん:2006/02/08(水) 21:49:27
829デフォルトの名無しさん:2006/02/08(水) 22:06:39
830デフォルトの名無しさん:2006/02/08(水) 23:39:50
831デフォルトの名無しさん:2006/02/09(木) 00:53:18
記憶が定かじゃないが、PantoraBOX
ttp://pantorabox.sourceforge.jp/
に入っている bin-util とか awk もソースが小さかった記憶がある。
832デフォルトの名無しさん:2006/02/10(金) 23:58:38
初めて作ったCGIはAWKで組んだ。
Perlは知らなかったし。
833デフォルトの名無しさん:2006/02/12(日) 15:05:57
質問です.
1000行程度の数値が入ってる2つのファイルがあるんですが(1列目だけ)
各行ごとの数値の差を出したいのです
{
FILENAME == argv[1]{if ($1 > maxa)
max = $1
a[$1] = $0}
FILENAME == argv[2]{if ($1 > maxb)
max = $1
b[$1] = $0}
END{
for (x = 1; x <= max; x++)
print a[x]-b[x]
}
これでうまくいかないのですがどこが間違っているのでしょう?
834デフォルトの名無しさん:2006/02/12(日) 15:54:53
>>833
ファイルが/tmp/a /tmp/bだとしてこんな感じじゃダメかい?(bの方が行数多い場合には無視)
awk '{a=$1;if(getline < "/tmp/b"){print a-b}else{print "a only!"};}' /tmp/a
835デフォルトの名無しさん:2006/02/12(日) 15:57:26
print a-bじゃなくてprint a-$1だなw
即興なんでかんべん
836デフォルトの名無しさん:2006/02/12(日) 16:28:52
やりたいのは

file1: 7, 2, 3, ...
file2: 3, 2, 6, ...

を処理したら 4, 0, -3 になる処理のように読めるんだけど
837デフォルトの名無しさん:2006/02/12(日) 16:40:31
>>836
>>833 に、
> 1000行程度の
> 1列目だけ
って書いてあるから、

file1:
 7
 2
 3
 ...

file2:
 3
 2
 6
 ...

だと思うが。

838デフォルトの名無しさん:2006/02/12(日) 16:53:50
勝手な書式に変更して悪かった。
俺が言いたいのは、行ごとの差を取るという主題を
俺が勘違いしてるかもってことなんだ

具体的に言うと a[$1] = $0 っていう代入文からみて
何か別の処理がしたいんじゃないかと
839833:2006/02/12(日) 16:59:58
>>834
それで,うまくいきました.
このプログラムは非常にシンプルなんで覚えておくことにします
ありがとうございます

>>836
わかりにくくてすいませんでした
>>837さんの言うとおりの形です

みなさんありがとうございました
840デフォルトの名無しさん:2006/02/12(日) 17:50:08
>>834
漏れにはそれ以上短く記述できないw
何はともあれawkの面目躍如といったとこだな
841デフォルトの名無しさん:2006/02/13(月) 20:15:49
まあなんだ、俺の中ではここ名スレ
842デフォルトの名無しさん:2006/02/13(月) 21:56:32
awk もすっかりマイナーになったからな
843デフォルトの名無しさん:2006/02/14(火) 00:41:47
>>833
おぃおぃ、どこが間違っているかと聞いているんだから、ちゃんと答えようぜ。
・argv でなくて ARGV (再指定しているなら OK だが)
・括弧が対応していない
・その max って何よ (これは置いておく)
メモリが無尽蔵なら、以下のようにするが個人的にはスマートだと思う。
{
num[FNR,FILENAME] = $0;
}
END{
for (x = 1; x <= FNR; x++) {
print num[x,ARGV[1]] - num[x,ARGV[2]];
}
}
844デフォルトの名無しさん:2006/02/14(火) 01:31:00
本当の問題解決のために答えるならいいけど
ただの突っ込みレスはいらなくね?
845デフォルトの名無しさん:2006/02/14(火) 01:42:24
どうせ過疎スレなんだし、あんまり気にしなくてもいいんじゃないの
846デフォルトの名無しさん:2006/02/14(火) 01:47:53
季節は春。
風のない天気のよい日には
枝葉末節にこそ拘るのも
趣があって実によいものだ。
847デフォルトの名無しさん:2006/02/15(水) 00:24:30
awkで作ったYAMLのパーサってどこかにない?
848デフォルトの名無しさん:2006/02/18(土) 10:28:57
>>833

paste コマンドが使えるなら、
$paste file1 file2 |awk '{print $1-$2}'
が、頭使わなくてラクじゃね?
849デフォルトの名無しさん:2006/02/22(水) 22:05:33
gawk 'ARGIND==1{a[NR]=$1};ARGIND==2{print a[FNR]-$1}' file_a file_b
では、いかがですか?
いったん、配列に格納するのでメモリ食いますけど。
850デフォルトの名無しさん:2006/02/24(金) 01:24:52
こういうところが弱いのがawkだが、それがawkクオリティ。
頭でカバー。
851デフォルトの名無しさん:2006/02/24(金) 17:39:04
>>850
頭でカバーというより、awkはUNIXのtext utilityの一部として
設計されたコマンドだから、>>848が正解だと思う。
852デフォルトの名無しさん:2006/02/26(日) 13:04:10
結果を出すのが目的なんだから正解の一つってことだろな
853デフォルトの名無しさん:2006/02/26(日) 16:49:15
そうだね。
隣家に行くのにアルゼンチンを経由するのも、まあ正解の一つだ。
854デフォルトの名無しさん:2006/02/27(月) 03:53:07
屁理屈の好きな奴がいるね
現実的かどうかってのは無関係かよ
855デフォルトの名無しさん:2006/03/12(日) 19:20:50
そんな考え方だけじゃ人生の半分損してるようなものだよ
856デフォルトの名無しさん:2006/03/12(日) 23:01:04
いろいろ試して、自分なりに結果を見付けて何が最適だったかを探していけば
いいんでないのかな。
確かに 848 が良いというのは分かる。ただし、全て正解であるのも間違いは
ない。
質問を出した人が自分で納得できる解を求めてくれれば良いんでない。
そういう遊べる言語でもあるのが awk の良いところでもあると思っている。
857デフォルトの名無しさん:2006/03/13(月) 02:55:06
>>856
並立要素を欠いた朧化の「も」を使いすぎ。
意見を述べるときは、断定しよう。
858デフォルトの名無しさん:2006/03/13(月) 08:00:23
>>857
ま、>>856の妄言はどうでもいいんだが。
並立要素は省略されているだけで、朧化でなかんべ。
補完できないチミの問題。
859デフォルトの名無しさん:2006/03/14(火) 17:20:34
windows XP上でUTF-16LEを扱えるawkってある?
excelでunicodeテキストで出力したファイルを処理したいんだけど...
860デフォルトの名無しさん:2006/03/14(火) 18:45:09
どうしても unicode のままじゃないとダメなのか?
windows にも nkf あるぞ?
861デフォルトの名無しさん:2006/03/14(火) 19:41:34
【積年の】旦那にしてる密かな仕返し【恨みじゃー】
http://human5.2ch.net/test/read.cgi/ms/1141694640/

8 名前:可愛い奥様[] 投稿日:2006/03/07(火) 11:05:23 ID:8dtluKkp
夫の歯ブラシで洗面所の排水溝掃除。
洗面所をビショビショに汚した罰だ。

20 名前:可愛い奥様[age] 投稿日:2006/03/08(水) 00:40:17 ID:pRrk6A21
前に頭きた時あって
1度だけ歯ブラシで肛門カキカキしちゃった

22 名前:可愛い奥様[] 投稿日:2006/03/08(水) 01:27:12 ID:gU5mHc7J
よかった。どこのお宅も同じようなことしてて。

24 名前:可愛い奥様[] 投稿日:2006/03/08(水) 01:36:35 ID:SSSFsTqE
そうそう、ヘンなモノはダンナのお皿へ直行だよね。

41 名前:可愛い奥様[] 投稿日:2006/03/08(水) 11:55:18 ID:sjj+/60Q
見てるだけで気が晴れるな!
皆さん、頑張ってね!

42 名前:可愛い奥様[sage] 投稿日:2006/03/08(水) 20:33:51 ID:Ju2N1s7+
年金分割が楽しみじゃのう

63 名前:可愛い奥様[] 投稿日:2006/03/10(金) 08:55:20 ID:qLfJYpJR
家族で密かにはぶっている。

男性は肉体が汚く、精神が美しい傾向がある。(気に入らない相手に肉体的攻撃を加える⇒精神的攻撃も加える男は猛者)
女は肉体が美しく、精神が汚い傾向がある。(気に入らない相手に精神的攻撃を加える⇒肉体的攻撃も加える女は猛者)
女は隠れて悪事をする。気に入らない女子を便所でボコったり、便器舐めさせたり、男の友人を使ってレイプ、仲間外れにしたり。陰口、嫉妬。
女は対人関係において、この汚い性格を隠そうとするため、外面が非常によくなる。(猫かぶり)
男性諸君は外面に騙されないように気を付けて下さい。
862デフォルトの名無しさん:2006/03/14(火) 23:17:12
>>860
ヨーロッパ文字を扱う必要があり、shift jisだとだめだから
unicodeにしようかと...そんで、awkで処理してunicodeのXMLか
HTMLを吐く予定です。nkfは調べてみます。
863デフォルトの名無しさん:2006/03/15(水) 12:32:56
>>862
nkf を出したのは utf-16 にも対応してて文字コードの
変換ができるよってだけなので、変換で失われるものが
あるなら使えないです。

ただ utf-8 でいいなら最近の LL ならなんでもイケると思うよ。
nkf で utf-16 -> utf-8 変換してから作業するのが現実的
かなぁ。

utf に awk で対応できたかどうかは分かんない。3.1.x は
国際化のフレームが変わったので対応できるのかも。やって
みたことないけど。自分がやるなら Perl とか Ruby とか
使っちゃうと思う。
864デフォルトの名無しさん:2006/03/15(水) 17:53:30
>>863
utf8対応のwindows上のawkはあるみたいです。
ttp://www.kt.rim.or.jp/~kbk/
なのでnkfでutf-16 -> utf-8で変換してからやってみます。
# LLってなんでしょうか?Light Language?
865デフォルトの名無しさん:2006/03/15(水) 18:53:56
あーごめん
Lightweight Language
いわゆるスクリプト言語全般を最近はこう呼ぶらしい
866デフォルトの名無しさん:2006/03/15(水) 19:14:11
へえ。
スクリプトは重たいけどheavy weightじゃないんだ
867デフォルトの名無しさん:2006/03/16(木) 02:37:19
C, Java より軽けりゃ皆 LL。
Perl 6 でも LL だもんなぁ。(w
868デフォルトの名無しさん:2006/03/16(木) 15:45:25
awk は昔はあんなに重かったのに。ましてや perl をや。
869デフォルトの名無しさん:2006/03/17(金) 02:31:22
>>868
メモリがキロバイトの時は、大きめのファイルを配列に読み込ませるときにうまくいかなかったことがあったが、
今では、たいていのファイルをオンメモリで処理できる。いい時代や。
870デフォルトの名無しさん:2006/03/17(金) 09:10:44
>>869
DOS の話?
32bit だったら djgpp でコンパイルしたやつで壁は
突破できたけどね。まー確かに今の方がずっと楽だ。
871デフォルトの名無しさん:2006/03/17(金) 18:54:36
>>870
いや、UNIXに仮想記憶が実装される前の頃の話だろ。
872デフォルトの名無しさん:2006/03/17(金) 20:22:16
majisuka
そんな古の時代なんか知らねっす
873デフォルトの名無しさん:2006/03/18(土) 00:09:33
>>869
"KB" は「キロバイト」じゃなくて「キビバイト」だよ。
874デフォルトの名無しさん:2006/03/18(土) 16:42:31
Kibi Byte なら"KiB"じゃないか?
875デフォルトの名無しさん:2006/03/18(土) 17:21:08
KiDは桃太郎が配ってる
TextSS のWindowsXP(Professional)64bit化おながいします

もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
877デフォルトの名無しさん:2006/03/25(土) 10:57:34
>>875
キダ・タロー先生?
878デフォルトの名無しさん:2006/03/28(火) 16:35:56
蟹は蟹でも日本海の
879デフォルトの名無しさん:2006/03/28(火) 17:36:02
なんの誤爆だろう
880デフォルトの名無しさん:2006/03/28(火) 22:46:29
Aho、Weinberger、蟹はん
881デフォルトの名無しさん:2006/03/31(金) 14:41:36
GnuWin32をインストールしてみたけど、インストールされたファイルはネットワークインストーラ
みたいで、それを使って別途インストールしないといけない、でもdownload.batを実行すると
エラーになる、どうやったらインストールできるんだろか

GnuWin32とCygwinの違いってbashターミナルで実行するかコマンドプロンプトで実行するかの違い?
882デフォルトの名無しさん:2006/03/31(金) 15:53:19
全然違う

Cygwin使っている人いますか? 4
http://pc8.2ch.net/test/read.cgi/win/1121456258/
883881:2006/03/32(土) 01:31:49
こっちで聞くことにします
cygwin + mingwn + gcc 相談室 Part2
http://pc8.2ch.net/test/read.cgi/tech/1126103347/
884デフォルトの名無しさん:2006/04/23(日) 15:57:24
885デフォルトの名無しさん:2006/05/13(土) 03:28:15
886デフォルトの名無しさん:2006/05/14(日) 23:50:20
誰か教えてください。
aa,bb,,cc,dd
の時、3番目はNULLですが、awkでどうやったら処理できるか分かりません。
どうやっても$3にccが入ってしまいます。
どうやったらNULLになりますか?
887デフォルトの名無しさん:2006/05/15(月) 00:07:42
>>886
どういう環境で?
FreeBSDでも、gawk 3.1.5でも、BusyBoxでも$3は空列になるが
888886:2006/05/15(月) 08:41:27
まじですか?
正確にはFSが¥tなんですが見にくいのでカンマに変えて書いてます。

win2000 gawk でやって
FS = "\t" でも FS = "\t$" でも駄目なんです。
889デフォルトの名無しさん:2006/05/15(月) 09:29:27
正確に書かなかったので解が得られなかったという良い見本ですね。
890886:2006/05/15(月) 09:43:26
ごめんよ~。
許してくれ。
891デフォルトの名無しさん:2006/05/16(火) 01:13:31
cygwinのGNU Awk 3.1.5 だと問題ないです
ちゃんとNULL
892886:2006/05/16(火) 20:33:15
vectorのを3種類落としてみたけどぜんぶ¥tの処理がおかしい。
win側のバグ?
でも cygwinでは動くという人もいるみたいだし。
893デフォルトの名無しさん:2006/05/16(火) 20:40:21
何をしたか正確に書かないと答えは永遠に得られないだろう
894デフォルトの名無しさん:2006/05/16(火) 21:52:18
俺の環境でも問題ないな(WinXP,gawk3.0.6+1.15,gawk3.1.5,awk95で確認)

下のスクリプトで試しただけだが

BEGIN{FS="\t"}
$3 == "" {print "null"}
895デフォルトの名無しさん:2006/05/18(木) 00:34:26
すんまそん。
テキストファイル(aaa.txt)に
ls,pwd,…
といった感じでコマンドを書いておいて
それを読み込んでじゅんぐりに実行するっては
どうやって書けばよろしいですか??
初心者ですんません…
896デフォルトの名無しさん:2006/05/18(木) 00:45:07
>>895
BEGIN {FS=","}
{ for(i=1; i<=NF; i++) system($i) }
897デフォルトの名無しさん:2006/05/18(木) 08:32:18
IFS=,
for i in `cat aaa.txt`
do
eval $i
done
てゆーか、1レコード1コマンド(1フィールド1コマンドでなく)のaaa.txtにして、shに食わせるのが一番正しい気がする。
898デフォルトの名無しさん:2006/05/19(金) 02:50:00
>>896
>>897

ありがとうございます!!
非常に参考になりました!!!!

あともう一つですが
変数を$の後の数値として使うことってできるのでしょうか?
たとえば、
for(i=1; i<=5; i++) このようなループをして
引数を順番に出力するとして
echo $($i)
みたいな使い方です。
説明が悪くて申し訳ございません。
そもそもこんなやり方しなければいいとは思ってるのですが…
すいませんです。
899デフォルトの名無しさん:2006/05/19(金) 15:41:14
$iでできるんじゃね?
iが2なら2番目のフィールドの値だし

$$iとかだとiが2の場合に2番目のフィールドの数値の示すフィールドの値になると思われ
900デフォルトの名無しさん:2006/05/22(月) 14:20:27
>>898
awkで?
901デフォルトの名無しさん:2006/05/29(月) 14:33:36
便利な一行野郎
902デフォルトの名無しさん:2006/06/17(土) 06:09:34
意外なスクリプトって何ぞないかな。
こんなことをawkでやる意味があるのか?というような。例えば、
$ awk -f date.awk
Sat Jun 17 06:06:03 JST 2006
とか。
903デフォルトの名無しさん:2006/06/17(土) 11:36:25
#!/bin/gawk -f
# cat.awk
{ print }
904デフォルトの名無しさん:2006/06/18(日) 02:09:08
>> 902
BEGIN {
  print strftime( "%a %b %d %T %Z %Y" );
}
ということ?
905デフォルトの名無しさん:2006/06/18(日) 10:07:52
あ、いや、date.awkの内容を教えて欲しいと>>902を書いた訳でない。
たまたまdateの出力があったので、例としてコピペしただけ。ls.awkでもdu.awkでも、こんなことフツーはawkでやらんだろというものなら何でも良かったんだ。
主旨としては、>>903みたいのを見てニヤニヤしたいだけ。
906デフォルトの名無しさん:2006/06/18(日) 16:27:43
dosで作成されたテキストファイルをunixに持ってくるときに、
ファイル末尾に改行が無いことが良くあり、
printは必ず行末に改行を付加するという仕様を利用して、
本当に>>903みたいなのを使いましたけどw
907大岡越前:2006/07/22(土) 19:55:36
awkは書かねぇ、たった一行。
908デフォルトの名無しさん:2006/07/22(土) 21:45:18
>>907
いまさら、そんなことを発言する意味があるのかい?
909デフォルトの名無しさん:2006/07/23(日) 14:33:16
おそらくそんなawkは無いでしょうね
910デフォルトの名無しさん:2006/07/28(金) 13:56:55
>>898

今さらおれもそういう使い方がしたいと思った。
結論から言うと split して配列作れば確実
911デフォルトの名無しさん:2006/08/17(木) 20:37:57
文字列aaa.bbb.ccc.ddd.txtのうち
aaa.bbb.ccc.dddの部分を取得したいのですが
どのようにしたら取得できるでしょうか?

文字列がaaa.txtのときは
awk -F. '{ print $(NF-1) }'
でOKだったのですが、上記の文字列の場合はダメだということが分かりました。
ご教授お願いします。
912デフォルトの名無しさん:2006/08/17(木) 22:13:58
awk -F. 'BEGIN{OFS=FS}{NF--;print}'
913デフォルトの名無しさん:2006/08/17(木) 23:26:02
awk '{sub(/\.txt$/, "");print}'
とか。
914デフォルトの名無しさん:2006/08/18(金) 03:06:30
awk -F.txt '{print $1}'
915デフォルトの名無しさん:2006/08/18(金) 03:27:32
WinXP で gawk 3.1.4 の XML extensionバージョン(xgawk) で以下の処理を
複数のプロセスから同時に実行すると、

"echo %TIME%" | getline envtim; close("echo %TIME%")

時々

fatal error: internal error This application has requested
the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

が出て落ちてしまプロセスが出るのですが、どなたか考えられる原因が判りませんか?
最終的にはメッセージ通り contact the application's support しか
ないかも知れませんが・・・。
916デフォルトの名無しさん:2006/08/18(金) 03:32:55
> 複数のプロセスから同時に実行
しなけりゃいいじゃん
917デフォルトの名無しさん:2006/08/18(金) 05:27:04
それが出来れば苦労はないんですがねー。
上位(呼び出し側)が言うこと聞かないもんで。
918デフォルトの名無しさん:2006/10/23(月) 13:31:43
awkから、
変数をsedでフィルタリングして再代入したいんだけど
一番簡単なやりかたはどんなんかな?
919デフォルトの名無しさん:2006/10/23(月) 17:34:53
function sed(cmd, str, ret)
{
"echo '" str "' | sed '" cmd "'" | getline ret
return ret
}

結局こうした
920デフォルトの名無しさん:2006/10/24(火) 22:57:13
なぜ sed 。
921デフォルトの名無しさん:2006/10/24(火) 23:12:21
gsubより使いやすいと感じるアル。
922デフォルトの名無しさん:2006/10/27(金) 23:48:17
gawkで幾つまでのフィールドを扱えるかを知りたい。
info には載ってないみたいだ。
923デフォルトの名無しさん:2006/10/28(土) 03:02:26
>>922

LIMITATIONS ってファイルがあるからそれ覗いてみ。
ちなみに

# of fields in a record:  MAX_LONG

となっている。
924デフォルトの名無しさん:2006/10/28(土) 11:51:42
あー、これか。
ttp://www.math.ias.edu/doc/gawk-3.1.3/LIMITATIONS
現実的には無制限か。ありがとう。
925デフォルトの名無しさん:2006/11/10(金) 16:43:16
>>271
ProFTPDとかに変えれば素でいろいろ出来るよ
926デフォルトの名無しさん:2006/11/10(金) 16:44:05
>>371だった
927デフォルトの名無しさん:2006/11/13(月) 23:58:59
レスしてるのは3年前のやつですよ。
928デフォルトの名無しさん:2006/11/14(火) 01:01:59
>>927
いいんだよ。
929デフォルトの名無しさん:2006/11/14(火) 01:16:25
まあでも、こういうところが不適当な回答で締め切られることも多い
教えてgooよりいいと思った。
930デフォルトの名無しさん:2006/11/14(火) 01:19:10
このスレ、4年前からあるのか・・・
931デフォルトの名無しさん:2006/11/14(火) 21:55:29
そろそろ新しいスレ立てた方がいいんじゃないか?
932デフォルトの名無しさん:2006/11/14(火) 21:58:42
次すれは975に達したあたりでいいのでは。
933デフォルトの名無しさん:2006/11/15(水) 01:37:04
>>60
おーく
934デフォルトの名無しさん:2006/11/15(水) 09:46:15
レスしてるのは4年前のやつですよ。
935デフォルトの名無しさん:2006/11/15(水) 23:14:08
>>934
いいんだよ。
936デフォルトの名無しさん:2006/11/22(水) 11:47:47
まあでも、こういうところが不適当な回答で締め切られることも多い
教えてgooよりいいと思った。
937デフォルトの名無しさん:2006/11/22(水) 13:04:29
このスレ、4年前からあるのか・・・
938デフォルトの名無しさん:2006/11/22(水) 15:43:29
シェルスクリプト相談室
http://pc8.2ch.net/test/read.cgi/tech/1112553783/
939デフォルトの名無しさん:2007/01/15(月) 23:16:32
少し教えてください。
5年ぶりにAWkを使うことがありました。
古いスクリプトを走らせると
正規表現の[一-九] がうまく作動しません。
つまりカッコ内のひとつにマッチするのが
[ でエラーになります。
5年前はうごいていたのですが。
当時はdosだったから?
今みたいにサーバーにスクリプトを置いていないから?
誰か、気をつけるべきところは?
940デフォルトの名無しさん:2007/01/15(月) 23:38:54
>>939
あんたの使っているawkが何者か調べる。
941デフォルトの名無しさん:2007/01/17(水) 11:05:30
awk gawk jawk
942デフォルトの名無しさん:2007/01/18(木) 02:13:05
まあDOSで使っていたというんなら、それはまず間違いなく  jgawkかgawk+mbだろうな。
今どんな環境で使ってるかくらい書いてね >>939
943デフォルトの名無しさん:2007/01/18(木) 23:42:50
939です。
報告が遅れてすみません。
ベクターから落とした gawk 3.1.5 for Windows
です。

944デフォルトの名無しさん:2007/01/18(木) 23:43:42
939です。
osはwin2000です。
945デフォルトの名無しさん:2007/01/19(金) 02:33:13
>>933
おまい、ドキュメントに目を通してるか?

内部的な話になりますが、マルチバイト文字はワイドキャラクタに変換して
から処理されています。このため、正規表現で[亜-熙]のように漢字の範囲指
定を行っても期待通りの動作はしません。

とあるぞ。
946デフォルトの名無しさん:2007/01/19(金) 22:30:02
>>945
939です。
ということは、JGAWKをdosプロンプトで動かすというのが
簡明な方法でしょうか?
947デフォルトの名無しさん:2007/01/20(土) 03:44:03
>>946
32bit版Windows用のjgawkってのはないので、cmd.exeのコンソールから起動しても
自動的にcommand.comが立ち上がるってのを我慢できるのなら、
それでいいんじゃないか?

ところで[一-九]って正規表現なんだが、これって漢数字の一から九を引っ掛けたいの?

一 88EA
二 93F1
三 8E4F
四 8E6C
五 8CDC
六 985A 
七 8EB5
八 94AA
九 8BE3

なんで、範囲指定に納まってないやつがあるんだが。

948デフォルトの名無しさん:2007/01/20(土) 07:27:57
わろす
949デフォルトの名無しさん:2007/01/20(土) 16:31:53
一-九程度なら[一二三四五六七八九]にすればいいんじゃね?
950デフォルトの名無しさん:2007/01/20(土) 20:46:47
947さんありがとうございます。
949さん  参考になります。
しかし、winで動かすというのもしんどいですね。
951デフォルトの名無しさん:2007/01/20(土) 22:09:48
winに限らないだろ

っていうか数年前のレスでみたデジャヴ?
952デフォルトの名無しさん:2007/01/24(水) 15:43:28
ところで今インターネット上で手に入るawkの実装ってどのくらいあるんだろ?
953デフォルトの名無しさん:2007/01/26(金) 02:15:13
awk '/ぬるぽ/{print "ガッ"}'
954デフォルトの名無しさん:2007/01/27(土) 02:36:41
>>952
多分両手の指で数えても指のほうが余るくらいだろう。

gawk, mawk, one true awk, QTawk, Open Solarisのawk

あとまだあったかな?
955デフォルトの名無しさん:2007/01/27(土) 12:51:20
http://busybox.net にも awk 実装されているよ
956デフォルトの名無しさん:2007/01/27(土) 18:53:51
でもまあそんなにawkはないな
957デフォルトの名無しさん:2007/01/27(土) 18:55:59
>>956
あほか。
わからんこと
かきやがって。
958デフォルトの名無しさん:2007/01/27(土) 22:13:46
つーかawkのkの人は未だにawk公開してんだな
本人作のawkの最終更新がApril 24, 2005ってのが驚きだ
959デフォルトの名無しさん:2007/01/27(土) 22:14:12
>>957
縦読みか。
960デフォルトの名無しさん:2007/01/27(土) 22:45:14
>959
Aはエじゃないのか?
961デフォルトの名無しさん:2007/01/27(土) 23:07:14
英語だとエイホだけど本人の出身地的にはアーホらしい。

というかそこまで考えずローマ字で考えてたんだが。
962957:2007/01/28(日) 00:02:23
ローマ字入力派なもんで。
963デフォルトの名無しさん:2007/02/18(日) 17:07:04
最近awkを使い始めた者ですが
正規表現に引数を使うときの書き方が分かりません

hoge.awkに100を渡して

gawk -v sh=100 hoge.awk abc.txt > def.txt

第1フィールドの初めが"abc100"だったら
っていうのがしたいのですが

if ($1 ~ ^/abc'{sh}'/)

これが動きませぬ

どなたかご教授ください
964デフォルトの名無しさん:2007/02/18(日) 19:23:59
>>963

$ cat moe
abc100nyoronyoro
hoge
moemoe

$ cat hoge.awk
BEGIN { hoge = sprintf("%s%s","m",ARGV[1]); ARGV[1]="" }
$0 ~ hoge { print }

$ awk -f hoge.awk 100 moe
abc100nyoronyoro
965964:2007/02/18(日) 19:25:20
BEGINがおかしい・・・
訂正

BEGIN { hoge = sprintf("%s%s","abc",ARGV[1]); ARGV[1]="" }
966デフォルトの名無しさん:2007/02/18(日) 19:31:43
>>963

パラメータは同じで:

$1 ~ "^abc"sh{
    print $0
}

* シングルクォートは、awk では引用符として使えない
* 文字列連結は定数・変数を順にならべるだけ
967デフォルトの名無しさん:2007/02/18(日) 19:35:42
ようするに、 引数ってのは原則としてファイル名として取り扱われるわけで。
"var=ファイル名"みたいな形もとれるが、
プログラム中でvarがファイルとして読み込まれる場合にのみ正常に動作する。

ファイルとして取り扱われたくなければBEGIN中でARGVを利用し、
ファイル名として扱われるのを防ぐために ARGV[1] = "" などとしておく。

俺はしばらくAwkいじってなかったから腕がナマクラになってるな・・・
BEGINのところは
BEGIN { x = "^abc" ARGV[1]; ARGV[1]="" }
と、シンプルに書くべき。
俺は何で無理にsprintf()なんて使ったんだろう・・・
968デフォルトの名無しさん:2007/02/18(日) 19:45:03
>>966
今のAWKは引数がファイル名扱いにならんのか・・・
俺もロートルだな。
969デフォルトの名無しさん:2007/02/18(日) 22:17:34
awkってどうしてこんなに流行らないの?
Perlより機能は少ないけどテキスト処理に関しては必要充分でしょ。
もう少し見直されてもいいような気がするんだけど。

最近はスクリプト言語でもオブジェクト指向が常識になってるけど、
ごく小規模のスクリプト組むのに、クラスがどうとか継承がどうとか考えるのは時間の無駄だし。
本当に本当のエンドユーザー向け言語としてはawkみたいなシンプルな言語は最適だと思うんだけど。
970デフォルトの名無しさん:2007/02/18(日) 22:36:57
PC98でPerlが重すぎたころはawkのほうがメジャーだったな
971デフォルトの名無しさん:2007/02/18(日) 23:24:45
awkが流行らない理由。
・使える人は1行野郎なりその手のものをその場で作ってその場で捨てるから資料が充実しない。
・使えない人は既にあるものを探そうとするからawkを覚えるよりはPerl(など)のスクリプトを探す方を善しとする。

Excelみたいなスプレッドシートは行数制限があるから、ちょっとしたデータ解析にはawkは重宝するんだけどね。
972デフォルトの名無しさん:2007/02/19(月) 01:51:57
Perlのほうが実装が優秀だからだよ。
awkをPerlに変換しただけで断然速くなる。
90年代前半にいたawk使いがあっと言う間にPerlに乗り換えていった。
「プログラミング作法」の比較ベンチでも完敗してたし、
Rob Pikeもshは過去の栄光だと言ってる。
973デフォルトの名無しさん:2007/02/19(月) 02:10:41
Perlはawkのアンチテーゼとして産まれたから。
優秀なことが求められている項目については、
全て勝っていると思うけど。
自分はawkの方が好きなんだけどね。
974デフォルトの名無しさん:2007/02/19(月) 02:15:12
実装方式の影響がでかいからなんとも言えんよ。
POSIX-awkだと枝狩りがないから正規表現のコストが高い場合があるし、
逆に遅延評価DFAが有効に機能する場面なればawkの圧勝だろう。
975デフォルトの名無しさん:2007/02/20(火) 00:24:27
awkでurlデコードする関数作ったんだけど
こういうライブラリもうある?
976デフォルトの名無しさん:2007/02/21(水) 22:36:09
うちの職場だと普通の事務屋や技能職が
日常の雑事をbashとかawkなんかで済ませてるけどな。
GUIが必要ならVB使ったり、
HSPとかなでしこのようなフリーの安直な言語使ってる。

会社には一応情報の専門職もいるんだが、
簡単な事は全部自分達でやっちゃうから、彼らの立場がなくなってる。

そう考えると、エンドユーザーズ言語(簡易言語)を広めれば
企業にとっては無駄な情報屋を雇わなくて済むから得になるわけだ。
目的が特化され機能が絞られており、非オブジェクト指向で、
なおかつ日常でよくやるような作業が簡単にできる言語には大いに存在価値がある。
素人をプログラミングから遠ざけ、情報屋が仕事に困らなくなるような言語ばかりが世にはびこるのは良くないことだ。
977デフォルトの名無しさん:2007/02/21(水) 22:55:40
978デフォルトの名無しさん:2007/02/22(木) 20:04:25
>>977
AWKでCGI
http://pc10.2ch.net/test/read.cgi/php/1171804314/
で紹介されてる
http://www.gnu.org/software/gawk/manual/gawkinet/gawkinet.html
を見てしまった。 gawk でsocketが使えるのね。知らんかった。
試しに、
gawk 'BEGIN { "/inet/tcp/0/192.168.0.99/110" |& getline; print $0; close("/inet/tcp/0/192.168.0.99/110") }'
とやったら、レスポンスが返ってきた。
誰か、SMTP でとやり取りするスクリプト作ってくれないかな。メールの中味(ヘッダも含む)
に対して gawk でごにょごにょやりたい。
979デフォルトの名無しさん:2007/02/22(木) 21:55:23
>>976
ムカツクこと言ってくれるねぇ。
本当の事を露骨に言うなよ。
980デフォルトの名無しさん:2007/02/22(木) 22:58:16
オークって読むんだね。
981デフォルトの名無しさん:2007/02/22(木) 23:17:20
awk95.exeをつかってる(シフトJISに対応してない)
982デフォルトの名無しさん:2007/02/23(金) 12:11:36
カーニハンはオークって読むなといっていたような・・・
983デフォルトの名無しさん:2007/02/23(金) 19:09:37
http://ja.wikipedia.org/wiki/AWK

AWK の発音は "オーク" であるが、
これは日本語話者にとって不自然であるため、
“エー・ダブリュー・ケー”と発音する人がいる。
しかし AWK の教典こと『プログラミング言語AWK』の日本語版の序文では
制作者の一人であるブライアン・カーニハンは
決してそのような発音をしてはならないと主張している記載がある。
なお、この本の表紙に書かれているのは
オオウミガラス(GREAT AUK)でありその主張の強調でもある。
984デフォルトの名無しさん:2007/02/23(金) 23:05:58
そろそろ次スレが欲しいな。
985デフォルトの名無しさん:2007/02/23(金) 23:56:41
986デフォルトの名無しさん:2007/02/24(土) 00:22:18
作者はオークと読んで欲しくないけど、
使ってる人はオークと読んでいる。
987デフォルトの名無しさん:2007/02/24(土) 00:33:34
新スレキタ━━━━━━(゚∀゚)━━━━━━ !!!!!
988一応釣られておく:2007/02/24(土) 05:36:22
>>986
「エーダブリューケー」と読むなという主張。
989デフォルトの名無しさん:2007/02/24(土) 07:39:33
awkは語るまい。
990デフォルトの名無しさん:2007/02/24(土) 14:19:23
オークでだめならawkのaだけを取ってアホでいいか?
991デフォルトの名無しさん:2007/02/24(土) 14:57:14
カーニハンがダメだというのならkだけ取ってawでいいよaw
語尾につけるとかこいいよawwww
992一応釣られておく
だからなんで逆に解釈するんだよ~(TT