1 名前:デフォルトの名無しさん [2005/04/04(月) 03:43:03 ] シェルスクリプトに関する質問・回答や議論等を行う相談室スレッド。
357 名前:デフォルトの名無しさん mailto: [2006/10/21(土) 11:56:53 ] >>356 早速のご回答ありがとうございます。 >で、rsh が hostname のシェルで (sh -c 'ls; echo \$?') を実行する。 >この時にもう一度展開される。 ダブルクォーテーションで囲まれた中の$は、 シェルによってメタキャラクタと認識されてしまうので \マークでクォートしなくてはいけないのですが、 シングルクォーテーションで囲まれた$は メタキャラクタとは認識されないので、 \マークでクォートする必要はない、 というのが私の認識です。 よって、hostnameのシェルで実行される (sh -c 'ls; echo \$?')の$はメタキャラクタとは 認識されないので、\マークは不要であると 思っています。 ご指摘の程よろしくお願い致します。 ちなみに今回の質問は、 書籍「入門UNIXシェルプログラミング 改訂第2版」 のP.132についてです。
358 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 19:23:38 ] >>357 csh 系や zsh の挙動は良く知らないが bash のクォート除去はそこまで賢くない。 ダブルクォートの中にシングルクォートがあっても その中身は保護されない。 例) $ echo "$SHELL" '$SHELL' "'$SHELL'" /bin/bash $SHELL '/bin/bash'
359 名前:デフォルトの名無しさん mailto:sage [2006/10/21(土) 20:31:06 ] cshなんですが、 ヒアドキュメントの内容を変数に格納するのはどうやったらいいんでしょうか
360 名前:デフォルトの名無しさん mailto:sage [2006/10/22(日) 04:00:06 ] 負の遺産を量産するな。shか最悪kshで書き直せ。 (t)cshが許されるのはログインシェルまで。
361 名前:359 mailto:sage [2006/10/25(水) 13:13:03 ] 古いsoralisのメンテしてる上に周りがcshしか理解できないんで仕方なく・・・ 本当はbash使いたいんですけどね
362 名前:デフォルトの名無しさん mailto:sage [2006/10/29(日) 15:43:34 ] 別に仕方ないことないだろに。
363 名前:デフォルトの名無しさん mailto:sage [2006/10/29(日) 18:22:40 ] >>356 エスケープの処理はバッククォートとダブルクォートのときじゃないか? rshが受け取る文字列は(sh -c 'ls; echo $?')だと思うんだけど。 (STAT=`rsh hostname "sh -c 'ls; echo \\$?'"`) ローカルのシェルが、バッククォートとして実行する文字を解釈 -> (rsh hostname "sh -c 'ls; echo \$?'") バッククォートが、rshを呼び出す為に引数を展開 -> (hostname) (sh -c 'ls; echo $?') rshがhostnameに入って、ホストのシェルで第二引数を実行 -> (sh -c 'ls; echo $?') sh -c の処理 -> (ls; echo $?) >ダブルクォートの中にシングルクォートがあっても >その中身は保護されない。 ダブルクォートの中のシングルクォートは単なる文字なのでこれはこれで合ってるけど。
364 名前:デフォルトの名無しさん mailto:sage [2006/10/29(日) 23:14:19 ] >>363 bash の man を参照するとわかるがクォートの除去は 各種展開が終わってから行われる。 冗長に処理の流れを書くとこうなる。 1. コマンド実行 -> (STAT=`rsh hostname "sh -c 'ls; echo \\$?'"`) 2. ローカルのシェルがコマンド置換(バッククォートの処理)を行う -> (rsh hostname "sh -c 'ls; echo \\$?'") 3. サブシェルが起動してバッククォートの中身を展開する -> (rsh) (hostname) (sh -c 'ls; echo \$?') 4. サブシェルが rsh に引数 (hostname) (sh -c 'ls; echo \$?') を渡す 5. rsh が hostname のシェルに (sh -c 'ls; echo \$?') を渡す 6. hostname のシェルが引数を展開する -> (sh) (-c) (ls; echo \$?) 7. hostname のシェルが sh に (-c) (ls; echo \$?) を渡す 8. sh が引数を展開、実行する -> (ls; echo $?) 9. sh -> hostname のシェル -> rsh -> サブシェルの順に返り値が渡り、コマンド置換が終了 10. STAT に返り値が代入される
365 名前:デフォルトの名無しさん mailto:sage [2006/10/30(月) 02:27:55 ] >>364 > bash の man を参照するとわかるがクォートの除去は > 各種展開が終わってから行われる。 EXPANTIONSのとこにあるこれ? The order of expansions is: brace expansion, tilde expansion, parameter, variable and arithmetic expansion and command substitution (done in a left-to-right fashion), word splitting, and pathname expansion. ここにあるのは、どの順で実行されていくかの説明で、クォートの解釈は別の段階だぞ。 Expansion is performed on the command line after it has been split into words. ってあるとおり、(1)シェルが一行読み込まれる → (2)単語への分割 → (3)各要素を展開する のうち(2)の話だ。(3)にある単語分割とは別物 #1行じゃない場合はちょっとおいといてくれ > 2. ローカルのシェルがコマンド置換(バッククォートの処理)を行う -> (rsh hostname "sh -c 'ls; echo \\$?'") これの前に単語への分割があって、バッククォートを使っているとバックスラッシュの前にあるバックスラッシュはエスケープとして扱われるから、 (STAT=`rsh hostname "sh -c 'ls; echo \\$?'"`) -> (STAT) (=) (`rsh hostname "sh -c 'ls; echo \$?'"`) この段階でバックスラッシュは一個になる。 (っていうか、そうじゃないと入れ子になったバッククォートの範囲を確定できないし) コマンド置換の展開が実行されると、サブシェルがまた単語への分割を実施して、 今回はダブルクォートのルールに従ってバックスラッシュは$に対するエスケープ文字になる。 (rsh hostname "sh -c 'ls; echo \$?'") -> (rsh) (hostname) ("sh -c 'ls; echo $?'") 「bash -v -x」してから「echo `echo "'\\$abc'"`」ってやってみ。 読み込んだ文字と、展開結果が出てくる。 サブシェルが読み込んだ文字列は echo "'\$abc'" になってて、すでに一回バックスラッシュが処理されてる。
366 名前:デフォルトの名無しさん mailto:sage [2006/10/30(月) 03:36:14 ] >>365 ほー、そうだったのか。 やっぱりこういう事は自分で検証しないとダメだな。 的確な突っ込み感謝。
367 名前:デフォルトの名無しさん mailto:sage [2006/10/30(月) 12:33:25 ] >366 そういや、肝心の355はどこいったんだ?
368 名前:デフォルトの名無しさん mailto: [2006/11/02(木) 23:45:43 ] 355です。 はっ!、と思って只今本スレを確認しました。 しばらくの間に様々な回答を頂き、本当にありがとうございます。 これからじっくり読ませて頂きます!
369 名前:デフォルトの名無しさん [2006/11/04(土) 20:27:36 ] 微妙にスレ違いかもですが あるファイルに対する処理をパイプで繋げて、 最終的に同名のファイルに書くのはアリなんでしょうか cat hoge.txt | grep "foo" | uniq | sort > hoge.txt 現状動いてはいるんですが・・・ ちなみにbashです
370 名前:デフォルトの名無しさん mailto:sage [2006/11/04(土) 21:33:13 ] >>369 途中のコマンドがエラーを吐くと空になるが、いいのか? 期待通りに動いているのなら、アリではあるが どこの環境でも動くという保証は無い。 俺ならいったん変数に入れてから書き出すかな。 a=`grep "foo" hoge.txt | sort -u` if [ -n "$a" ] ; then echo "$a" > hoge.txt fi
371 名前:デフォルトの名無しさん mailto:sage [2006/11/04(土) 21:35:18 ] あ、よく考えたら uniq | sort と sort -u は違うな。 適当に読み替えてくれ。
372 名前:デフォルトの名無しさん mailto:sage [2006/11/04(土) 21:37:33 ] >>369 >最終的に同名のファイルに書くのはアリなんでしょうか ダメ。
373 名前:デフォルトの名無しさん [2006/11/04(土) 23:26:40 ] 特定の時間帯のログだけ抽出したい場合ってどうしたらいいんでしょうか?
374 名前:デフォルトの名無しさん [2006/11/04(土) 23:29:03 ] awk
375 名前:デフォルトの名無しさん [2006/11/05(日) 04:29:12 ] PM18::00からAM1:00までの場合はどうすれば?
376 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 04:31:11 ] ログファイルの仕様は?
377 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 04:34:07 ] やりかたはログによる
378 名前:デフォルトの名無しさん [2006/11/05(日) 04:46:30 ] 2006/11/04,01:37:33,xxxxxxxxxxxxxxxxxxxxxxx 2006/11/04,02:37:33,xxxxxxxxxxxxxxxxxxxxxxx 2006/11/04,03:37:33,xxxxxxxxxxxxxxxxxxxxxxx 2006/11/04,04:37:33,xxxxxxxxxxxxxxxxxxxxxxx 2006/11/04,16:37:33,xxxxxxxxxxxxxxxxxxxxxxx 2006/11/04,21:37:33,xxxxxxxxxxxxxxxxxxxxxxx こんなかんじ
379 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 04:52:32 ] ぱっと思い付かないけど、俺ならperl使うかな。 ログをとる時間とタイミングが決まってるなら検討付けて timeコマンドで1:00にtail -10とかでがばっと適当にログを切り出して保存する。
380 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 04:56:47 ] >>378 のフォーマットなら1行野郎でできる awk -F '[,:]' '$2>=18||$2<1' logfile
381 名前:379 mailto:sage [2006/11/05(日) 05:24:52 ] >>380 お前マジ頭いいな
382 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 10:47:41 ] >>375 >PM18::00 それは一体何時なんだ? もし、18時のことを書きたいなら6PMと書かないと意味が通じないわけだが。
383 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 10:48:59 ] 通じなくてよし
384 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 14:16:24 ] なんか、awkの話になってるんで便乗で質問ですが シェルスクリプトから awk -f 手続きファイル 参照ファイル とやって、-vでawkスクリプトに引数を渡してawk内で使用するのって具体的にはどうやればいいんですかね?
385 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 14:28:58 ] ・・・・・<dateAndTime>20061101130655</dateAndTime>・・・・・・・・・・・・・・・・・ ・・<dateAndTime>20061101160213</dateAndTime>・・・・・・・・・・・・・・・・・ ・・・・・・・・・<dateAndTime>20061101180159</dateAndTime>・・・・・・・・・・・・・・・・・ ・・・<dateAndTime>20061102200159</dateAndTime>・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・<dateAndTime>20061103210159</dateAndTime>・・・・・・・・・・・・・・・・・ ・・・・・・<dateAndTime>20061104220159</dateAndTime>・・・・・・・・・・・・・・・・・ ・・・・・・・・・<dateAndTime>20061104131259</dateAndTime>・・・・・・・・・・・・・・・・・ ・・<dateAndTime>20061104011359</dateAndTime>・・・・・・・・・・・・・・・・・ ・・<dateAndTime>20061104052359</dateAndTime>・・・・・・・・・・・・・・・・・ ・・・・・・・・・<dateAndTime>20061105062059</dateAndTime>・・・・・・・・・・・・・・・・・ ・・・・<dateAndTime>20061106072159</dateAndTime>・・・・・・・・・・・・・・・・・ ・・・<dateAndTime>20061106114359</dateAndTime>・・・・・・・・・・・・・・・・・ ・・・<dateAndTime>20061107221359</dateAndTime>・・・・・・・・・・・・・・・・・ ・・・・・・<dateAndTime>20061108230559</dateAndTime>・・・・・・・・・・・・・・・・・ ログがタグ形式で、こんな感じだったらawkではどうする?
386 名前:明日まで [2006/11/05(日) 14:36:03 ] こういうシェルを私みたいな女の子にも理解できるように解説してよ 引数付(1〜5)で実行したshellが何を引数として入力 したかを,switch文を使って表示させたい。。 【その1】引数無し、もしくは引数が1〜5以外の場合 % ./test.sh Invalid number. % 【その2】引数が1〜5の場合 (5を入力した場合) % ./test.sh 5 You have imput 5.
387 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 14:52:33 ] >>384 たぶん勉強すればどうにかなるんだろうけど、 awkで引数に関することでごにょごにょするのがめんどくなったのでPerlに移った。 awkは短い命令やパイプラインで使ったりはするけど、引数でごにょごにょするのは Perlでやることにした。 >>
388 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 14:55:02 ] >>386 case文でnull,$1〜$5までのケース書いて、その他は(*にでも書けば良いじゃん
389 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 15:30:16 ] >>384 別にawkに限った話じゃないので、普通に引き数で渡せば宜しい。 後は、awkかnawkかgawkか、変数定義かARGVを使うかの違いがあるだけ。 >>385 外部プロセスでsedを呼んで処理するか、awkを呼び出すシェルスクリプト側でsedを呼んで処理する。
390 名前:デフォルトの名無しさん [2006/11/05(日) 20:52:42 ] 誰かこのシェル作って 今日中にやらないといけないんです、お願いします。 引数付(1〜5)で実行したshellが何を引数として入力 したかを,switch文を使って表示させたい。。 【その1】引数無し、もしくは引数が1〜5以外の場合 % ./test.sh Invalid number. % 【その2】引数が1〜5の場合 (5を入力した場合) % ./test.sh 5 You have imput 5.
391 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 22:22:18 ] シェルスクリプトの中身↓ awk -f xxx.awk -v awkNoHensu=${shellNoHensu} aaa.txt xxx.awkの中身↓ { print ${awkNoHensu} } awkってよくわかんないけど引数ってこんなかんじでいけるのかな? 横レスですが、外部プロセスでsedを呼ぶってひょっとしてsystemコマンド(system関数)?
392 名前:デフォルトの名無しさん mailto:sage [2006/11/05(日) 23:29:32 ] awkはCのpopen()相当をかなり変態的かつシンプルな形で表現できる。 Ex. -- #!awk -f BEGIN { if (ARGC > 1) { cmd = "wc -l " ARGV[1]; cmd | getline fileLineCnt; close(cmd); } } { if (fileLineCnt) { printf("%d/%d %s\n", NR, fileLineCnt, $0); } } -- sedで前処理するのも、これと同じ要領。
393 名前:392 mailto:sage [2006/11/05(日) 23:33:02 ] おっと、折角だから最後のブロックを訂正。 -- { if (fileLineCnt) { printf("%d/%d:", NR, fileLineCnt); } print; } -- これでコマンドライン引き数がないときはただのフィルターになる。 #>392のは引き数がないと何もしなかった。
394 名前:デフォルトの名無しさん mailto:sage [2006/11/06(月) 02:23:46 ] >>391 awkスクリプトの中で参照するときに$つけなくてもよい。つかつけちゃダメ。 $つけたらフィールド参照になっちゃうから。 awk -v foo=ほげほげ ... で渡したのなら、単に foo で参照できる。
395 名前:デフォルトの名無しさん [2006/11/06(月) 17:18:33 ] grepでは1行が2048バイトの制限がありますが、 awkやsedの制限はどうなっているのかどなたか教えてください
396 名前:デフォルトの名無しさん mailto:sage [2006/11/06(月) 20:23:22 ] 知らない。不安なら perl 使っとけ。メモリの続く限り無制限だから。
397 名前:デフォルトの名無しさん mailto:sage [2006/11/06(月) 22:09:24 ] 2048バイト制限のあるgrepって、どのgrepのこと?
398 名前:デフォルトの名無しさん mailto:sage [2006/11/07(火) 00:30:09 ] >>392 それはawk -v で引数を渡せばいいですか?
399 名前:392 mailto:sage [2006/11/07(火) 03:18:46 ] めんどくさい香具師だなぁ。 >393のスクリプトにfooとでも名づけて実行ビット立てたら foo foo とでもして味噌。
400 名前:デフォルトの名無しさん mailto:sage [2006/11/07(火) 23:31:42 ] >>395 sedにも制限あったはず。それでperlにしたことがある。 てか試せ
401 名前:デフォルトの名無しさん [2006/11/07(火) 23:49:35 ] >>391 awkに-vでシェルの変数を引数で渡す場合、BEGIN内でしか参照できないからあんまり意味ないですよー 嘘言ってたらごめんなさい
402 名前:デフォルトの名無しさん mailto:sage [2006/11/08(水) 00:30:45 ] >>401 ぇ…(´Д`υ) % awk -v foo=hello 'END { print foo }' ^Dhello %
403 名前:デフォルトの名無しさん [2006/11/08(水) 01:25:16 ] −−−−−−−−−−−−−−− BEGIN{} /○○/{ print$1 } END{} −−−−−−−−−−−−−−− ○○のところにシェルから持ってきた変数って使えますかね? 使えたら変数によって検索条件を変えられるんでawk最強って話になるんですが。
404 名前:デフォルトの名無しさん mailto:sage [2006/11/08(水) 01:41:35 ] 例えば,↓のようにできる % cat emp.data Beth 4.00 0 Dan 3.75 0 Kathy 4.00 10 Mark 5.00 20 Mary 5.50 22 Susie 4.25 18 % awk -v name=Kathy '$1 ~ name { print $2 }' emp.data 4.00 %
405 名前:デフォルトの名無しさん mailto:sage [2006/11/08(水) 01:50:47 ] >>395 GNU sed とか gawkなら多分制限はない(メモリの許す限り)。 SUSv3をみたところ、OSごとに一行の最大の長さを定義している LINE_MAX という定数があって、そこまでは使えることが保証 されているだけみたい。 で、FreeBSDとSolarisはこのLINE_MAXは2048バイトのようだ。
406 名前:403 [2006/11/08(水) 02:00:33 ] テキストをawkでカンマ区切りなどに成型した後ならそれはかなり使えそう技ですね。 しばし感心してしまいました。 でも、仮に以下のような感じのデータだったらやっぱできないんでしょうかね? 行にある、特定の文字列だけにヒットするような感じで。 たとえば/○○/のところに、BOOという引数を与えて、BOOを含む行だけ検索して特定の処理をするみたいな? TXT −−−−−−−−−−−−−−− AAAAADSLADLAS UEJNDNKA KDJSALJDLKSA HHHHHBOOA+aDSA DSKAJDKASL DSKLA+KDAS −−−−−−−−−−−−−−− AWK −−−−−−−−−−−−−−− BEGIN{} /○○/{ 何かしらの処理 } END{} −−−−−−−−−−−−−−−
407 名前:デフォルトの名無しさん mailto:sage [2006/11/08(水) 02:07:10 ] >>406 awk -v pattern=BOO '$0 ~ pattern { print }'
408 名前:デフォルトの名無しさん mailto:sage [2006/11/08(水) 13:59:33 ] >>403 そんなもんこうやって無理矢理やってしまえばできる。 awk '/'"$x"'/{ ... }'
409 名前:デフォルトの名無しさん mailto:sage [2006/11/08(水) 21:08:39 ] つうかもうちょっとawkを勉強して、試した上で聞けよな・・
410 名前:デフォルトの名無しさん mailto:sage [2006/11/09(木) 22:19:29 ] >>409 でも、Awk神がいるからか、 最近のこのスレの話の流れはなかなか為になってるよ。 まあ、シェルはある程度分かるが、 長年Awkを馬鹿にして敬遠してきた俺から言わせてもらえばだけどね。 んで、このスレ読んでAwkでも勉強してみようと思い立ち オライリーの書籍を注文してしまったw 今思えば、俺が今まで仕事でやってきた案件なんぞ PerlやRuby使うまでもないことばっかりってことが判明してちと鬱だがね・・・orz...
411 名前:デフォルトの名無しさん mailto:sage [2006/11/09(木) 22:25:23 ] ファイル処理に便利だしね シェルスクリプト作ってた筈なのに 気がつくとawkとsedの処理が8割だった事がある
412 名前:デフォルトの名無しさん mailto:sage [2006/11/10(金) 00:34:43 ] 下手な文字列処理なんかだと、Cで書くよりよっぽど早いしメンテナンスしやすいからな。
413 名前:デフォルトの名無しさん mailto:sage [2006/11/10(金) 13:50:16 ] うちの高専で半年くらいawkばっかりやらせてた測量学の教官がいた
414 名前:デフォルトの名無しさん mailto:sage [2006/11/10(金) 13:53:17 ] ↑ 授業で
415 名前:デフォルトの名無しさん mailto:sage [2006/11/10(金) 15:36:22 ] ときどきでいいのでawkスレのことも思い出してあげてください。 pc8.2ch.net/test/read.cgi/tech/1023556171/
416 名前:デフォルトの名無しさん mailto:sage [2006/11/12(日) 16:23:26 ] >>410 「一寸、微笑ましい」という本心をコメントする。
417 名前:デフォルトの名無しさん [2006/11/13(月) 17:30:40 ] >>380 23:15〜03:15とか 04:30〜9:30とか 分の単位がある場合でも 一行で簡潔にかけたりする?
418 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 19:14:24 ] >>417 awk -F '[,:]' '$2$3>="2315"||$2$3<"0315"' logfile awk -F '[,:]' '$2$3>="0430"&&$2$3<"0930"' logfile
419 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 21:42:59 ] >>417 $2>=23&&$3>=15||$2<2||$2<3&&$3<15 こんな感じの書き方をすりゃいいんでないの?とアドバイスをしようと思ったら >>418 がなんかすごい技を繰り出してて…恥ずかしくなってきた罠。
420 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 21:59:53 ] >>412 AWKの文字列処理ってCより速いの?
421 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 22:18:38 ] >418 -F × -f ○
422 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 22:56:55 ] >>421 been opened if it were a file name. The option -v followed by var=value is an assignment to be done before prog is executed; any number of -v options may be present. The -F fs option defines the input field separator to be the regular expression fs. /usr/share/man/cat1/awk.1 line 26/250 (11%)
423 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 23:05:47 ] >>421 コマンドラインで FS の設定をしてるから間違っとらんよ。
424 名前:デフォルトの名無しさん [2006/11/13(月) 23:38:44 ] リストファイルから一行ずつパターンを読み込ませて テキストファイルを一行ずつパターン検索したいんですが awkでファイルから入力する方法ってありますか?
425 名前:デフォルトの名無しさん mailto:sage [2006/11/13(月) 23:51:26 ] getline関数は現在の入力ファイルから次の入力レコードを $0 に代入する。 getline < file は file から次の入力レコードを $0 に代入する。 getline x は変数 x に代入する。 cmd | getline は cmd の出力を getline にパイプする。 getline は入力が成功すると1,ファイルの末尾で 0,エラーで -1 を返す。
426 名前:412 mailto:sage [2006/11/13(月) 23:56:23 ] >>420 「速い」じゃなくて「早い」だ。つまり、どっちが早くプログラミングできるかってこと。
427 名前:デフォルトの名無しさん [2006/11/13(月) 23:57:53 ] 変数を受け取って、一連の処理を行うようにしたコマンドの羅列だろ。 ひとつずつコマンドを打ち込んで処理するのが面倒くさいから 判定とか分岐とか呼び出しとかを使って、処理自体を複雑・多様化するようにしたんだろ。 更に、ひとくくりの処理を名前を付けて登録できるから、コマンドはそれひとつで 自分で組んだ複数の処理をしてくれる。 基本的に古臭いものだし、フロントエンドを設けてGUI化したのを 使うのが最適だと思うのに、何故に今更ながらのコマンドシェルなんだ? 馬鹿?
428 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 00:08:47 ] 〃∩ ∧_∧ ⊂⌒( ・ω・) `ヽ_っ⌒/⌒c はいはいわろすわろす ⌒ ⌒
429 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 07:07:15 ] >>424 同じファイルの次行レコードをgetlineで読めるはずだけど 処理中に別ファイルは読めないんじゃないかな fopenとかないし引数とらせるとかなら方法あるかもな
430 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 07:37:30 ] >>429 >425
431 名前:デフォルトの名無しさん [2006/11/14(火) 19:44:15 ] パターンファイルに一致するレコードを削除したいのですが、どうやったら実現できるでしょうか? シェルでもアークでも構いません。御指南下さい。 テキストファイル(テキスト.txt) 20061110,AAA 20061111,BBB 20061112,CCC 20061113,DDD ・ ・ ・ ・ ・ パターンファイル(パターン.ptn) AAA CCC GGG
432 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 19:45:09 ] >シェル 失せろ >アーク 消えろ
433 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 20:35:18 ] % cat foo.awk BEGIN { while (getline < ptn == 1) pattern[n++] = $0 } { for (i = 0; i < n; i++) if ($0 ~ pattern[i]) break if (i == n) print } % awk -f foo.awk -v ptn=pattern.ptn text.txt 20061111,BBB 20061113,DDD 20061114,EEE ……
434 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 20:51:08 ] grep -v -f パターン.ptn テキスト.txt
435 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 21:52:58 ] >431 アークじゃないよ。 オークって読むよ。 >433 awkって何でもできるんだな。
436 名前:デフォルトの名無しさん mailto:sage [2006/11/14(火) 22:07:46 ] >>415 にも書いてるけどawkスレも使ってやってください。 awkについて語るスレ pc8.2ch.net/test/read.cgi/tech/1023556171/
437 名前:デフォルトの名無しさん [2006/11/14(火) 23:03:02 ] >>433 オークってよむんですか。 ありがとうございます。
438 名前:デフォルトの名無しさん mailto:sage [2006/11/15(水) 00:37:29 ] bashなんですが、daemonの起動スクリプトとかで 変数にブレースがついてたり、ついてなかったりするのは どういう意図があるの?
439 名前:デフォルトの名無しさん mailto:sage [2006/11/15(水) 00:58:40 ] >>438 1. 変数と文字列を明示的に区切りたいから ex) ${foo}bar 2. ブレース展開を使っている ex) ${foo%.*} 3. ただの気まぐれ
440 名前:デフォルトの名無しさん [2006/11/16(木) 00:52:32 ] getline 変数 で、次のレコードを読んで変数に代入になると思いますが、 更にgetline 変数を使うと更に次の行が読み込まれるのでしょうか? そのあとawk処理を終えて次のレコードをawkが読みに行ったとき、getlineの影響を受けて読んでいる行が進んでしまいますか? AWKスクリプト { getline A PRINT A getline A PRINT A } 読み込みファイル AAAAA BBBBB CCCCC DDDDD 出力結果はこう? AAAAA BBBBB CCCCC DDDDD 出力結果はこう? AAAAA BBBBB BBBBB CCCCC CCCCC DDDDD
441 名前:デフォルトの名無しさん mailto:sage [2006/11/16(木) 00:57:16 ] やってみればいいじゃん。 つーか、シェルからの起動も絡まないawkの話はawkのスレでやれよ。
442 名前:デフォルトの名無しさん mailto:sage [2006/11/16(木) 01:02:20 ] スレ名変えればいいだろ、 【シェルって】サーバ用途のスクリプト【貝殻?】
443 名前:デフォルトの名無しさん [2006/11/16(木) 01:07:00 ] sedなんかを使って特定のタグで囲まれたところを出力することって可能ですか? sdak;dkslakdas;das<TAG>dkalkdlas;kdsla;kds;akdsal;dkslad;</TAG>dlaskldkalsfocmdcsdlc,ds
444 名前:デフォルトの名無しさん mailto:sage [2006/11/16(木) 01:12:20 ] 行内に開始タグ終了タグが1セットだけあるなら、 sed -ne 's/<TAG>\(.*\)<\/TAG>/\1/p'
445 名前:デフォルトの名無しさん mailto:sage [2006/11/16(木) 01:14:40 ] >>441 たとえば>433のawkスクリプトでやってることをシェルスクリプトで実現したらどうなるかとかってのを >441自身が率先してレスしてやるとかすればこのスレももっと進歩するんじゃないの? 絡まない話と切って捨てるのではなく絡める努力なんてこともしてみたらいかがか?
446 名前:デフォルトの名無しさん mailto:sage [2006/11/16(木) 01:20:07 ] AwkにはSYSTEM関数もあるし UNIXのコマンドも使えちゃうので 必ずしも無関係とは言えないか
447 名前:デフォルトの名無しさん [2006/11/17(金) 00:46:21 ] 寂しいスレになったね。
448 名前:デフォルトの名無しさん [2006/11/28(火) 00:16:29 ] あるファイルの一部(何行もある)を違うファイルに書き換えるのはどうやるの? 例えば、 aaa aaa aaa aaa aaa aaa abc 1 2 abc 3 4 bbb bbb bbb というファイルを abc 1 10 abc 3 20 と言うファイルを使って aaa aaa aaa aaa aaa aaa abc 1 2 10 abc 3 4 20 bbb bbb bbb にしたいんだけど。。 どえらく行があって普通にsedの置換する行を書かせて実行したら 一日で終わらないくらい時間がかかってしまって。。。 もしくは、行単位で置換じゃなくて、数行単位で置換は出来ないのでしょうか? 偉い人教えてください。
449 名前:デフォルトの名無しさん [2006/11/28(火) 02:05:01 ] >>448 正直説明が分かりづらいです。 というか全くわかんない。 ちゃんと質問した方が良い。 その質問じゃ法則がいまいちわからない。 ファイルの一部を違うファイルに書き換える?? catとか使って結合したらいかが?
450 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 02:11:28 ] マルチ乙
451 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 11:34:00 ] >>448 それはスペース区切りで先頭の項目をキーにして残りのデータは重複なしで マージするという処理をしたいということか? あれ? でも、 aaa とかは 元から重複してるな。 駄目だ。やっぱ法則が分からん。
452 名前:デフォルトの名無しさん mailto:sage [2006/11/28(火) 14:02:55 ] >>448 二つのファイルを第1フィールドと第2フィールドを“,”とかでくっつけて (それぞれ test1.txt, test2.txt とする)、join(1) する: join -a1 test1.txt test2.txt 最後に“,”を削る。 それか、awk の連想配列を使って join する。
453 名前:デフォルトの名無しさん [2006/11/28(火) 23:56:25 ] 回答ありがとうございました。 分かりずらかったかと思いますので再度書き込ませてください。 一連の序列が混ざったファイルがあります。 例えば、 aaa bbb ccc ddd . ccc ddd eee fff . こんな感じの序列が続いた後に linux 123 987 786 0 linux 123 903 673 linux 123 876 986 0 . linux 234 983 934 0 linux 234 073 345 0 . linux 345 093 945 0 linux 345 495 384 . xyz abc def ghi xyz ade dfe sdg . となっていて変えたいところはlinux〜です。
454 名前:デフォルトの名無しさん [2006/11/28(火) 23:57:11 ] ここの行を linux 123 987 786 22 linux 123 903 673 22 . linux 234 983 934 85 linux 234 073 345 85 . linux 345 093 945 45 linux 345 495 384 45 としたいのです。 最後の0はあったりなかったします。 最後の行に各々の22,85,45を追加(または0を置換)したいのです。 2列目は123,234,345のようにまとまりがあります。 あとはランダムです。 存在するファイルは 123 22 234 85 345 45 . というファイルです。
455 名前:デフォルトの名無しさん [2006/11/28(火) 23:59:27 ] 自分は一行ずつ置換するためsedを作成するためのプログラムを作成しました。 ですが、数が一万行を超えるので、一日ではとても終わらないものになりました。 ファイルを分割してlinuxを含まない上下のファイルをとっておいて、 置換ではなくてlinux〜のファイルを作ってしまいcatで付けようとか考えていますが、 cutとかで分割する際にそんな指定って出来るんでしたっけ? 質問ばかりですいません。 宜しくお願いします。
456 名前:デフォルトの名無しさん [2006/11/29(水) 00:10:55 ] 追加ですが、 linux 123 987 786 22 linux 123 903 673 22 . linux 234 983 934 85 linux 234 073 345 85 . linux 345 093 945 45 linux 345 495 384 45 というファイルは作成出来るのですが、 これを元のファイルに反映させたいです。 手動でやるしかないですかね。。。
457 名前:デフォルトの名無しさん [2006/11/29(水) 00:21:19 ] 元ファイルをtest1.dat 参照ファイルをtest2.datとして join -a1 -o 1.1 1.2 1.3 1.4 2.2 test1.dat test2.dat とすればいいですかね。。。 joinは使ったことが無いので分かりませんが。。。