|
Awkを練習しています。 目的; Data1というファイルに4ポイントの座標が書き込んであります。 c1 10 10 c2 20 20 c3 30 30 c4 40 40 この4ポイントを4x4=16個ある箱の一番左下とし、これを元に、残り15箱にはいる15x4=60ポイントの座標を求める。offset値はx=y=100とします。 コマンドラインで awk '{for (i=0;(i,4);i=i+1) print $1"-"i+1, $2+"100"*i, $3}' data1 > out1 で一番したの4箱ぶんをだし、 out1; c1-1 10 10 c1-2 110 10 c1-3 210 10 c1-4 310 10 c2-1 20 20 c2-2 120 20 c3-3 220 20 .......... awk' '{temp=substr($1, 1,4);for (i=0;(i,4);i=i+1) print temp, i+"1", $2, $3+"100"*i}' out1 > out2 out2 c1-1 1 10 10 c1-1 2 110 10 c1-1 3 210 10 c1-1 4 310 10 c1-2 1 10 110 c1-2 2 110 110 c1-2 3 210 110 .................. で全てを出す方法で目的は達成したのですが,それを一度で出したいと思い、下の様にしてみました。 "test.awk" {for (i=0;(i<4);i++) print ($1"-"i+"1", $2+"100"*i, $3) >> "out1"} close ("out1") {getline < "out1" temp=substr($1, 1,4);for (j=0;(ij,4);j=j+1) print temp, ij+"1", $2, $3+"100"*j} #awk -f test.awk < data1 > out3 しかし、data1のFNR=4の場合out3は16行まででとまってしまうので、わざわざdata1のFNRを64にしてし、全ての値をだしました。 まだよく理解できていないので、どうしてなのかがわかりません。ご指導 お願い致します。 |
|
>>1926 ふくし > *dick = \$richard; > だと $richard だけがエイリアシングされてしまう、 > というのがどうもよくわかりません。 dick という名前には、スカラー、配列、ハッシュ、関数 などがあり、それぞれ $dick、@dick、%dick、&dick として アクセス可能です。名前と実データのアドレスの間は、 シンボルテーブルにより対応づけられています。で、 *dick = *richard; は、それらシンボルテーブルを一括して書き換えるもので、一方 *dick = \$richard; は $richard 用シンボルテーブルだけを書き換えるもの、 と解釈してはどうでしょうか。 実際にそういう作りになっているかどうかはわかりません。 ところで、 $fuga='fuga'; local(*hoge) = *fuga; print "\$hoge=$hoge\n"; は OK でも、 @fuga=('a', 'b', 'c'); local(*hoge) = *fuga; print "\@hoge=@hoge\n"; とすると In string, @hoge now must be written as \@hoge なんですねぇ。美しくないなぁ。 >>1927 ミング うーむ、awk 以前に、ちょっと問題の意味が理解できません。 # でも、for (j=0;(ij,4);j=j+1) という書き方もわかんないなぁ。 ファイルに書き込んで close し、それを読み出す、ということを されたいのでしょうが、もっとよいアルゴリズムがあるんじゃないか とは思います。他の方、わかりますか? |
|
>>1447 nac ! で fold しているのは sendmail くんだそうで。 http://script.lovely.to/bbs/infolng.cgi?print+200104/01040037.txt |
|
はじめまして。XRDといいます。 ただいま、C言語でCGIを作成しようと勉強中の身です。 そこでインプレスより販売しているCGIブックを購入したのですが、 コンパイルがうまくいきませんでした。 ソース内容は以下の通りです。 http://home.impress.co.jp/books/ietech/cgi.code/7.2.html 動作環境:TurboLinux6 tmp/ccuVjNj9.o: In function `main': /tmp/ccuVjNj9.o(.text+0x10b): undefined reference to `splitword' /tmp/ccuVjNj9.o(.text+0x122): undefined reference to `unescape_url' /tmp/ccuVjNj9.o(.text+0x14a): undefined reference to `splitword' /tmp/ccuVjNj9.o: In function `GetUserID': /tmp/ccuVjNj9.o(.text+0x76c): undefined reference to `dbm_open' /tmp/ccuVjNj9.o(.text+0x7bf): undefined reference to `dbm_fetch' /tmp/ccuVjNj9.o(.text+0x886): undefined reference to `dbm_store' /tmp/ccuVjNj9.o(.text+0x894): undefined reference to `dbm_close' /tmp/ccuVjNj9.o: In function `GetOrderRecord': /tmp/ccuVjNj9.o(.text+0x8c3): undefined reference to `dbm_open' /tmp/ccuVjNj9.o(.text+0x915): undefined reference to `dbm_fetch' /tmp/ccuVjNj9.o: In function `UpdateOrderRecord': /tmp/ccuVjNj9.o(.text+0x9ba): undefined reference to `dbm_store' /tmp/ccuVjNj9.o: In function `CloseDatabase': /tmp/ccuVjNj9.o(.text+0x9ce): undefined reference to `dbm_close' collect2: ld returned 1 exit status 自分なりの解釈としては、コンパイラのせいではなく、リンクの失敗ではないかと思っています。そこで、ndbm.hというファイルで宣言する際に必要なライブラリを指定すれば正常にコンパイルができるものだと思ったのですが、方法もしくはファイルがどこにあるかがわかりません。 manで調べたり、ndbm.hのファイルを開いて調べてみたのですが、それに関する情報がありませんでした。解釈がまちがっているのかもしれません。なにとぞ、ご指導おねがいします。 |
|
>>1930 XRD > 自分なりの解釈としては、コンパイラのせいではなく、リンクの > 失敗ではないかと思っています。 その通りです。 コンパイル済の dbm_open の実体 (=オブジェクト) が、標準 C ライブラリの libc.so.* に含まれていないのでリンク時にエラーに なっているわけです。なので、dbm 関係のライブラリ名を指定しないと いけません。探し方はこちら。 http://www.jp.FreeBSD.org/QandA/HTML/1609.html というわけで、手元の LASER5 Linux で % nm -o /lib/*.so.* /usr/lib/*.so.* | grep ' T ' | grep dbm_open 試すと、 /lib/libdb1.so.2:00009d70 T dbm_open /lib/libdb.so.2:00009d70 T dbm_open /usr/lib/libgdbm.so.2:00002230 T dbm_open /usr/lib/libgdbm.so.2.0.0:00002230 T dbm_open となりますので、cc -ldb -L/lib とか、cc -lgdbm -L/usr/lib すれば よいことがわかります。libdb の方は ndbm で、libgdbm の方は gdbm でしょうが、どちらがよいかはわかりません。 で、splitword と unescape_url の方は http://home.impress.co.jp/books/ietech/CGI.contents.html の ソースコードのリスト → cgiutils.h, cgiutils.c のところにあります。これをリンクするよう記述があったのでしょうが 見落としておられるのではないでしょうか。 |
|
>>1927 ミングさん >で全てを出す方法で目的は達成したのですが,それを一度で出したいと思い、下の様にしてみました。 実用的には、まずパイプで繋ぐことを検討すべきです。 1つのスクリプトにするにしても、元の2つがデータの行ごとの処理なので、 close や getline を使う必要がよく分かりません。 awkの勉強ということであれば、もっと単純な課題を使うべきでしょう。 スクリプトを拝見する限り、awkの文法を十分に理解されてるとは思えないもんで… |
|
>>1927 ミング 私の勘違いでなければ #!/usr/bin/awk -f { for (i = 0; i < 4; ++i) for (j = 0; j < 4; ++j) print($1 "-" i + 1, j + 1, $2 + 100 * j, $3 + 100 * i) } で済む話だと思うんですが... 今の問題は、制御の流れを追って考えれば分かるのでは。 (1) 暗黙にstdinから1行入力 (2) 最初のアクションで、out1に4行出力 (3) 2番目のアクションで、out1から1行入力 stdoutに4行出力後、(1)へ (3)のgetlineで1行しか読んでいないので、(1)で EOFが来る頃には、まだout1の1/4しか処理していない訳です。 |
|
68userさん、ありがとうございました。 まだ、うまくはできていませんが、がんばってみます。 splitword、cgiutils.cは見落としてました。 幸い本に掲載されていましたので、解決できそうです。 まだ、未熟者なので、わからないことが多々あると思います。 そのときは、お手数ですがよろしくお願いいたします。 |
|
なるべく早くGOOやinfoseek にかからないようにしてほしいのですけど… 特にSEGA BBSは… |
|
>>1935 ED > GOOやinfoseekにかからないようにしてほしいのですけど… なぜですか? (何となく想像できますけど) ちなみに、そうするかどうかは考えておきます。 > 特にSEGA BBSは… SEGA BBS 以外でもロボットの検索対象から外したほうがよい コンテンツがありますか? |
|
とある(無料)サーバに ~hogehoge というファイルをFTP転送しました が,これは作業中のバックアップ用ファイルを誤って転送したものです。 そこでWindows用FTPソフトを使って削除しようとすると, >DELE ~hogehoge 550 ~hogehoge: No such file or directory という結果になります。ちなみに相手方は ProFTPD です。 まあ当然といえば当然の結果かも知れませんが,いったいどうすれば削除で きるでしょうか。コマンドを手動入力することは可能です。恐らくは ~ を 別の形式で表現すればいいのだと思いますが,どうも分からないのです。 ファイルが残っていても実害はないのですが,何となく気持ち悪いので, よろしくご教示ください。 |
|
UNIX同士の通信で、TCP/IPのソケットを使ってHTTPのPOSTでデータのやり取りをしたいのですが、どのようにすればいいのでしょうか?? 理解不足でもしかしたらわけわかんない質問をしているかもしれませんが、お願いします。 ソケットでのデータのやりとりだと思ってください。 また、TCP/IPプロコトルとHTTPは別もの??これもわけわかんないですか? |
|
>>1937 CZ そのファイルをフルパスで指定すれば消せませんか? DELE /home/hoge/~hogehoge みたいに。 >>1938 ほいほい http://x68000.startshop.co.jp/~68user/net/ 68userさんがせっかくこういう物を提供してくださってるんですから 読みましょうよ・・・。 |
|
>>1939 hsj たすかりました。 なんかいろいろ見てて混乱してました。 いまみたら、理解しました。どうもすいません・・・・・ |
|
メールでいただいた質問ですが、勉強になったのでこちらでお返事。 > http://x68000.startshop.co.jp/~68user/net/perl4.html > にも書かれていますが > Perl4では SOCK_STREAM の値を直接指定しなければならない > となっておりますが、Perl4の場合 > require 'sys/socket.ph'; > とするのでは無いでしょうか? > (perl4環境が無く、人づてなので当てずっぽうです。) なるほど、既に perl4 のラクダ本も手元になく、常用環境には perl5 しかないので知りませんでした。あのページには perl4 なら sys/socket.ph を使うよう追記しておきます。 > また、サンプルの > > socket(SOCKET,PF_INET,SOCK_STREAM,0); > ですが、protocol だけが直接、値を指定しているのは > 何故でしょうか? TCP や UDP を使う場合は 0 でよいです。/etc/protocols には ip 0 IP # internet protocol, pseudo protocol number tcp 6 TCP # transmission control protocol udp 17 UDP # user datagram protocol となっていますので、TCP を使う場合は socket(SOCKET, PF_INET, SOCK_STREAM, 6); socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname('tcp')); などと明示的に指定してもいいです (可読性と、NIS への対応 という面から見ると後者がよい)。 しかし、アドレスファミリ(PF_*) とソケットタイプ (SOCK_*) の 値が決まると、プロトコルは一意に定まります (なぜかはよく わかりません)。なので、プロトコルに 0 を指定すれば、自動的に 適切なプロトコルが決定されます。 FreeBSD なら socket(2) の下請け関数である socreate で http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/src/sys/kern/uipc_socket.c?rev=1.97 int socreate(dom, aso, type, proto, p) if (proto) prp = pffindproto(dom, proto, type); else prp = pffindtype(dom, type); と検索を行う関数 pffindtype が呼ばれています。 なお、ICMP をしゃべったり、IP データグラムを直接生成する ために raw ソケットを生成したい場合は 非 0 を指定します。 |
|
>>1939 hsj > そのファイルをフルパスで指定すれば消せませんか? > DELE /home/hoge/~hogehoge > みたいに。 FTP サーバの実装依存でしょうが、FreeBSD 4.3-RELEASE 付属の ftpd だと、カレントディレクトリに ~hogehoge がある状態で > rm ~hogehoge DELE ~hogehoge となり消せました。 ただ、 > rm ./~hogehoge > rm /home/user/~hogehoge は同じく 4.3-RELEASE 付属の ftp コマンドが何を勘違いしたのか RMD ./~hogehoge RMD /home/user/~hogehoge とディレクトリを削除しようとして失敗していました。 > quote DELE ./~hogehoge DELE ./~hogehoge と、直接 FTP コマンドを送ると OK でした。 UNIX 界では、~hoge が「hoge ユーザのホームディレクトリ」と 解釈されるのは ~ が先頭にあるときのみですから、フルパスで 書いたり ./~hoge などとすればよいです。ただし、 % perl Makefile.PL INSTALLMAN3DIR=~/install のように、アプリケーション側 (この場合は ExtUtils::MakeMaker) で 展開してくれるものもあります。 |
|
>>1941 68user > アドレスファミリ(PF_*) プロトコルファミリでした。 ちなみに、うちの web ではアドレスファミリ (AF_*) と プロトコルファミリ (PF_*) の使い分けがいいかげんだった ような気がします。いまだに違いがよくわからんなぁ。 |