まぁなんだ、Perlがあるからそんなもんいらんというのが結論かも
しれんが、awkにはPerlに無いエレガントさがある。
その辺愛好する人の発言きぼんぬ
ニダ
処理系の無料/有料
文法の具合と特徴すらわからーん
5 :
デフォルトの名無しさん:02/06/09 09:56
BASICの次にやったのがAwkでした。
C言語の勉強に最適だと思いますよ。インタプリタだし。
ただし、正規表現と文字列型がないとやっていけなくなる罠。
素人にはお勧めできない。
6 :
デフォルトの名無しさん:02/06/09 10:06
>>1が「awk」をどう読むかによってスレの流れは変わる。
7 :
デフォルトの名無しさん:02/06/09 10:06
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
awk -f ~.awk <<EOF
そーだったのか!
EOF
具体的には
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 だけど他のは知らん
bash でもできた。
でも zsh ならもっと簡単なのが多分ある。。
zsh
printf "testdata00%04d\n" {0..9999} > output.dat
19 :
デフォルトの名無しさん:02/06/09 11:52
gawkの日本語パッチはどうなってるのかな。
教えてエロい人!
漏れはNTなので、mawkを使ってるが。
ちなみに入力ファイルなしのときは、すべてをBEGIN{}のパートに
入れてしまう。
しかし、漏れはトッパンの「プログラミング言語AWK」を買っておいた
ので助かってるが、トッパンがつぶれて以後マトモな教科書ってある
んだろうか。
22 :
デフォルトの名無しさん:02/06/09 13:32
アホが作った言語。
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> awk=あほ
24 :
デフォルトの名無しさん:02/06/09 19:38
>>21 AWKの教科書なんて、man awkで十分だよ。
一番多いのは、/^$/{......}かな。
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
というのもまだ買えるね。
トッパン潰れたのか。良書を結構出してたと思ったが。
良書なんか出してたらダメなんだろうな、今の時代。
>>23 まぁたしかにAho先生も制作者に入ってるわけだが( ・・)/
>>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 はオプションインストールだしね。
>>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
38 :
デフォルトの名無しさん:02/06/09 23:40
awkはCを使えれば覚えること少なくて済むのがイイ
>>39 しかしawkを覚えてもcは使えないと言う罠
おまけにあらゆる事をawkで済ましてしまうのでタダでさえ知らないcを
さらに忘れてしまうという
オレのAWK猫。「猫に真珠。」などとくだらないギャグを
言ったせいでPerlを覚えてくれない。はっきり言って
仕事に支障が出ている。済まなかった。反省している。
だからそろそろPerlを覚えて欲しい。ver.4.36で構わな
い。頼む。
42 :
デフォルトの名無しさん:02/06/10 01:47
Perlスレが上にあるのでちょっと・・・
Perlを覚えたらawkなんて覚える必要はないよね?
43 :
デフォルトの名無しさん:02/06/10 01:49
二次元配列はawkの方が直感的
__,,,,_
/´  ̄`ヽ,
/ 〃 _,ァ---‐一ヘヽ
i /´ リ}
| 〉. ‐- -‐ {!
| | ー・‐ く‐・‐|
ヤヽリ ´゚ ,r "_,,>、 ゚i
ヽ_」 ト‐=‐ァ' ! / ̄ ̄ ̄ ̄ ̄ ̄ ̄
ゝ i、 ``二´' 丿 < Rubyさいこー
r|、` '' ー--‐f´ \_______
_/ | \ /|\_
/ ̄/ | /`又´\| |  ̄\
45 :
デフォルトの名無しさん:02/06/10 02:03
>>42 フロッピー一枚持って外出すればどこででも
使えるawk。
対して
ダウンロードして環境変数を
設定せにゃならんPerlは他人のPCを借りて
使う場合にめんどくさい。
MSインストーラ版だとレジストリも汚染される。
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の方がなじみやすかった
ということもある。
まだDOSの頃の話だけど awk は N88-BASIC や Perlより実行速度が
2倍程度遅かったというのも awk をやらなかった理由の一つだったな。
今と違ってCPU性能が低いので割と大きな問題だった。
>>46 その勢いで Ruby から begin を無くして下さいな。
>>48 その代り、Perlはダスエキスパンダーとか使わないと走らなかった
51 :
デフォルトの名無しさん:02/06/10 22:56
awkでやるかperlでやるかで悩むことってあんまないな。
むしろexcelでやるかどうか一瞬迷う方が多い。
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
58 :
デフォルトの名無しさん:02/06/12 21:44
awkはいまだに関数つくったことないな
59 :
木村 キタキタマシーン:02/06/12 21:46
awkってなんて読むの? アォク? エゥク?
61 :
デフォルトの名無しさん:02/06/14 10:25
多くは語れない
多くは聞かないでくれ
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オプションあるけどね。
>>55 ファイルサーバ上のPerlを使うんだったら一台一台にインストールする必要は
ないぞもし。
Rubyも小さいよ
70 :
デフォルトの名無しさん:02/06/17 03:04
shigeの胸も小さいよ
oioi
出先の雲丹クス屋のおっさん
何でもこれとシェルでパイプして片づけやがんの・・・・ (´д`;)
いや確かにそう言うものなんだけどさ
「何でも」の種類によるな
>>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
・ファイル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については多くを語るまい。
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;
paste -d' ' AAAAA BBBBB |
sed "s/ /' AND num = /;s/^/SELECT * FROM tableA WHERE id = '/;s/$/;/" > CCCCC
つーか、宿題は宿題スレでやれ。ぼけなす。
awkでやれよう
>>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 って連結?
>>101 コンパイルしなくても良いからじゃない?
まあ、awkでも printf 使った方が簡単だと思うけど。
(゚Д゚)ガーン
>>99 iriaに送るのになんでawkを使う必要があるんだ?
iriaでファイル展開できるだろ。。。
printfが使える処理系って他にもperlやschemeとかあるしね。
>>106 まあそうなんですけどね。
>>107 なるほど。elispは全然わからないんですが、
elispで書くとこうなるんですね。
頭に0を付けることまでやっているんでしょうか……。
しかし、この板の人は親切ですね。
>>108 > 頭に0を付けることまでやっているんでしょうか……。
ああ、それは忘れた。>101と見比べれば分かるだろ。
110 :
デフォルトの名無しさん:02/08/16 03:27
elispにもprintfあった気がするが。
formatはlisp知ってないとわからんと思う。
「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 !!
130 :
デフォルトの名無しさん:02/10/28 02:57
awkの解説サイトってありませんか?
おおくはない。
132 :
デフォルトの名無しさん:02/10/28 11:40
awkを語らずage
あんま知られていないawkを流行らすのもいいかな。
昔はそれなりに流行ってたんだがなぁ…。
知られてないって、sedやgrepと同じくらい超基本だと思うんだが。
/bin/grep
/bin/awk
いつの日か
/bin/perlになる日がくる。
坂本文の本で 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 で最初に書いてしまったことで、
そこから進歩できなくなった人を知ってます。
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 に繋ぐ
ようにするよな。その方が普通は効率的。
>>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 ユーザーに使える状態になっていることを
“インストール”されている
というのだが。
話が噛み合ってないよ
171 :
デフォルトの名無しさん:02/12/22 03:23
MS-awk って MSDN サブスクリプションに入ってますよね。
使わんけど。
Linux上のgawkで日本語の単語をsubstrしたいのですが、これってバイト単位
でしか指示できないのですか?日本語対応できる方法をご存知の方は教えて
下さい。
昔日本語対応でjgawkがあったのですが、ダウンロードサイトを見つけ
られません。滅びてしまったのだろうか?
あら、「オーク」って読むんだ、
「アウォック」って、いままで読んでた。
じゃ、sedは何て読むの?
「セッド」?「エスイーディー」?
174 :
デフォルトの名無しさん:02/12/26 01:55
>>173 SED == Super Extra Deluxe editor
マジレスすると Stream EDitor なわけだが。
178 :
デフォルトの名無しさん:02/12/29 22:19
MS-awk で、パイプって使えないみたいですね。バグが多いのかな。
179 :
デフォルトの名無しさん:02/12/30 15:54
ばかやろう
Stream Editorだああああああああああああああああああああああああああ
180 :
デフォルトの名無しさん:02/12/31 00:41
>>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検索してみたけど見つからん。
どこにあるのか教えてください。
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を提出することがある。
どうなっちゃうの?
! | l l ヾ(::::: ヽ〉ヽ)ヽ `l ミ ー .、 |
| {レヽ〈:::~``'' ´ ソ |! l } ミ. ミ ト
レヽ,;:::''''`':;|;il~,. -‐' ル )ノl / ミ ノr^,ヾ !
ゝ l;ュ=≡{., (;;,(ニ===、-.l! li /ソ ;;)|./
`!;ェ‐・オ ""'''< `・ーz'ー'~ |/ フ;;i |! <嫌だなあ・・・・
|:'""`')' ^ヽ;` ̄,. -‐'^ i|;;;;ノ/\ー-、-.,_
!;:.. .:;i| ;, ~、´ ,/ |,..ノ; \ ゝ ヽ``)、.,_
``ヽ(__,,,,...) \_,,..-' |;;; |〉 トli ヽ
|::::::::J..,,_ ^ヽ, : 1, ;!;: /l、 ) |
ヽ::r,―--一' . , il/::: :: / ! ; /
.//'i`ー-'´; ' ;. ',/;;;::::: .:::::∧ } ヽイ
/ / L.;_';_._,`.ノ
191 :
デフォルトの名無しさん:03/01/09 14:53
======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 漏れも「今から危険な領域に突入しようと(以下略」みたいなとこまでは
いったんだが…。気になるけど見たくない…。
けんすうさん。
先程、「天才」と呼ばれた
ディカブラットさまには頭を下げておきました。
皆さんが何を考えるか知りませんが
個人的に、
「結構ヤバイ」んです。
貴方方は気楽でしょうが。
末期がんに近い感じで追い詰められています(実際のクランケ御免なさい)
コレ、嘘じゃないのです
聞いて下さい
お願いします
急にレスの勢いがとまったな
ニュー速を閉鎖しないのは、やはりニュー速住人が他に行く事で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ちゃんねるって恥ずかしくない?>アンチの皆さん
(・∀・)?
(^^)
結局ひろゆきの年収っていくらなんだろう?
(^^)
227 :
デフォルトの名無しさん:03/01/22 03:14
(^^)
ホシュ
本当にObjective awkなんてあるの?検索してみたけど・・・。
231 :
デフォルトの名無しさん:03/02/09 12:33
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)を使用しています。
!~
AWK って Windows Scripting Host に組み込まれた実装はないの?
Active AWK とか妄想してみる。
>>238 なぜそんなものを欲しがるんだ?
それ以前にWSHは別のプログラムの標準入出力を処理できないだろうが。
(^^)
∧_∧
( ^^ )< ぬるぽ(^^)
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
>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/重複しない名前")
>243
cmd = "echo " str " | command"
cmd | getline s
echoが無いとだめだが、
その程度ならすぐ書けるだろ。
BEGIN { for (i = 1; i < ARGC; i++) printf ARGV[i]; print "" }
>>255 漏れは Copal +
>>255 を使ってます。
ところで、Windows でも UNIX みたく #!/usr/bin/awk -f とかやりたいんですが。
つまりawkスクリプトをコマンドのように使いたいんですが。
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
とか。
>>258 なるほど、そう言うトリッキーな方法しかやはりありませんか…
>>257 cygwin は使ってます。便利ですよね。
またまた質問なんですが、
awk ですべてのパターンマッチングに際して
大文字と小文字を区別しないように
強制するオプションってありましたっけ?
grep における -i (--ignore-case) みたいな。
どうやら IGNORECASE って変数が用意されているらしいんだが…
これってどの実装にも用意されているんだろうか。
POSIX 準拠?
263 :
デフォルトの名無しさん:03/04/26 11:59
>>256 あとは、.awk の拡張子を awk.exe に関連付けして、start /b hoge.awk とかはできる。
もしかすると、PATHEXT に .AWK を加えると、単に hoge で起動するかも。
264 :
デフォルトの名無しさん:03/04/26 12:07
265 :
デフォルトの名無しさん:03/04/26 14:17
set PATHEXT=%PATHEXT%;.AWK
すると hoge で起動できました。Windows 2000 でつ。
>>265 ども、ありがとうございます。
PATHEXT なんてのがあるんですねぇ……
267 :
動画直リン:03/04/26 14:26
*.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") を忘れへんこと。
>>277さん
レスありがとうございました.ちょっと調べた感じですと,getlineは
“非常に複雑なため,初心者は使うべきではありません”なんて書いてありました...
でもちょっと試してみます.
フォーマットは、たとえばここのログなら
「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
どうもです。
>280
なんだか、
Sep の初期化を BEGIN の前に行うと滅茶苦茶な動作になってしまうようです。
BEGINの中に入れるとOKでした。
>>281 >RSに設定した行が消えたり
そう、今日はこれで悩んでいました。
getline関数にも挑戦してみますが、
素朴に対応する方法はないでしょうか?
>>276 paste 使って各ファイルをくっつけてから awk で足し算する。
>>283さん
おおっ!
pasteで簡単にできました.ありがとうございました.
>>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
∧_∧
ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。
=〔~∪ ̄ ̄〕
= ◎――◎ 山崎渉
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[] を出力。
>>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ファイルを一括して指定することができません
でした.
↑ずれました...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");
}
}
>>294 いえいえ、何かの役に立てればうれしいです。
>>298 やっぱり、他人のソース見るのは勉強になるなあ。
FNR == 1 で、次のファイルを読み込んだのを検出できるんですね。
>>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なのか。
すみません
教授がほとんど説明せずに課題を出しているので、awkプログラム自体はっきりとは飲み込めていない状況です
説明なしで始めさせられ、5~6時間程度しかやっていないので・・・UNIXのコマンドなども併用して良いそうなのですが・・・
連想配列という言葉自体始めて聞きました
少し調べてみます
上三問のヒントだけ、いただけないでしょうか?
man awk
Awkの作者の書いた本もよいかと。
プログラミング言語AWK
有り難うございます。もう少し頑張ってみます
_| ̄|○
>>315 進展したのか挫折したのかはっきりせい。
そのAAだとどっちか分からん。
四つんばいだから挫折ってことでは...
_| ̄|○
↑ ↑↑
足 手頭
>>317 「ありがとございますた」に見えなくもないんスよね。
すみません、なかなか理解できず・・・
期限は明後日・・・ ひ ら が な の数を数え出す方法が分かりません。
もう少し手がかりを与えてくれないでしょうか?
できれば、上三問だけでも答えを知りたいですが・・・
問題読み間違いしてる気もするけど、意外と難しいかもね。
1,2,3フィールドの意味が分からないので1のヒント。
$4には<br>かひらがなだけと仮定してるから、そこんとこ。
substr($4, 1, 2)# 1文字目のひらがな
substr($4, 3, 2)# 2文字目のひらがな
...
substr($4, length($4)-1, length($4))# 最後のひらがな
有り難うございます。考えて見ます
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.の出題は意味不明です。"
}
__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
329 :
323-327:03/07/15 13:40
うぜえ
__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
>>323-327 ご親切にどうも・・・すみませんでした
お手数をおかけしました。有り難うございます
ん、そのプログラム動く・・・?
>>322 ばかやろう。当然確認済みだ。エラーメッセージ見せてみろ。
WindowsXPのコマンドプロンプトでawkプログラムを使うにはどのような操作をすればいいですか?
googleで検索してみたのですが、いまいちよくわからず・・・
>>335 Cygwin 入れる(gawk)か、awk を単体でインストール
(Vector に mawk というのがあるから検索汁)
>>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 その文章は明らかに
>全部で一文あるとか言ってるしでひとつ
↑問題
>丸がいくつもあるはずなのになぜか全部で文はひとつありましたとでる。
↑その解説
>明らかに自分の打った語数に足りないでひとつ
↑問題
>ひらがなの数が打った数の表示に合わないし、確か何故か単語数のほうが多かった
↑その解説
という構成だから上二つが同じ事言ってるのは(以下略
うぜぇ
(^^)
(,,・θ・)
awkの場合、
「使用言語にawkを選択した時点で勝ち」
つーのがあるよね。one liner とか。
>>354 awkの場合、
「使用言語にawkを選択した時点で負け」
つーのがあるよね。遅い、制限多し(ディレクトリ操作、Socket、モジュール、Oop・・・)
(⌒V⌒)
│ ^ ^ │<これからも僕を応援して下さいね(^^)。
⊂| |つ
(_)(_) 山崎パン
フィールドの指定で、
$3 から行末まで全部とか
$2 から $20 までとか って指定できますか?
$2 $3 .... $20 って全部書かないと駄目でしょうか?
>>357 for でループして望みのことはできない?
for (i = 2; i < 20; i++) {
buf = buf" "$i
}
# buf を使って何かする
上のは単に例だが。
>>358 レスありがとうございます。
もっと簡単にできるとうれしいんですけど
for で地道にやっていくことにします。
>>357 ああ、それイライラするときあるな
全部書くか、forで回すか
先にcut -fでフィルタしてから処理してるけど
awkでやるいい方法あるんかね
3から全部なら...
substr($0, index($0,$3))
362 :
デフォルトの名無しさん:03/08/31 21:48
$1==$3だったら?
index()って裏もあるの?
364 :
デフォルトの名無しさん:03/09/01 23:04
さんざんお世話になったawkを見捨てられない俺はオヤジ
しかし「あおく」って発音する奴いるんだが。。。
青臭いな
366 :
デフォルトの名無しさん:03/09/02 02:17
オライリーの「入門awk/sed」最強だよ。これで日々の作業が60%楽になった。
367 :
デフォルトの名無しさん:03/09/02 20:31
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 >>382 ありがとうございました、おかげで、効率があがりました。
私も、もっと勉強して、聞くほうから教えるほうに成りたいものです、
では、失礼します。
(⊃д`) 俺は無視かよ。
>>385 泣くな。お天道様はちゃあんと見ておられる。
>>380 ぐあああ、すみません。
一番使わせていただきました^^;
どうも、みなさんありがとうございました。
>>383 383の方が正統っていうか王道っぽい
377は邪道っていうか脊髄反射
けどOFMTさわったことないんだよな
なにを設定すればいいんだ?
%.6gって・・・
ずっと名無しでやってきたけど
ちょっと変わった事したいのでコテってみました
awkでやるのは大変そうなものは
perl使えとか、ruby使えとか、良く言われるけど
んなもんいきなり使えるかヴォケ!!
今からperlやrubyなんてやってられねーよ
って時の助けになるようにちょっとづつtipsを書き込んでいきたいと思います
問題を解決するためのawk+αが欲しいんだけど
perl、ruby全部なんて覚えてられない。(それはコスト高すぎ)
必要最小限なものってなに?
ってのを追求していきたい(perlは苦手なんでrubyで)
なのでawkだけで問題なく出来ることはawkを使う方向で。
シェル、unixコマンド、sed、awk等を組み合わせれば簡単に出来る場合も
そちらを優先する方向で。
まずは、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";
---------------------
コマンドラインオプション解説
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だとセミコロンはあってもなくてもいい
>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,・・・
-------------------------------------------------------
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");
}
まあ、せっかくだから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;
}
}
>>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つにしてみました。
なんとなくruby版
cntにローカル変数使えなくてビックリ・・・(グローバル変数にしました)
あとバグもってるけどどうしたものやら
・ファイル名に空白が2以上連続してると喰われて1つになる
------------------------------------------------------------
BEGIN{$cnt = 0}
$cnt = $cnt + 1
printf("%d File inode:%d %s\n", $cnt, $F[0], $F[9, $F.size])
------------------------------------------------------------
バグ修正
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(" "))
------------------------------------------------------------
>>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 遊びでやってるだけですので、ウザイ様でしたらそのまま放置でも結構ですので(^^;;
まいどまいど長文ですみません;;
>>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
417 :
デフォルトの名無しさん:03/11/05 22:50
>>416 > 総レコード数とファイルレコード数が一緒なら最初のファイル。
> 違えば2番目以降のファイル。
ありがとうございます。
処理開始時だけ,FNR=NRで,後はずっと,FNR<NRとなることを利用してる訳で
すね。これって,今回のケースのように,複数のファイルを引数にとったとき
に,各ファイルによって処理内容を変更するための常套手段だと覚えておけば
いいでしょうか?
常套手段なんて立派なもんでなく、書いてる時に思いついただけのもんです。
最初のファイルだけ特別な時に使えますね。
各ファイルごとに処理を変えるなら、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"); }
-----
425 :
デフォルトの名無しさん:04/02/26 21:58
そらりすでやな、「abcという文字列が含まれる行だけ」というのを
if(/abc/){
...
}
ってやると構文エラーって怒られるんだ。
でも、Linuxでは通るんだよね。
何か違うの?
Linuxのはgawkだからな。
/abc/ { ... }
と書くのが普通じゃないかと
428 :
デフォルトの名無しさん:04/02/29 17:24
>427
すみません、-fオプションで別ファイルにしたいんですよ。
>429
え、そう?
コマンドラインから実行する場合は>472が書いた方法でやるけど、スクリプトファイルを別に作る場合は-fオプションじゃなかったっけ?
で、そのスクリプトファイルの中に記述する場合に>425の方法でやりたいわけですよ。
あ、ごめん
>472じゃなくて>427ね。
>>431 おちつけ。完璧に意味不明だぞ。
#!/usr/bin/awk -f
/abc/ { print }
という感じで一行目が違うだけで下は普通のawkのコード。
awkは死滅していないYO!
Apacheのインストールにも使われているしNE!
>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
>>443 いや実はポーターで。
system抜けば多くの実装がすぐにでも動かせるんだけど、
入れようとすると途端に面倒に。
まあ不可能じゃねーからどうにかするけど。
せっかく久し振りに風邪ひいたから、明日も仕事休んでやってみるかな。
実装書くのも面白そうだね。
規模はそんなに大きくないから細かい部分を好きに弄りながら楽しめそう。
渋くて好みには合うから、その内やってみるかな。
>>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 以下略
のようにしたいんです。どうかご教授お願いします。
{ 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}'
/^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使い始めて
十数年にしてはじめて知ったよ...
.
>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;
あー、いきなりアクション書くなよ?
BEGIN {
}
で挟んどけ。
472 :
デフォルトの名無しさん:04/04/23 16:36
473 :
デフォルトの名無しさん:04/04/23 16:42
シェルスクリプトとawkではどっちが高速かなぁ
474 :
デフォルトの名無しさん:04/04/23 18:40
>>472 >close しないで放置プレイでも桶なんでしょうか?
何度も通るアクションで使うんだったら close しないとだめでつ。
476 :
デフォルトの名無しさん:04/04/23 20:29
それにしても蟹御飯の書いたawkのソースは綺麗だよな。良いCの勉強にもなりまつた。
>>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上では今お使いの処理系で特に問題ないと思います。
>486
ありがとうございます。
488 :
デフォルトの名無しさん:04/05/06 16:42
gawk-2.x と gawk-3.x で、「仕様変更」っていえるものはあるの?
機能拡張はウジャウジャありそうだけど…
490 :
デフォルトの名無しさん:04/05/07 08:59
>>489 サンクス。
やはり --posix で動くように書いていた方がいいのかなぁ
491 :
デフォルトの名無しさん:04/05/18 10:16
学校の授業でawkで簡単なプログラムを作れと課題が出てるのですが
awkがさっぱり理解できません。
どこかわかりやすく解説されてるHPがあれば教えてもらえませんか?
>>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
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
504 :
デフォルトの名無しさん:04/05/25 22:14
>>499 > MS-DOSが流行っていた頃、BASICでなくAWKとバグなしSORTがあったら
あったらも何もAWKとSORTFはDOS全盛の頃の定番ツールですが
awkとあんま関係ないが
その頃はX68kでgccやμemacsとか動いてたな。
メモリ数メガでよくやってたもんだ。
当時awkは詐欺みたいな言語に見えたな。
C言語覚えた後、結局使う事はなかった。
>506 適材適所
awkで済む事をわざわざCで書くことはない
>>495 すこし考えてみたが、シンプルにはならんと思う。
awkにはdirnameとbasenameに分離して渡して、IFSをdotにすれば少しは簡単になるが
basename自体に複数のdotが存在しなければ良いのだが
basename自体に複数のdotが存在する場合がアタマイタイ
仕様のこの点の説明が無いのでここまで
上の方でも言ってる人がいたけど、
(OS付属とかの)awkで複数ファイルをオープンするとかできないの?
外部ファイルのテーブルのデータを使って、
入力を切り分けしたい場合があったんで。
もうperlで組んじゃったけど。
>>495 dosだとFS=\\
とやっておくと、$NFで名前は取り出せるからsplit使って
あとはrenだな。
>>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'/
'
>>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/'
>>517 2つ目のsedコマンド間違ってた。
こっちが正解。でも
>>519のがいいかも。
d=`date +%Y%m%d`
echo $OUTFILE |
sed '/\.\([a-z0-9]*\)$/s||'$d'.\1|
/\(^|\/\)[a-zA-Z0-9]*$/s//&'$d'/'
>>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 と同じ動作をしているみたいに思えるのですが、
この理解はあってますか?
完全に意味不明でつ。
>>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) {
...
}
}
それは537の頭が異常だからです
540 :
デフォルトの名無しさん:04/09/17 22:40:00
awkって理論上はテラバイトのデータも処理できるものなのですか?
オブザベーション単位で処理をしているのなら可能なのかなと。
541 :
デフォルトの名無しさん:04/09/19 17:44:51
542 :
デフォルトの名無しさん:04/09/19 19:22:23
じゃあ540に答えて。
スマソ。540のもわからん。試してみたいがそんなファイルを置く場所がない。
>>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]/ の省略ではないのでしょうか.
追記: `...' は,全て文字通りのドットです.
>>537 if ( line ~ /^[0-9]/) {??# 1文字目が0-9
if ( line ~ /[0-9]/) {?? # 0-9がある
自分で試してみた。
>>544-545 おれの環境では期待通りの出力になる。
GNU Awk 3.1.3
>>537 これもおれの環境では期待通り(頭が数字のレコードが真となる)の出力になった。
hoge.txtの中身と、どんな出力を期待しているのか教えてけろ。
なんかおかしなことになってる...
# 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
>>549 Windows上のGNU Awk 3.1.2では同じ結果(下の方)になる。
FreeBSD 上の GNU Awk 3.1.1 と awk の両方で期待した通りになるけど。
Debian, mawk-1.3.3, GNU awk-3.1.4で試してみたけど
mawkだと期待どおりの結果になる。
gawkはLANG=CだとOK、LANG=ja_JP_eucJPだとNG。
>>552 > gawkはLANG=CだとOK、LANG=ja_JP_eucJPだとNG。
それです! 環境を書かないでごめんなさい.
いつから壊れて (?) いるんだろう...?
とりあえず全て match で書いてしまいました.
あまり長いものは awk で書かれないから,
「とりあえず」でもいいところがいいですね.
良くないか.短く書けるところが書けなくなったわけだ orz
バグレポした方がいいんでない?
>>553 > いつから壊れて (?) いるんだろう...?
3.1.3 は無問題。
3.1.4 は駄目。
chmod u+x したファイルの 1 行目が
#! /usr/bin/gawk -f
なら正しく動くのですが,
#! /usr/bin/env gawk -f
では実行するときのコマンドが awk プログラムと認識され parse error になります.
なぜなのでしょうか.
>>558 改行が \r や \r\n になっているとか?
>>559 それではありませんでした.vi で書きましたし.
そちらでは動きますか? hello world 程度のを晒していただきると助かります.
#!ってインタープリタの引数2つ書けたっけ?
書けないね。foo というファイルであれがsharp-bangなら
/usr/bin/env "gawk -f" foo
という呼ばだしになるはずなんで、"No such file or directory"
あたりのエラーメッセージが出るはずなんだが。
結局,みなさん #! /usr/bin/gawk -f の決め打ちで使っているわけですか?
調べてみたら#!にインタープリタの引数を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によっててんでばらばら
なのであまりお勧めできないということだろうか。
565 :
dos窓でawk:04/10/06 15:23:39
jgawk使っています。
行頭に「|」半角の縦棒がある行だけprintしようとしたのですが、
うまくいきません。どうしたらいいのでせうか?
エスパーじゃないけど勘で。
半角の縦棒は正規表現のメタ文字だから '\' でエスケープする
例:
#!/bin/awk -f
/\|/ { print }
「うまくいきません」だけでなく、実際のスクリプトや、
期待した結果と得られた結果がどう違ったかも具体的に書いてね
訂正。行頭だから
/^\|/ { print }
だね。
>>567 早速ありがとうございました。うまくいきました。
実際のスクリプトですが下記のような形で書いておりました。
$0 ~ "~\|" {print}
そうしましたら、半角縦棒があろうが無かろうが出力されてしまいました。
括弧でくくってみたりもしましたが
$0 ~ (^\|){print}
^parse error
でした。今回は行頭なので教えていただいたスクリプトで行けそうですが、
もしも、$2や$3などで指定したいときなどはどうすればいいのでしょうか?
ええと
$2 ~ /^\|/ { print }
570 :
dos窓で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}って分岐させればいいのかな
わかる方お願いします。
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]
のように出力したのです。
>>573 inout は input にするのか?
575 :
デフォルトの名無しさん:04/10/13 07:05:39
awk '/^(input|output)/{a = $NF; $NF=""; print a,$0}'
あたりで。いらない「;」やお尻の空白はsedで削った方が楽だと
思うのでとりあえず放置したがgsubとかしてもいいよ。
a=substr($NF,1,length($NF)-1)
でええやん
ほしゅ。
awk ゴックン
580 :
デフォルトの名無しさん:04/12/07 15:06:26
ほしゅ3000行
懐かしいな
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
これもっと奇麗にならない?
私、綺麗?
585 :
デフォルトの名無しさん:04/12/18 17:38:23
awkって日本語扱えるの?
jgawkなら。
587 :
デフォルトの名無しさん:04/12/19 13:22:55
しょうもない駄洒落を思いついたが書き込むのはやめておくか
awkスレを読んでなぜ「sedをマトモに使えない劣等感」を再確認させられなければならないのかorz
589 :
デフォルトの名無しさん:04/12/19 17:54:58
ごめん。やりたいことは、あるファイル中のファイルパスを置換したいのです。
sedの場合、正規表現にs|./hoge|./ore|gとかs/{/usr/bin}/{/usr/local/bin}とかが出来なくて、
バックスラを/の前に付ける必要があり、よくありません。
awkを使うと余裕なんでしょうか?正規表現やSEDの使いかたに問題があるだけ?
ゾーンにはいってしまっています。
うぇfげwc89うぇy8いぇ0tgq-tfvg78う
>>587 勝手に類推w
awkについてはawkを語らない
>>589 sed で前の方は出来るはずだけど。| がシェルでパイプとして解釈され
ているので、-e "s|./hoge|./ore|g" とクォートしてやればいいのだが。クォー
トがいやなら、, とか解釈されない文字を使えばいい。
ただ、不思議なことしたいんだね。hoge を ore に置き換えるのはともかく、/
の前の任意の一文字を . に置き換える処理って想像がつかない。
perl -wpe 's#/usr/bin#/usr/local/bin#g'
前者の方はたぶん本当にやりたいのは
perl -wpe 's#^(.+?)/hoge#$1/ore#g'
みたいな事なんだろうな。
sed 's/sed/perl/' 588 > 594
no... 594スマソ
595ネ
awkでMIMEのエンコード、デコードするスクリプトってどこかにありませんか。
スクリプトで「print | "sort"」の出力を得たいので、
print | "sort" |getline
とやってみたら、だめでした。なんで動いてくれないの。
一度ファイルに書き出せばできましたが、ファイルに書き出ししない方法はないでしょうか。
print と getline は行ごとに処理するけど、sort は全部の入力を
読み終らないと出力できないからだと思うが。
2つのスクリプトにして、
awk -f script1.awk file | sort | awk -f script2.awk
とでもする? getline も多分使わなくてよくなるし。
600 :
デフォルトの名無しさん:05/02/16 22:04:46
>>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 じゃ
ないとイケないのかなぁー。
>>602 > ところで皆様はどんな時に awk を使っていますか?
cutの使いかたを思い出すのが面倒くさい時。
awk使うのはコマンドラインで打ち込んで終わりみたいな
使い捨てで、perlで書くより楽そうなとき。
perlより楽ってのは人によると思うが、オレがそう思う
のは、複雑な文字列操作や正規表現で置換とかはやらないで、
$nでフィールドとりだして連想配列でごにょごにょぐらいで
済むときかな。
awk '{a+=$1}END{print a}'
とか、
awk '{a[$1]+=$2}END{for(i in a){print i,a[i]}}'
みたいのはほとんどイディオムとなっていてよく使う。
逆にある程度の規模でスクリプト書くとかなるとほとんど
perlです。
>どんな時
趣味のprogrammingする時
606 :
デフォルトの名無しさん:2005/05/28(土) 10:14:11
そういえば台湾に天才少年がいて、Haskell で Perl6 のコンパイラ作ってましたよね。
いま Compiler 読んでるから、読了したら習作として Scheme で AWK コンパイラ書い
てみようかな。本当は Scheme で仮想マシンを実装して、中間コードで実行してみたい
んだけど Scheme の多倍長計算の機能はそのまま引き継げるかなぁ?多倍長計算をする
AWK なんてカッコよすぎる!
蟹御飯先生の AWK の実装も公開されてるし、いい C の復習にもなりそう。もしかして
自作の AWK とか実装した人いますか? >ALL
仕事で使うだけだから・・・
ツールを自作することまではしない
Perlという前例は存在するにしても、結局劣化コピーになるし
>どんな時
Perlの載っていないUNIX機でちょっと便利なスクリプトを書くとき。
ユーザーの俺が書いた30行足らずのスクリプトを理解できないベンダーSEってどうよ。
Emacsでログ追うのにカーソルキーしか使わないし。
シェルスクリプト書くのにcsh使うし。(すまん愚痴になった)
>ってどうよ
それがベンダーSEクオリティ
610 :
デフォルトの名無しさん:2005/06/05(日) 02:14:51
助けてくれぃ
あああ いいい ううう えええ おおお ・・・ んんん
ってログがあった場合に、「あ」と「い」を入れ替えて
いいい あああ ううう えええ おおお ・・・ んんん
としたいときにはawk使ってどうやります?
>「あ」と「い」を入れ替えて
思いつき
1.あ を 出てこなさそうな文字(ぱっと思いついたのが"^")にいったん置き換える
2.い を あ にする
3.先の文字を い にする
>610
もし明確に $1 と $2 だってわかってるなら
{printf("%s%s%s", $2,OFS,$1);
for(i=3; i<=NF; ++i) printf("%s%s",OFS, $i);}
613 :
AWK初心者:2005/07/14(木) 22:22:04
614 :
デフォルトの名無しさん:2005/07/14(木) 22:33:19
今ちょっと忙しいから、来週の水曜日まで待て。
>>613 それで? 「手伝って」とのことだが、自分ではどこまでこなしたのだね?
616 :
t: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;
}
句点「。」や ? !
で区切られていれば」文だから。
awk だけでやるのは結構難かしいような気がする。
3行目と4行目で一つの文章だから一行一文ではないし、
一単語の「たべもの」が「たべ」と「もの」に分割されていたり、
格助詞の「に」と「似る」の語幹の「に」を判別しなきゃならなかったり。
BEGIN{ OFS="。"; }
END{ print NR; }
742
RS
なのかも
問題の全てで「文」、「単語」、「句読点」を別個に定義すれば簡単だけどねw
621 :
613:2005/07/20(水) 11:49:54
課題いろいろとありがとうございました。
622 :
デフォルトの名無しさん:2005/07/22(金) 07:35:18
awk勉強しようと思うんですけど awk初心者から学べる本ってないですか?教えて下さい
>>622 書籍ではありませんが、
1991年4月1日
例題で学ぶ 簡易言語「AWK」
弘前大学 教育学部
教育実践研究指導センター
小山智史
が分かりやすいです。
どこかにあると思うので、探しましょう。
昔、アスキーのおまけディスクについていました。
>>624 >>625 その2冊は、
>awk勉強しようと思うんですけど awk初心者から学べる本ってないですか?教えて下さい
という人には難しすぎて向きません。
多分プログラミング初心者だと思われます。(cが使えるような人なら、自分でいくつかのawk script を検索して、使えるようにするから)
最初の言語がawk?
お勧め出来ない
やっぱ最初はsedだよな
630 :
デフォルトの名無しさん:2005/07/30(土) 22:02:26
配列を、添字のソートした順で処理するにはどうしたらいいでしょうか?
perlで書くとこんな感じの処理です。
for my $i (sort(keys(%hoge))){
print($i, %hoge{$i} . "\n");
}
awkには組み込みのソート機能がないので、
1.添え字を取り出して別の配列につっこむ
2.別途用意したソート関数で並び替える
3.本来の処理をする
という感じかな。
2の関数はquick sortでよければサンプルはそのへんに転がってるだろう。
「sortコマンドにパイプする」つうのは?
633 :
630:2005/07/31(日) 09:54:52
>>631 quicksortというのを初めて知りました。
awkのプログラムは見つけられませんでしたが、
他のソースを見て作ってみたいと思います。
>>632 出力するイメージ的には、↓のような表な感じですので、
表題までソートされてしまうとダメなんです。
表題
時刻 値
時刻 値
時刻 値
時刻 値
なのでawk内でソート処理をしたいんです。
とりあえず現状は表題をソートの一番上にくるような文字列にしてsortコマンドをかませていますが。。。
俺ならソート済みのデータをawkに食わせるけどね
あるいはsystemか
636 :
630: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やろうぜ!便利
gawkならいちおーasortとかasortiとかあるよ。
オレはそこまでややこしくなったらperl使うけどな。
カーニハン本、一行野郎集の短さにド肝を抜かれ、
2章も言語マニュアルなのに読んでてためになる筆運びに感心。
ですが例題集は2題くらいで頭がバーストして挫折してまする。
難解数学パズルを最短距離でさらっと解いてしまう
先生の知能指数の高さにため息が出ますわ。
馬鹿はUNIXに向いてないんでしょうね。べーしっ君に戻りますか
カーニハン先生も、
本として完成したものはさらっとしているが、
本を書いている段階では何度も試行錯誤して
間違いを見つけては直し、思い直しては書き換え、
という作業を繰り返した結果だと
「プログラミング作法」で書いてるから
それほど悲観するものではないと思われ
#「べーしっ君」。・・・年齢がばれるよ
>>641 微妙な下ネタもあって好きだったなぁ・・・
当時としてはかなりシュールだったし。
643 :
デフォルトの名無しさん:2005/08/03(水) 19:01:13
あるフィールド以降の文字列を取得するにはどうしたらいいでしょうか?
例えば以下のような文字列の場合、
A B C D E F G
(全角スペースで区切っていますが、本当は半角スペースです)
第4フィールド以降の文字列、
D E F G
を取得したいです。
>>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"}'
>>643 a=$0
sub(/^([^ ]+ +){3}/, "", a)
あたりですかね。正規表現に+や{3}が使えないawkのときは
適当に直してくれ。
区切りが空白1つに置き換わってよければ
$4~$NFを空白はさんでつなげるという手もある。
646 :
643:2005/08/03(水) 20:42:11
レスありがとうございます。
>>644 んー、それだと、
D E F G
になってしまいますよね。
フィールド間の区切文字は保持したいんです。
>>645 置換ですね。
それでちょっと試してみたいと思います。
>>633 表題はBEGIN{}の中でprintすりゃいいんじゃね?
>>647 表題はファイルを処理して生成されるので、BEGINの中ではprint出来ないんです。
まあgetlineでファイルを読めば出来るけど、それではファイルを2回読むことになって非効率的かなぁと。
>>648 表題が1行目に入っているなら、
NR==1{}
NR>1{}
で場合分けする
>>649 表題は、ファイル内の数値の統計結果が含まれますので、
ファイルを全て読まなければいけません。
じゃあ表題以外の部分を全部溜め込んで
END{}で表題と表題以外の部分を全部出力すればいい
・・・いや
統計結果(表題)を求める機能と表題以外の部分を求める機能は別物だと考えれば、分けて作ってcatするのも手だな。
#こちらに話題がshiftするとスレ違いになってしまうかもw
652 :
630:2005/08/05(金) 23:29:04
>>651 >END{}で表題と表題以外の部分を全部出力すればいい
表題以外の部分はソートされないですよね?
>統計結果(表題)を求める機能と表題以外の部分を求める機能は別物だと考えれば、分けて作ってcatするのも手だな。
分けて作る方法も考えたのですが、以下の理由でやめました。
・同じファイルを2回読むのは非効率的?
・2回目読み込み前にファイルが更新された場合、表題と表で不整合が発生する?
>>652 データ処理して作っている表題は、具体的にどんなデータ?
それだけ、別の変数に入れておいて
データとは別に、最初に出力すれば良いだけではないかなぁ?
>>653 表題は、ファイル中に書かれた数値の「最大値と最小値」です。
>データとは別に、最初に出力すれば良いだけではないかなぁ?
↓のような感じですか?これだと表部分がソートされないので困っています。
かと言って、この出力をsortに渡したら表題もソートされてしまいます。
END{
print(hyoudai) #表題出力
for(i in data){ #表出力
print(i, data[i])
}
}
『プログラミング言語awk』7章1節じゃダメな理由は?
表題と表部分をheadとtailで切り分けて表部分だけsortして
表題の後ろにくっつければ?
>>655 その本は読んでないのでわからないです。
>>656 なるほど。「2行目以降をソートする」ということですね。
>headとtailで切り分けて
awkの出力結果を、変数かファイルに保存して、表題と表部分を抜き出すということですよね。
なるべく変数やファイルを使わないでワンライナーで実現したいのですが方法はないでしょうか。
>>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])
}
}
>>657 「実現できれば良い」なのか「シンプルな解が欲しい」なのかがはっきりしていない罠
前者ならもう答えは出ているし、
後者ならその答えは「教えられて得るべき種類の答え」ではないと思うが
ようするに、ソートして表題が上、表が下ならいいんじゃねの?
HEAD 表題
TABLE 表
:
って最初のEND部で出力して | sort | awk '{ 2番目のフィールド以降を表示 }'
>643
ふつう index()とsubstr() つかわねーか?
>657
これでええのんか?
{ data[n++]=$0; }
END{
print "1行目は表題ね";
for(i in data) print data[i] | "sort";
}
>>658 バブルソートという方法でソート出来るんですね。
クイックソート、バブルソートと試してみます。
>>659 「実現できれば良い」は自己解決していました。
しかし自分の知らない他の案もあるのかな、と思い書き込みました。
なぜ、「シンプルな解」は「教えられて得るべき種類の答え」ではないのでしょうか?
自分で考えてひらめいて発見することも大事ですが、教えてもらって得てもいいと思います。
>>660 今はその方法を使っています。
HEAD,TABLEではなく、1,2といった番号ですが。
口開けて餌を待ってる割には注文が多いな
>>663 バブルソートという「馬鹿ソート」さえ知らないことから考えて、
スクリプト内でソートする方法が知りたかったんだろうと思う。
data.sort
だけでソートできる他の言語を囓っていて、「awkにはないんかい?」と思うのは、まぁあり得るかなぁ。
>>664 すいません。。。
>>665 そうです。最初に質問した通り(
>>630)、awk内でソートする方法が知りたかったんです。
awkにソート関数がないのは知ってましたが、ソートしたい場合どう対応するのかなぁと。
ソートアルゴリズムはいろいろようですね。
自作ソート関数を作って対応します。一度作ればいろいろ使えそうですし。
とりあえずこの件は解決ということでお願いします。
ありがとうございました。
しまった、名無しになってしまった。
666=630です。
>666
>662 は読んだのか?
俺ならこう書くかな。かなりどんくさいけど
/^ *[^ ]+ +[^ ]+ +[^ ]+ +[^ ]/ {
match($0, /^ *[^ ]+ +[^ ]+ +[^ ]+ +/)
print substr($0, RLENGTH+1)
}
361 :デフォルトの名無しさん :03/08/31 21:33
3から全部なら...
substr($0, index($0,$3))
672 :
671:2005/08/08(月) 01:59:44
元のすれにもあるが、$4以降が欲しいとき、
$1~$3に$4と同じ文字列があると使えないけどな
673 :
630: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
}
}
}
}
674 :
630: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
}
675 :
630: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
>>630 エライ・・・というか。真面目な人ですね。面白かった。
#bsortが異様に速い気がするけど・・・まあデータに依存するしな
>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)
}
'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)
}
ARGV[1]=""
-v col=3
とすれば
>677
単純選択法はいちいち値を交換せず、比較だけしていくやつだ
よって>673のは違う(値を交換していくのでバブルソートになるのであろう)
>682
コマンドラインで指定されたファイル名が var=val という形式ならば、
それは変数への代入であると解釈されます。変数 var は値 val に設定されます
(これは、すべての BEGIN ブロックを実行したあとに行われます)。
コマンドラインでの変数の代入は、AWK が入力をフィールドやレコードに分割する
ためのセパレータを実行時に変更するのに便利です。また、1 つのデータファイル
に対し数回処理を行う必要がある場合、状態をコントロールするのにも便利です。
685 :
689:2005/08/15(月) 00:00:33
>681
レスありがとうございます。このやり方で解決しました。
>682
686 :
689:2005/08/15(月) 00:02:09
途中で送信してしまいました >685
>682
もともとその様にしてまして、col=3と打つのを3のみで
できないかなぁと思って質問しました。分かりにくくて
申し訳ありません。
shでラップすればスクリプトを変に複雑化しなくても済むよ
% ./average.sh 3 input
--- begin average.sh ---
#!/bin/sh
/bin/awk -f average.awk col=$1 $2
--- end average.sh ---
shってあんた
環境依存やん
689 :
687:2005/08/15(月) 18:25:24
プロンプトを % と表記するのは csh 系で、$ は bsh 系。
command.comとかcmd.exeの場合は > になる。
csh が使えるということは Linux か BSD系、あるいはSYSVR系に
自前で入れたとか、そんな感じだろう。
だから /bin/sh が使えるのは当たり前と考えた。
っつうかawkが使えて/bin/shが使えないケースってDOS環境くらいしか
思いつかないんだけど? cygwinだって当然使えるし。
>>689 dos or winのdos窓 環境でawkを使う人は多いと思うよ。
691 :
デフォルトの名無しさん:2005/08/15(月) 20:56:34
まあ、
>>687くらいならDOSでもバッチファイルで出来るということで。
693 :
687:2005/08/15(月) 21:13:49
たしかにどうでもよろしい話だ
690が食いついてこなければとうにお㍗る。
>>690 winのDOS窓環境でawkを使う場合、awkだけを単体でインストールする人は
少ない。っていうかAWK.EXEだけを配布しているサイトなんてアリエナイ。
たいていはcygwinとか他のUnix like Toolsをインストールする。
そしてそういうツールにはsh.exeとかbash.exeとかが必ずセットでついて来る
これとsedとsortさえあれば大抵用が足りるので
Vectorでgawk単体で拾ってきて使ってる私は
アリエナイ人なんですね…
>>694 テキスト処理用のunix like tools が必要なだけで、unix環境までは要らんぞ とか、win環境が必要でその上でちゃっちゃとテキスト処理したいぞという人はアリエールと思うよ。
それとも、unix使ったら偉いとか?
awkだけ使えれば構わない人
と
cygwinまで必要な人
の人数なら前者が圧倒的に多そう
そもそも
cygwin入れた人
で
cygwinでのawkが必要な人
ってほとんどいないんじゃねの?
unix系ではシェルと組み合わせて使うのがあたりまえ。
コーラを飲んだらゲップするくらいに。
まあawkだけで済む人はawkだけを使うということで
701 :
687: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
なにそれ?
ウィンドウライブラリみたいな名前だな
706 :
デフォルトの名無しさん:2005/10/05(水) 02:23:06
いいんじゃない?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
--ここまで--
すいません、よろしくお願いします。
awk=N88BASIC
perl=VB.NET
>>708 /^Id/ { id = $2 }
/^State/ && $2=="FAILED" { print id }
# 但し、入力データの各欄の順序が固定されているものと仮定
&& ($2 ~ /^FAILED/)
の方がよくね?完全一致よりも
>>711 そしたら
FAILEDhoge
でもマッチングしちゃうからダメじゃない?
・・・FSの設定が必要では?
>>708の処理をするだけなら空白区切りのままでも問題ないでしょ。
全ての項目を見にいくのなら
BEGIN{ FS = ": "}
とでもするか、項目ごとに$nを適切に合わせるかすればいいんじゃない?
vector から、gawk 3.1.5 for Windows (gawk (GNU awk) 3.1.5 の Windows版) をダウンしました。
gawk '{ print }' file.txt
の所でエラーになります。
gawk "{ print }" file.txt
これは問題なし。何が悪いのでしょうか。(Windows2000 コマンドプロンプトです)
>>715 訂正
の所でエラーになります。
↓
' の所でエラーになります。
Windowsのコマンドプロンプトでは '' は使えない。仕様。
readmeかなんかに書いてあった希ガス
jgawkなら ' 使えた希ガス
720 :
715:2005/11/08(火) 22:34:06
721 :
デフォルトの名無しさん:2005/11/10(木) 01:22:59
>>720 そんなにシングルクォートが好きなのか・・・
gensub() があるから gawk2 には戻りたくないなぁ。
>>720 それって、cmd.exe の問題では?
本来 shell のやるべき仕事を全て gawk.exe で抱え込むのは
どうかと思うけどね。
元々cmd.exeは * の展開もやってくれないから
dos版 bash.exe とか tcsh.exe とかは無いんですか?
sh.exeならどこかで見かけた希ガス
GNU utilities for Win32 辺りでググって見れ
いや、ワスはMS-Windowsを持ってないから要らんのですが。
元記事の人が「'」を使いたいならと思って。
gnuwin32 は確かに便利だな
cygwin みたいには遅くないし
結構ツール揃ってるし
複数行がひとつのレコードの場合に、それを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;
}
}
って作った。もっと簡単にできる?
{ 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
}
}
>>730 レコードたって、空白行が区切りとかじゃなく、単に(区切りなしの)3行ごと?
元データの構造がダサすぎて 所詮 awk向きでもないのでエレガントには
書けないのでは。(3行ごとに1行にまとめる、と考えると sedでも可?)
>>730 NR%3{printf($0)}
!(NR%3){print}
>>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
>>734 確かに。ご指摘ありがとう。
じゃあこれで↓
NR%3{printf("%s", $0)}
!(NR%3){print}
3項演算子で済みそうな。
{printf("%s", NR % 3 ? $0 : $0 "\n")}
とか。
でも、文末に\nがあったり無かったりがいやんな感じ。
>>731 変数が増えれば、直感的に理解しにくくなる。
NRが何のためにあるか、理解しよう。
>>736 awkで3項演算子使えるのか。勉強になった。
>>739 あれ、3項演算子って言うのか。勉強になった。
741 :
デフォルトの名無しさん:2005/11/25(金) 03:30:28
age
いろいろありがとうございます。勉強になりました。
さっそく、試してみます。
余談ですが、自分は、20代後半のSEですが、最近の新人は、
AWKを使わないですよね。
いかに自分が楽できるか考えないのかな?
という自分は、sedは置換でしかつかいませんが・・・。
AWKにて、XMLみたいなタグの構造を読む時は、
みなさんはどう書きます。通常、
/<A>/,/<\/A>/{
print;
}
で<A></A>内のデータは抽出できると思いますが、
入れ子になっていた場合、つまり、
<A><B><C></C></B></A>
こんなときって、
/<A>/,/<\/A>/{/<B>/,/<\/B>/{/<C>/,/<\/C>/{print}}}
はできないですよね。
awk の length() って、文字列の長さだと思ってある
プログラム作ってたら length("abcd\0efgh") = 4 に
なるんだけど、これは正しいの?
また、f("abcd\0efgh") = 9 を求める方法はあるので
しょうか?
環境は...
> gawk.exe --version
GNU Awk 3.1.5
です。
わからんが手元のawkでは9になるようだ。
% awk 'END{print length("abcd\0efgh")}' </dev/null
9
% awk --version
GNU Awk 3.1.4
(以下略)
>>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.
とあったので、どうもこのあたりで仕様が変わってしまっ
たみたいですね。
>>744,746
ソース確認したけどバグだね。
報告しる。
>>747 XMLgawkですよね。
それを入れることができない環境では、nawkとかしかつかえないんだけど。
awk でやらなきゃいかんの?
他のスクリプト言語ならいろいろライブラリあるじゃん。
>>750 Solaris8のデフォルト環境でやろうと考えています。
perl等は最初からはいっていますが、デフォルトバージョンで
XMLのライブラリが使えるか心配。
>>752 試した。
新しいので試してみた。
ぐっじょぶ!
>>743 とりあえず、xmlgawk でできますね。
XMLSTARTELEM 使えば node 単位でも depth でも検索できます。
>>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
xmlgawkってSAX風に書くのか。xpath風かと勝手に思っていた。
xmlgawkについて、特に明記がな場合、本文中では
eXtensible Markup Language, GNU Not UNIX, Alfred V. Aho, Peter J. Weinberger Brian W. Kernighan
とします。
759 :
デフォルトの名無しさん:2005/12/17(土) 10:59:13
gawkはガウォークって読んじゃうよな
そもそもawkは「ウォーク」が正しいのか?
オレはつい「オーク」と呼んでしまうんだが。
>>760 auk と同じ音、「おーく」でいいんでないかい?
本の表紙にわざわざ使ってるくらいだし。
>>761 オークってこんなのだっけ?
_,ィヽ∧人从人)ヽ,、
_チ;;:.. ..;;:... ヽ ヽ、从人乂人∧人/ヽハ
`ヽ、;;::.. ヽ ..;;:... i i , )ハ `)
,彡;;::.. 一 、 \ヽ ソノノノノ/ ノ _ノ
`フ;;::::.. ..;;:.../;;;::.. ::.. .:)i( ... ヽミ ヽ `ヽ うぉ!うぉ!うぉ!うぉ!
_彡;;::::.. / /;;::..... _,ノ' 'ヽ、_ |ヽ ゝ <
`フ;;:.. ,イ /;;::....::《;・,,;》,:: .《・,;》 ソ _ノ
ノ;;:::.. 川レ';;::.. ..::.. ⌒ )::・_・),、^ヽノ `⌒ヽ、r'VWY`vw'YVwY
~フ;;::..ノノ;;;::.. ..::..┃イトョヨョョイ.}┃l
ノ;;::.. ノ;;;;;::.. ..::..┃l | |.l|┃l
, - ''"´イ ヘ ヽ;;;::.. ..::..┃!.l-t-、 |,!┃ノ`-、 ニシャーーーッ
;;;;;;;;:::::::::::::::::\ヽ、;;::....┗ヽニニソ┛/i| `ヽ,
;;;::::::::::::::::::::::::::::::ヽ、;;;;ー─--一',;' ! ヽ
763 :
デフォルトの名無しさん:2005/12/17(土) 19:42:31
ど素人ですまんが awkの守備範囲ってどの辺り?
ファーストからセカンドへの3メートルくらい
>>763 テキストの定型データ処理で
「まともにプログラム組むよりawkででっち上げた方が早そうだ」
と思える様なもの辺り。
>>763 >テキストの定型データ処理で
sedで正規表現を使ってスクリプトを組むと、しんどいなぁという範囲。
>>763 Perl, Ruby がなくって、実行環境が Solaris なのに開発環境がドサーな範囲。
皆、悲観的な表現は控えるんだ
素人へは前衛的な表現で、この際嘘とかどうとか問題外だ
前衛的な表現て…
ruby分子は革命の敵とか、
perl独占資本を倒せとか言うんかいな。
770 :
デフォルトの名無しさん:2005/12/31(土) 20:20:02
awkにはそのファイルの総行数を表す変数はないのでしょうか?
あるファイルの上から60%だけ取り出して出力したいのですが...
現在はwcで数え上げていちいち行数を打ち込んでいる状況です
>>770 NR
{
d[NR]=$0;
}
END{
e=int(NR*0.6);
for(i=1;i<=e;i++){
print d[i];
}
}
awk 'BEGIN{srand()}{print $(int(rand()*101)%NF+1)}' <<-EOF
大吉 中吉 小吉 吉
EOF
新年早々くだらなくてすまん。
えいっ
あ、まちがえた。
そのファイルの行数ならFNRじゃ?
まあ対象のファイルが一つなら
一緒だけど
>771
っつーか、ファイル全部メモリに記憶すんなよ(w
BEGIN部で行数数えろ
BEGIN部?どのawkでそんな事が可能なの?
メモリ格納が無理なら、wcで行数数えてそれをスクリプトに渡して、
NR/FNRと比べれば良いだけの話では?
>>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];
}
}
が分かりやすいと思うが。
781 :
770:2006/01/03(火) 23:49:31
質問したものですが配列に読み込めるサイズってどれくらいなのでしょうか?
一応wcでカウントしてやったものと
>>771で教えてもらったものをdiffしても違いはなかったのですが。
>>781 たくさん、というか実装に依ったと思う。
最近の物なら(仮想)メモリが十分にあればよほどでかいファイルを読ませない限り
問題ないと思う。
# ↓256本に載ってた物を手直ししたテストプログラム
BEGIN {
for (i=0; i<1024; ++i) { kilo = kilo " " }
i = 0
while (1) {
print ++i
s[i] = "" kilo
}
}
昔、先行して舐めるプロフラムは作ったなぁ。
BEGIN {
while(getline<ARGV[1]>0) {nr++;}
close(ARGV[1]); #忘れないように
while(getline<ARGV[1]>0) {
i++;
if (i>=nr*0.6){exit;}
}
}
784 :
770:2006/01/05(木) 13:24:24
もう一つ質問なのですがawkの関数で絶対値はないのでしょうか?
今は値を二乗してルートとってるのですが
# 絶対値を返すユーザー定義関数
function abs(x) {return (x < 0) ? -x : x}
>>785 返事が遅れましたがありがとうございました
787 :
tk&ybh:2006/01/12(木) 11:22:57
学校でこんなことをやれと言われたのですが、まったくわからないので、ご親切な方、解答方法やヒントの教授をお願いします。
日付と予定事項と実行計画事項を入力データとする週間予定表の生成プログラムを作成せよ.但し,
・プログラムはawkスクリプトとし,ファイル名をmyplan.awkとする.
・入力データファイルはmyplan.dataとし,これにはデータだけを含み,各フィールドはコロンで分離する.
・予定表を生成するためのフォームを用意する,これをmyplan.formとする(英語表現,ローマ字表現)
(ただし,先頭の行に学生番号,氏名の欄,末尾にmemo欄(実行計画記入)を入れる.すべて英数文字)
・生成した予定表は標準出力で確認すると同時にmyplan.txtにも出力する
・アクセス権の変更:chmod 644 myplan.txt
・確定した週間予定表myplan.txtを.planにコピーする(かな漢字のかわりに英語表現,ローマ字表現使用)
宿題まる投げですか。いい度胸ですね。
789 :
tk&ybh:2006/01/12(木) 12:47:57
その度胸を称えて教えてくださりませんか??(-_-;
で? いくら出すんだい?
これといってネタもないみたいだしヒントだけならいいんじゃないか?
まずは myplan.data, myplan.form, myplan.txt の例を作ってみな
792 :
デフォルトの名無しさん:2006/01/15(日) 19:22:38
test01~test40までのファイルを順番に読み込みたいのですがどのようにしたらいいでしょうか?
forとsprintfとでファイル名を生成
$ awk -f hoge test??
では駄目なんすか?
順番に
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
}'
というソースです
BEGIN部とかEND部でfor(i=1;i<=40;i++) x=sprintf("test%02d",i)
>>796 何がしたいのかイマイチ見えないが、
{
print $NF, FILENAME;
}
ではダメなん?
順番は bash で順番に読み込まれるのでは?
ダメなら後から sort でもいいのでは?
>>796 #!/bin/sh
for i in `seq -w 1 40`; do tail -n 1 test$i | awk '{ print $NF; }'; done > /dev/null
>797
後、getlineな
エイホ・ワインバーグ・クヌースw
802 :
デフォルトの名無しさん:2006/02/05(日) 08:08:50
awkの読み方とその一般目的についてサラッとおせーて
オーク。
主にホワイトスペースなどでフィールドに分かれているテキストデータに
対して何らかの処理を加えるフィルタを書くのに向いている。
最も基本的な構文は以下の通り。
BEGIN {
スクリプトの開始時に実行される
}
/パターン/ {
処理
}
/パターン/ {
処理
}
END {
スクリプトの終了時に実行される
}
ここには通常の言語で書かれる open や while などの構文が出てこないが、
この状態で
$ awk -f スクリプトファイル名 データファイル名
と実行すれば自動的にデータファイルを開き、順番に読み込み、
各行に対して /パターン/ にマッチしたら処理を加える、という動作を行う。
BEGIN, END は特殊で、これはスクリプトの開始時と終了時にしか実行されない。
知ってると得するっていうか、まず知っとけっつー機能は
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 が何なのか、把握しておくこと。
あ、話を単純にするため 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情報の文字列が現れたら、それ以降の行を別のファイルとすれば
よいかと考えたのですがどのようにすればよいのかわかりません。
どなたかご教授の程お願い致します。
これ以降は BBBB情報とはっきり分かるパターンがあったらそれの
出現をフラグにする
フラグが立ってなかったらファイルAへ出力
フラグが立ってたらファイルBへ出力
>>804[4]
gawkではローカルなの?
function f(a,b,c) { d = 0 }
ここでのa,b,cはローカルだけど、dはグローバルだと思ったんだけど。
>> 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}
>> 804
function f(a,b,c) で引数に書かれていないパラメータは基本的にグローバルでい
いんでは ?
故意に内部だけで使うのであれば、タブで区切って f(a,b,c,d) と書けば内部だけ
のローカル。(タブである必要はないけどお約束みたいなもの)
ということでなかったっけ?
タブ消されるのか…orz
c,d の間に TAB ね。
812 :
802:2006/02/06(月) 04:37:25
>>803 あり^^
vimとか多機能エディタのスクリプトで代用できそうな感じがするんですが、
浅はか?
いちいちvimを動かしたくないとき使う。
>>812 別にいいんじゃないの
vim が入っている環境なら
815 :
デフォルトの名無しさん:2006/02/06(月) 09:18:19
awkは深いですか?
816 :
804:2006/02/06(月) 09:37:58
間違いました。
みなさんご指摘の通りですた。ちょっと他のとごっちゃになってますた。
ローカル変数にしたい場合
function abc( foo, bar, [間あけて] baz, foobar ) {
}
みたいに書くのが常套手段でした。
>>815 深くはないけど、浅くもない。
限られた命令の中で遊ぶのも悪くないし。
良いボケ防止だよ。
818 :
デフォルトの名無しさん:2006/02/07(火) 05:48:07
確かオライリーから書籍でてましたよね。
個人的にはそれだけでも無視できない存在に見えてきます。
まぁ使えりゃ便利だよ
Perl とか使いこなしてるなら改めてやる必要はないような気もするけど
820 :
デフォルトの名無しさん:2006/02/07(火) 09:12:18
awk自体を造るのは大変ですか?
大変かどうか判らない人が造るのは大変だと思う。
>>818 とりあえず、オライリーからは 3 冊かな。
「sed & awk デスクトップリファレンス」
「sed & awkプログラミング」
「Effective Awk Programming」
最後は英語のみ。
個人的には、「プログラミング言語 AWK」がベストかな。
オライリーじゃないけど。
>>820 確か awk のオリジナルソースは全部で 700 行じゃなかったっけ?
とどこかで見た記憶がある。
今や gawk は gzip しても 2 MB のコード。
蟹飯大先生のページにソースがあったような気がする
>>820 yacc, lex (または bison, flex) を使うのならそんなに苦労しないと思う。
ただ最新版の gawk などと同一のものを作ろうとすると非常に面倒だと思う。
学習のために作ってみたいという場合は必要最小限の機能をまず作り、
それをちょっとづつ拡張していけばいいんじゃないだろうか。
>>823 awkの最初のバージョンではユーザー関数すら定義できなかったから。
それでLispインタプリタ(walk)を実装した剛の者がいたそうだが。
以前、jgawk 1.3か1.5あたりのを、bison、flexの勉強がてら読んでみたなあ。ほどほどの規模なので勉強になった。
828 :
デフォルトの名無しさん:2006/02/08(水) 21:49:27
初めて作ったCGIはAWKで組んだ。
Perlは知らなかったし。
質問です.
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]
}
これでうまくいかないのですがどこが間違っているのでしょう?
>>833 ファイルが/tmp/a /tmp/bだとしてこんな感じじゃダメかい?(bの方が行数多い場合には無視)
awk '{a=$1;if(getline < "/tmp/b"){print a-b}else{print "a only!"};}' /tmp/a
print a-bじゃなくてprint a-$1だなw
即興なんでかんべん
やりたいのは
file1: 7, 2, 3, ...
file2: 3, 2, 6, ...
を処理したら 4, 0, -3 になる処理のように読めるんだけど
>>836 >>833 に、
> 1000行程度の
> 1列目だけ
って書いてあるから、
file1:
7
2
3
...
file2:
3
2
6
...
だと思うが。
勝手な書式に変更して悪かった。
俺が言いたいのは、行ごとの差を取るという主題を
俺が勘違いしてるかもってことなんだ
具体的に言うと a[$1] = $0 っていう代入文からみて
何か別の処理がしたいんじゃないかと
839 :
833:2006/02/12(日) 16:59:58
>>834 それで,うまくいきました.
このプログラムは非常にシンプルなんで覚えておくことにします
ありがとうございます
>>836 わかりにくくてすいませんでした
>>837さんの言うとおりの形です
みなさんありがとうございました
>>834 漏れにはそれ以上短く記述できないw
何はともあれawkの面目躍如といったとこだな
まあなんだ、俺の中ではここ名スレ
awk もすっかりマイナーになったからな
>>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]];
}
}
本当の問題解決のために答えるならいいけど
ただの突っ込みレスはいらなくね?
どうせ過疎スレなんだし、あんまり気にしなくてもいいんじゃないの
季節は春。
風のない天気のよい日には
枝葉末節にこそ拘るのも
趣があって実によいものだ。
awkで作ったYAMLのパーサってどこかにない?
848 :
デフォルトの名無しさん:2006/02/18(土) 10:28:57
>>833 paste コマンドが使えるなら、
$paste file1 file2 |awk '{print $1-$2}'
が、頭使わなくてラクじゃね?
gawk 'ARGIND==1{a[NR]=$1};ARGIND==2{print a[FNR]-$1}' file_a file_b
では、いかがですか?
いったん、配列に格納するのでメモリ食いますけど。
こういうところが弱いのがawkだが、それがawkクオリティ。
頭でカバー。
>>850 頭でカバーというより、awkはUNIXのtext utilityの一部として
設計されたコマンドだから、
>>848が正解だと思う。
結果を出すのが目的なんだから正解の一つってことだろな
そうだね。
隣家に行くのにアルゼンチンを経由するのも、まあ正解の一つだ。
屁理屈の好きな奴がいるね
現実的かどうかってのは無関係かよ
そんな考え方だけじゃ人生の半分損してるようなものだよ
いろいろ試して、自分なりに結果を見付けて何が最適だったかを探していけば
いいんでないのかな。
確かに 848 が良いというのは分かる。ただし、全て正解であるのも間違いは
ない。
質問を出した人が自分で納得できる解を求めてくれれば良いんでない。
そういう遊べる言語でもあるのが awk の良いところでもあると思っている。
>>856 並立要素を欠いた朧化の「も」を使いすぎ。
意見を述べるときは、断定しよう。
>>857 ま、
>>856の妄言はどうでもいいんだが。
並立要素は省略されているだけで、朧化でなかんべ。
補完できないチミの問題。
859 :
デフォルトの名無しさん:2006/03/14(火) 17:20:34
windows XP上でUTF-16LEを扱えるawkってある?
excelでunicodeテキストで出力したファイルを処理したいんだけど...
どうしても unicode のままじゃないとダメなのか?
windows にも nkf あるぞ?
【積年の】旦那にしてる密かな仕返し【恨みじゃー】
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は調べてみます。
>>862 nkf を出したのは utf-16 にも対応してて文字コードの
変換ができるよってだけなので、変換で失われるものが
あるなら使えないです。
ただ utf-8 でいいなら最近の LL ならなんでもイケると思うよ。
nkf で utf-16 -> utf-8 変換してから作業するのが現実的
かなぁ。
utf に awk で対応できたかどうかは分かんない。3.1.x は
国際化のフレームが変わったので対応できるのかも。やって
みたことないけど。自分がやるなら Perl とか Ruby とか
使っちゃうと思う。
あーごめん
Lightweight Language
いわゆるスクリプト言語全般を最近はこう呼ぶらしい
へえ。
スクリプトは重たいけどheavy weightじゃないんだ
C, Java より軽けりゃ皆 LL。
Perl 6 でも LL だもんなぁ。(w
awk は昔はあんなに重かったのに。ましてや perl をや。
>>868 メモリがキロバイトの時は、大きめのファイルを配列に読み込ませるときにうまくいかなかったことがあったが、
今では、たいていのファイルをオンメモリで処理できる。いい時代や。
>>869 DOS の話?
32bit だったら djgpp でコンパイルしたやつで壁は
突破できたけどね。まー確かに今の方がずっと楽だ。
>>870 いや、UNIXに仮想記憶が実装される前の頃の話だろ。
majisuka
そんな古の時代なんか知らねっす
>>869 "KB" は「キロバイト」じゃなくて「キビバイト」だよ。
Kibi Byte なら"KiB"じゃないか?
KiDは桃太郎が配ってる
TextSS のWindowsXP(Professional)64bit化おながいします
もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
蟹は蟹でも日本海の
なんの誤爆だろう
Aho、Weinberger、蟹はん
GnuWin32をインストールしてみたけど、インストールされたファイルはネットワークインストーラ
みたいで、それを使って別途インストールしないといけない、でもdownload.batを実行すると
エラーになる、どうやったらインストールできるんだろか
GnuWin32とCygwinの違いってbashターミナルで実行するかコマンドプロンプトで実行するかの違い?
883 :
881:2006/03/32(土) 01:31:49
誰か教えてください。
aa,bb,,cc,dd
の時、3番目はNULLですが、awkでどうやったら処理できるか分かりません。
どうやっても$3にccが入ってしまいます。
どうやったらNULLになりますか?
>>886 どういう環境で?
FreeBSDでも、gawk 3.1.5でも、BusyBoxでも$3は空列になるが
888 :
886:2006/05/15(月) 08:41:27
まじですか?
正確にはFSが¥tなんですが見にくいのでカンマに変えて書いてます。
win2000 gawk でやって
FS = "\t" でも FS = "\t$" でも駄目なんです。
正確に書かなかったので解が得られなかったという良い見本ですね。
890 :
886:2006/05/15(月) 09:43:26
ごめんよ~。
許してくれ。
cygwinのGNU Awk 3.1.5 だと問題ないです
ちゃんとNULL
892 :
886:2006/05/16(火) 20:33:15
vectorのを3種類落としてみたけどぜんぶ¥tの処理がおかしい。
win側のバグ?
でも cygwinでは動くという人もいるみたいだし。
何をしたか正確に書かないと答えは永遠に得られないだろう
俺の環境でも問題ないな(WinXP,gawk3.0.6+1.15,gawk3.1.5,awk95で確認)
下のスクリプトで試しただけだが
BEGIN{FS="\t"}
$3 == "" {print "null"}
すんまそん。
テキストファイル(aaa.txt)に
ls,pwd,…
といった感じでコマンドを書いておいて
それを読み込んでじゅんぐりに実行するっては
どうやって書けばよろしいですか??
初心者ですんません…
>>895 BEGIN {FS=","}
{ for(i=1; i<=NF; i++) system($i) }
IFS=,
for i in `cat aaa.txt`
do
eval $i
done
てゆーか、1レコード1コマンド(1フィールド1コマンドでなく)のaaa.txtにして、shに食わせるのが一番正しい気がする。
>>896 >>897 ありがとうございます!!
非常に参考になりました!!!!
あともう一つですが
変数を$の後の数値として使うことってできるのでしょうか?
たとえば、
for(i=1; i<=5; i++) このようなループをして
引数を順番に出力するとして
echo $($i)
みたいな使い方です。
説明が悪くて申し訳ございません。
そもそもこんなやり方しなければいいとは思ってるのですが…
すいませんです。
$iでできるんじゃね?
iが2なら2番目のフィールドの値だし
$$iとかだとiが2の場合に2番目のフィールドの数値の示すフィールドの値になると思われ
901 :
デフォルトの名無しさん:2006/05/29(月) 14:33:36
便利な一行野郎
意外なスクリプトって何ぞないかな。
こんなことをawkでやる意味があるのか?というような。例えば、
$ awk -f date.awk
Sat Jun 17 06:06:03 JST 2006
とか。
#!/bin/gawk -f
# cat.awk
{ print }
>> 902
BEGIN {
print strftime( "%a %b %d %T %Z %Y" );
}
ということ?
あ、いや、date.awkの内容を教えて欲しいと
>>902を書いた訳でない。
たまたまdateの出力があったので、例としてコピペしただけ。ls.awkでもdu.awkでも、こんなことフツーはawkでやらんだろというものなら何でも良かったんだ。
主旨としては、
>>903みたいのを見てニヤニヤしたいだけ。
dosで作成されたテキストファイルをunixに持ってくるときに、
ファイル末尾に改行が無いことが良くあり、
printは必ず行末に改行を付加するという仕様を利用して、
本当に
>>903みたいなのを使いましたけどw
awkは書かねぇ、たった一行。
>>907 いまさら、そんなことを発言する意味があるのかい?
おそらくそんなawkは無いでしょうね
>>898 今さらおれもそういう使い方がしたいと思った。
結論から言うと split して配列作れば確実
文字列aaa.bbb.ccc.ddd.txtのうち
aaa.bbb.ccc.dddの部分を取得したいのですが
どのようにしたら取得できるでしょうか?
文字列がaaa.txtのときは
awk -F. '{ print $(NF-1) }'
でOKだったのですが、上記の文字列の場合はダメだということが分かりました。
ご教授お願いします。
awk -F. 'BEGIN{OFS=FS}{NF--;print}'
awk '{sub(/\.txt$/, "");print}'
とか。
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 しか
ないかも知れませんが・・・。
> 複数のプロセスから同時に実行
しなけりゃいいじゃん
917 :
デフォルトの名無しさん:2006/08/18(金) 05:27:04
それが出来れば苦労はないんですがねー。
上位(呼び出し側)が言うこと聞かないもんで。
awkから、
変数をsedでフィルタリングして再代入したいんだけど
一番簡単なやりかたはどんなんかな?
function sed(cmd, str, ret)
{
"echo '" str "' | sed '" cmd "'" | getline ret
return ret
}
結局こうした
なぜ sed 。
gsubより使いやすいと感じるアル。
gawkで幾つまでのフィールドを扱えるかを知りたい。
info には載ってないみたいだ。
923 :
デフォルトの名無しさん:2006/10/28(土) 03:02:26
>>922 LIMITATIONS ってファイルがあるからそれ覗いてみ。
ちなみに
# of fields in a record: MAX_LONG
となっている。
>>271 ProFTPDとかに変えれば素でいろいろ出来るよ
レスしてるのは3年前のやつですよ。
まあでも、こういうところが不適当な回答で締め切られることも多い
教えてgooよりいいと思った。
このスレ、4年前からあるのか・・・
931 :
デフォルトの名無しさん:2006/11/14(火) 21:55:29
そろそろ新しいスレ立てた方がいいんじゃないか?
次すれは975に達したあたりでいいのでは。
レスしてるのは4年前のやつですよ。
まあでも、こういうところが不適当な回答で締め切られることも多い
教えてgooよりいいと思った。
このスレ、4年前からあるのか・・・
少し教えてください。
5年ぶりにAWkを使うことがありました。
古いスクリプトを走らせると
正規表現の[一-九] がうまく作動しません。
つまりカッコ内のひとつにマッチするのが
[ でエラーになります。
5年前はうごいていたのですが。
当時はdosだったから?
今みたいにサーバーにスクリプトを置いていないから?
誰か、気をつけるべきところは?
>>939 あんたの使っているawkが何者か調べる。
awk gawk jawk
まあDOSで使っていたというんなら、それはまず間違いなく jgawkかgawk+mbだろうな。
今どんな環境で使ってるかくらい書いてね
>>939
939です。
報告が遅れてすみません。
ベクターから落とした gawk 3.1.5 for Windows
です。
939です。
osはwin2000です。
>>933 おまい、ドキュメントに目を通してるか?
内部的な話になりますが、マルチバイト文字はワイドキャラクタに変換して
から処理されています。このため、正規表現で[亜-熙]のように漢字の範囲指
定を行っても期待通りの動作はしません。
とあるぞ。
>>945 939です。
ということは、JGAWKをdosプロンプトで動かすというのが
簡明な方法でしょうか?
>>946 32bit版Windows用のjgawkってのはないので、cmd.exeのコンソールから起動しても
自動的にcommand.comが立ち上がるってのを我慢できるのなら、
それでいいんじゃないか?
ところで[一-九]って正規表現なんだが、これって漢数字の一から九を引っ掛けたいの?
一 88EA
二 93F1
三 8E4F
四 8E6C
五 8CDC
六 985A
七 8EB5
八 94AA
九 8BE3
なんで、範囲指定に納まってないやつがあるんだが。
わろす
一-九程度なら[一二三四五六七八九]にすればいいんじゃね?
947さんありがとうございます。
949さん 参考になります。
しかし、winで動かすというのもしんどいですね。
winに限らないだろ
っていうか数年前のレスでみたデジャヴ?
ところで今インターネット上で手に入るawkの実装ってどのくらいあるんだろ?
awk '/ぬるぽ/{print "ガッ"}'
>>952 多分両手の指で数えても指のほうが余るくらいだろう。
gawk, mawk, one true awk, QTawk, Open Solarisのawk
あとまだあったかな?
でもまあそんなにawkはないな
>>956 あほか。
わからんこと
かきやがって。
つーかawkのkの人は未だにawk公開してんだな
本人作のawkの最終更新がApril 24, 2005ってのが驚きだ
>959
Aはエじゃないのか?
英語だとエイホだけど本人の出身地的にはアーホらしい。
というかそこまで考えずローマ字で考えてたんだが。
962 :
957: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
965 :
964:2007/02/18(日) 19:25:20
BEGINがおかしい・・・
訂正
BEGIN { hoge = sprintf("%s%s","abc",ARGV[1]); ARGV[1]="" }
>>963 パラメータは同じで:
$1 ~ "^abc"sh{
print $0
}
* シングルクォートは、awk では引用符として使えない
* 文字列連結は定数・変数を順にならべるだけ
ようするに、 引数ってのは原則としてファイル名として取り扱われるわけで。
"var=ファイル名"みたいな形もとれるが、
プログラム中でvarがファイルとして読み込まれる場合にのみ正常に動作する。
ファイルとして取り扱われたくなければBEGIN中でARGVを利用し、
ファイル名として扱われるのを防ぐために ARGV[1] = "" などとしておく。
俺はしばらくAwkいじってなかったから腕がナマクラになってるな・・・
BEGINのところは
BEGIN { x = "^abc" ARGV[1]; ARGV[1]="" }
と、シンプルに書くべき。
俺は何で無理にsprintf()なんて使ったんだろう・・・
>>966 今のAWKは引数がファイル名扱いにならんのか・・・
俺もロートルだな。
969 :
デフォルトの名無しさん:2007/02/18(日) 22:17:34
awkってどうしてこんなに流行らないの?
Perlより機能は少ないけどテキスト処理に関しては必要充分でしょ。
もう少し見直されてもいいような気がするんだけど。
最近はスクリプト言語でもオブジェクト指向が常識になってるけど、
ごく小規模のスクリプト組むのに、クラスがどうとか継承がどうとか考えるのは時間の無駄だし。
本当に本当のエンドユーザー向け言語としてはawkみたいなシンプルな言語は最適だと思うんだけど。
PC98でPerlが重すぎたころはawkのほうがメジャーだったな
awkが流行らない理由。
・使える人は1行野郎なりその手のものをその場で作ってその場で捨てるから資料が充実しない。
・使えない人は既にあるものを探そうとするからawkを覚えるよりはPerl(など)のスクリプトを探す方を善しとする。
Excelみたいなスプレッドシートは行数制限があるから、ちょっとしたデータ解析にはawkは重宝するんだけどね。
Perlのほうが実装が優秀だからだよ。
awkをPerlに変換しただけで断然速くなる。
90年代前半にいたawk使いがあっと言う間にPerlに乗り換えていった。
「プログラミング作法」の比較ベンチでも完敗してたし、
Rob Pikeもshは過去の栄光だと言ってる。
Perlはawkのアンチテーゼとして産まれたから。
優秀なことが求められている項目については、
全て勝っていると思うけど。
自分はawkの方が好きなんだけどね。
実装方式の影響がでかいからなんとも言えんよ。
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とかなでしこのようなフリーの安直な言語使ってる。
会社には一応情報の専門職もいるんだが、
簡単な事は全部自分達でやっちゃうから、彼らの立場がなくなってる。
そう考えると、エンドユーザーズ言語(簡易言語)を広めれば
企業にとっては無駄な情報屋を雇わなくて済むから得になるわけだ。
目的が特化され機能が絞られており、非オブジェクト指向で、
なおかつ日常でよくやるような作業が簡単にできる言語には大いに存在価値がある。
素人をプログラミングから遠ざけ、情報屋が仕事に困らなくなるような言語ばかりが世にはびこるのは良くないことだ。
979 :
デフォルトの名無しさん:2007/02/22(木) 21:55:23
>>976 ムカツクこと言ってくれるねぇ。
本当の事を露骨に言うなよ。
オークって読むんだね。
awk95.exeをつかってる(シフトJISに対応してない)
カーニハンはオークって読むなといっていたような・・・
983 :
デフォルトの名無しさん:2007/02/23(金) 19:09:37
http://ja.wikipedia.org/wiki/AWK AWK の発音は "オーク" であるが、
これは日本語話者にとって不自然であるため、
“エー・ダブリュー・ケー”と発音する人がいる。
しかし AWK の教典こと『プログラミング言語AWK』の日本語版の序文では
制作者の一人であるブライアン・カーニハンは
決してそのような発音をしてはならないと主張している記載がある。
なお、この本の表紙に書かれているのは
オオウミガラス(GREAT AUK)でありその主張の強調でもある。
そろそろ次スレが欲しいな。
作者はオークと読んで欲しくないけど、
使ってる人はオークと読んでいる。
新スレキタ━━━━━━(゚∀゚)━━━━━━ !!!!!
>>986 「エーダブリューケー」と読むなという主張。
awkは語るまい。
オークでだめならawkのaだけを取ってアホでいいか?
カーニハンがダメだというのならkだけ取ってawでいいよaw
語尾につけるとかこいいよawwww
だからなんで逆に解釈するんだよ~(TT