1 名前:デフォルトの名無しさん mailto:sage [2007/02/23(金) 23:55:42 .net] 腐っても鯛? 騏も老いては駑馬に劣る? 三人の碩学が生み出したスクリプト言語AWKについて語るスレ ◆ 前スレ awkについて語るスレ pc10.2ch.net/test/read.cgi/tech/1023556171/ ◆ 関係スレ シェルスクリプト相談室 pc10.2ch.net/test/read.cgi/tech/1112553783/ AWKでCGI pc10.2ch.net/test/read.cgi/php/1171804314/ 【sed】シェルスクリプト総合@LINUX Part2【awk】 pc10.2ch.net/test/read.cgi/linux/1154578200/ ◆ 参考 The AWK Programming Language (Brian Kernighan): ttp://cm.bell-labs.com/cm/cs/awkbook/index.html GAWK (GNU Projedt): ttp://www.gnu.org/software/gawk/
374 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 09:55:14 .net] 知らなかった。 勉強になった。
375 名前:デフォルトの名無しさん mailto:sage [2010/05/24(月) 15:25:46 .net] みんな>357のお蔭で多くを学んだな。
376 名前:デフォルトの名無しさん [2010/05/29(土) 04:53:07 .net] 名前: E-mail: 内容: cygwinだと % cut -f1 -d, hoge.csv より % awk -F, '{print $1}' hoge.csv の方が速かった。 #実行時間ね #Perl?シラネ
377 名前:デフォルトの名無しさん mailto:sage [2010/06/07(月) 11:45:38 .net] >>372 sed -e 's/,.*//'でもawkと同じくらいだから、cutの実装が遅いんだね。 cutが無駄にオプション多い所為じゃない?
378 名前:デフォルトの名無しさん mailto:sage [2010/06/07(月) 12:04:05 .net] 手元のlinux環境だとcutの方が速いという普通の結果でしたが。 hoge.csvは6桁の乱数3つを「,]で区切って並べた100万行の ファイルです。 % time cut -f1 -d, hoge.csv >/dev/null cut -f1 -d, hoge.csv > /dev/null 0.21s user 0.01s system 99% cpu 0.222 total % time awk -F, '{print $1}' hoge.csv >/dev/nulll awk -F, '{print $1}' hoge.csv > /dev/nulll 1.52s user 0.03s system 99% cpu 1.558 total ちなみにバージョンは cut (GNU coreutils) 8.5 GNU Awk 3.1.7
379 名前:デフォルトの名無しさん mailto:sage [2010/06/07(月) 12:22:48 .net] あーなるほど、なんか判った。cygwinのfgetc()が遅いからじゃないかな。 fgetc()とfgets()で時間を較べたときにfgetc()の方がずっと遅かった記憶がある。
380 名前:デフォルトの名無しさん mailto:sage [2010/09/13(月) 14:14:54 .net] xgawk (gawkでなく)にとあるwebページを食べさせると、XMLERRR (not well-formed)で中断します。 そのページがwell-formedか極悪かは私にとってどうでもよく、単に内容を得
381 名前:たいだけなので、文末まで処理し終えて欲しいのです。 どうにかならないでしょうか。 [] [ここ壊れてます]
382 名前:デフォルトの名無しさん mailto:sage [2010/09/25(土) 14:55:22 .net] シェルスクリプト内でパイプ入力されたものを処理する アクションをヒアドキュメントで書く事は出来るでしょうか。
383 名前:デフォルトの名無しさん mailto:sage [2010/09/27(月) 14:57:18 .net] 質問です。 データが |1|aaa| |2|bbb| |3|ccc| などとなっているとき aaa bbb ccc を取り出そうとして awk 'FS="|"{print $3}' ファイル名 としたんですが、1行目だけがうまくとれません。 データファイルの1行目を空行にすれば解決できないことはないんですが、 空行を入れ忘れてしまう懸念があります。 どうすればいいんでしょうか?
384 名前:デフォルトの名無しさん mailto:sage [2010/09/27(月) 15:01:46 .net] やりたいことは awk 'BEGIN {FS="|"} {print $3}' じゃないかと思うんだけど
385 名前:デフォルトの名無しさん mailto:sage [2010/09/27(月) 15:08:38 .net] 378です。 >>379 どうもありがとうございました。
386 名前:デフォルトの名無しさん mailto:sage [2010/09/27(月) 18:42:12 .net] gensub()にて、マッチした10番目以降のグループの指定の仕方を教えてください。 下記サイトでは、17番目まで普通に指定できるような事が書いてあるけど、 tounderlinedk.blogspot.com/2010/08/gensub-n-awk.html gensub(pattern,"\\10","g",$2) とかくと \\1(マッチ箇所)と0(文字)として解釈されちゃって上手くいなかい。 シェルスクリプト風かと思って、\\{10} も試したけどダメダッター。 GNU Awk 3.1.5です。
387 名前:381 mailto:sage [2010/09/27(月) 19:00:47 .net] BSDのjmanには、1から9までの数字って明記されてるなあ。 実装によって違うのかなあ パターンを動的に生成してマッチさせようとしてるから結構困る(´・ω・`) www.linux.or.jp/JM/html/GNU_gawk/man1/gawk.1.html
388 名前:デフォルトの名無しさん mailto:sage [2010/09/27(月) 19:04:47 .net] >>381 マニュアルには1から9までって書いてあるし Within the replacement text s, the sequence \n, where n is a digit from 1 to 9, may be used to indicate just the text that matched the n'th parenthesized subexpression. ソースの該当箇所(builtin.cの2542行目あたりから)みても1桁限定のロジックだよ。(3.1.7調べ) int dig = scan[1] - '0'; なんてやってる。
389 名前:デフォルトの名無しさん mailto:sage [2010/09/27(月) 19:08:03 .net] 一旦ぶった切るしかないんじゃね
390 名前:381 mailto:sage [2010/09/27(月) 19:12:31 .net] >>383 どうもありがとうございます。 >>384 ちょっと見栄え悪くなるけどそうする(´・ω・`)
391 名前:デフォルトの名無しさん mailto:sage [2010/09/27(月) 21:27:29 .net] >>381 なんでそこのひとは16までできたんだ?
392 名前:デフォルトの名無しさん mailto:sage [2010/09/28(火) 00:32:52 .net] 10の代わりに:を使っていたりして。
393 名前:デフォルトの名無しさん mailto:sage [2010/09/28(火) 03:15:24 .net] このスレが盛況なのが珍しいから 記念パピコ。
394 名前:デフォルトの名無しさん mailto:sage [2010/09/28(火) 03:41:50 .net] 15年以上前だけどawkの勉強始めて同時にperlの勉強もしてたら 気付いたらperlばっかりやっててawkすっかり忘れてしまったなぁ 今はperl捨てて専らpythonやってるけどawkもいいよね
395 名前:デフォルトの名無しさん mailto:sage [2010/09/28(火) 09:40:13 .net] Busyboxに組み込めば、それこそ炊飯器や冷蔵庫でも動くからなあ。 手軽であるにも関わらず、結構高度な処理もガリガリ書けるから好き。 Cとシェルスクリプトが好きだから、文法的にもしっくり来る。 上位互換のPerlも大好き。
396 名前:デフォルトの名無しさん mailto:sage [2010/09/28(火) 14:37:59 .net] >>376 ですが、誰もかまってくれないので寂しさで死にそうです。
397 名前:デフォルトの名無しさん mailto:sage [2010/09/28(火) 14:52:08 .net] >>391 どれでも好きなのを選べ 1. xgawkを改造 2. エラーになるXMLを事前に修正してwell-formedにしてから食わせる 3. xgawkは捨てて別の言語、ライブラリを試す
398 名前:デフォルトの名無しさん mailto:sage [2010/09/28(火) 17:23:08 .net] jawkがjwalkに見えてしまう
399 名前:デフォルトの名無しさん mailto:sage [2010/10/01(金) 11:21:26 .net] 動く環境の多さ順にインタプリタを選ぶんなら、 シェルスクリプト > awk >>> perl >>>>> python >>>>> ruby >>> haskel etc. となるだろうな。 シェルスクリプトはシェル依存な部分が多く、perl ほど高機能なものも要らない。 そんな時、小さな端末でもスマートに動いてくれる awk にちんこ勃つ。 >>389 言語に捨てるも拾うもないよ。その時々に都合の良いものを組み合わせて使うのがUNIX的な発想。
400 名前:デフォルトの名無しさん mailto:sage [2010/10/01(金) 15:33:40 .net] >>394 「一発やろう」ですね!
401 名前:デフォルトの名無しさん mailto:sage [2010/10/09(土) 04:40:48 .net] awk最近勉強してる。perlより全然簡単。 これなら俺でも挫折しなくてすみそう
402 名前:デフォルトの名無しさん mailto:sage [2010/10/09(土) 04:57:14 .net] >>396 がんば!
403 名前:デフォルトの名無しさん mailto:sage [2010/10/21(木) 20:16:46 .net] sjisで書いた /ー/{print} を実行すると awk: awk: ^ 正規表現が終端されていません。 awk: 致命的: [ または [^ が対応しません。: /[/{print}/ のエラーになってしまいます。 ーの2バイト目が[なせいだと思いますが、どう対応したらいいでしょうか? 入力ファイルはsjisで書かれていて、文字コード変換はできません。
404 名前:デフォルトの名無しさん mailto:sage [2010/10/21(木) 20:55:41 .net] >>398 環境の問題なんだから、実行環境くらいまともに書けよ。
405 名前:デフォルトの名無しさん mailto:sage [2010/10/21(木) 21:38:24 .net] >>398 gawk を使う
406 名前:デフォルトの名無しさん mailto:sage [2010/10/21(木) 22:52:57 .net] 環境はCentOS-5.5-x86_64でGNU Awk 3.1.5です。 /bin/awkはシンボリックリンクで、実体はgawkでした。
407 名前:デフォルトの名無しさん mailto:sage [2010/10/21(木) 23:49:35 .net] >>401 --help 嫁
408 名前:デフォルトの名無しさん mailto:sage [2010/10/22(金) 01:41:07 .net] Windows7(64bit)で使えるawkありますか?
409 名前:デフォルトの名無しさん mailto:sage [2010/10/22(金) 02:19:30 .net] 32bit版のawkをを使うんじゃダメ?
410 名前:398 mailto:sage [2010/10/22(金) 07:32:34 .net] こうすることで対応できました。 /\x81\[/{print}
411 名前:デフォルトの名無しさん mailto:sage [2010/10/22(金) 09:41:36 .net] それでいいなら、/ー[]/でもいい希ガス。 根本的な解決になってないけどねぇ。
412 名前:デフォルトの名無しさん mailto:sage [2010/10/22(金) 13:52:10 .net] シングルクオーテーションやダブルクオーテーションの使い分けじゃね〜
413 名前:398 mailto:sage [2010/10/22(金) 19:55:53 .net] 根本的な解決するとしたら文字コードを変えることでしょうか?
414 名前:デフォルトの名無しさん mailto:sage [2010/10/22(金) 20:03:18 .net] 日本語の文字コードに対応してるawkを使う、という方法もある。 今あるのかどうか知らないけど。
415 名前:デフォルトの名無しさん mailto:sage [2010/10/22(金) 20:28:38 .net] 今のgawkは普通にUnicode対応してるみたい $ echo 'てすと' | gawk '/[ぁ-ん]/ { print length($0) }' 3 UTF-8ロケールでしか試してないけど cygwinでも大丈夫
416 名前:デフォルトの名無しさん mailto:sage [2010/10/23(土) 01:29:00 .net] >>404 gawkでいいかな
417 名前:399 mailto:sage [2010/10/23(土) 06:55:10 .net] >>405 問題は解決したのかもしらんが、一応。 以下2つのWin用バイナリは問題ないので、ソースもらってLinux上でコンパイルしてみたら? ttp://gnuwin32.sourceforge.net/packages/gawk.htm ttp://www.kt.rim.or.jp/~kbk/gawk-3.1/
418 名前:398 mailto:sage [2010/10/23(土) 10:53:14 .net] サーバ管理者じゃないのでサーバをいじることはできないです。 これにしたらsjisでも動くようになるのでしょうか?
419 名前:デフォルトの名無しさん mailto:sage [2010/10/23(土) 12:27:19 .net] >>413 少なくとも自分が試したWindows2003上ではな。 ▽tes.awk ※sjis /ー/{print} △ CentOS5.5上 $ gawk -f tes.awk readme.ja awk: tes.awk:1: awk: tes.awk:1: ^ 正規表現が終端されていません。 awk: tes.awk:1: 致命的: [ または [^ が対応しません。: /[/{print}/ Windows2003上 > gawk -f tes.awk readme.ja ⇒マッチした物が表示される Linux上でロケールをsjis.japaneseとかにすればいいのかと思ったが、ロケール変更自体がうまくいかな
420 名前:かったわ。 困ってる事があるなら、最終的に何がしたいか言ったほうがいいよ。 [] [ここ壊れてます]
421 名前:398 mailto:sage [2010/10/23(土) 12:40:31 .net] Windows2003だとちゃんと動くんですね。 困っていたことは405で解決したので大丈夫です。 今は「根本的な解決」に興味があったのでお聞きした次第です。
422 名前:初心者 [2010/11/04(木) 22:14:10 .net] awkでシェルのPATH変数をマッチさせるときにスラッシュ//を使わない方法を教えていただけませんか?
423 名前:デフォルトの名無しさん mailto:sage [2010/11/04(木) 23:14:10 .net] >>416 初心者だからマルチが許されるとでも思ったか?
424 名前:初心者 [2010/11/05(金) 06:32:09 .net] ごめんなさい! 知りませんでした。
425 名前:デフォルトの名無しさん mailto:sage [2010/12/15(水) 01:54:35 .net] 配列の要素数を調べるなら、ループ処理しないと分からない? length みたいなのは無い?
426 名前:デフォルトの名無しさん mailto:sage [2010/12/15(水) 02:27:50 .net] あるよ。まさしく、length(array)。
427 名前:デフォルトの名無しさん mailto:sage [2010/12/15(水) 02:42:46 .net] そんなもんねぇよw と思ったらgawkにはあるのか length([s]) Returns the length of the string s, or the length of $0 if s is not supplied. Starting with version 3.1.5, as a non-standard exten- sion, with an array argument, length() returns the number of elements in the array.
428 名前:デフォルトの名無しさん mailto:sage [2010/12/15(水) 04:20:37 .net] むしろ配列が存在するってことはその配列を作成する過程があるだろ? 作成するときに数えればいいんじゃね?
429 名前:デフォルトの名無しさん mailto:sage [2010/12/15(水) 08:40:15 .net] 連想配列だったら数えないのが普通だがな
430 名前:419 mailto:sage [2010/12/25(土) 03:12:23 .net] function で処理する時、配列だけではダメで要素数まで必要なんだかなぁ、 って事が分かりますた
431 名前:デフォルトの名無しさん [2010/12/28(火) 11:29:35 .net] function に渡すだけなら要素数なんていらないんじゃない?
432 名前:デフォルトの名無しさん [2010/12/28(火) 13:55:13 .net] $1 = $1みたいなトリックを見る度に奥が深いと言うよりは糞に見えてきます 翻すとUNIX文化そのものが まあ、あくまでおれの主観ですがね
433 名前:デフォルトの名無しさん mailto:sage [2010/12/28(火) 15:24:21 .net] >>426 awk大好きなオイラに喧嘩売るのかw ウニックス文化最高!(NT系はUNIXのパクリ)
434 名前:デフォルトの名無しさん mailto:sage [2010/12/28(火) 15:28:13 .net] >>427 全角英字使う奴が awk 大好きだとは到底思えん
435 名前:デフォルトの名無しさん mailto:sage [2011/01/05(水) 23:22:55 .net] まあ冬休み期間だものね。
436 名前:デフォルトの名無しさん mailto:sage [2011/01/06(木) 00:22:04 .net] ▼tes09.awk BEGIN{ if (ARGV[1]=="") ARGV[1]="hoge.txt" while (getline < ARGV[1] > 0) print "BEGIN\t"$0 } ARGV[1]=="hoge.txt"{ print "BODY\t"$0 } ★質問 上記スクリプトを引数を付けた場合と付けない場合をそれぞれ実行しました。 ▼gawk -f tes09.awk hoge.txt BEGIN arima_yuuichi@example.com BEGIN ooizumi_sadawo@example.com BEGIN taguchi_kenji@example.com BODY arima_yuuichi@example.com BODY ooizumi_sadawo@example.com BODY taguchi_kenji@example.com ▼gawk -f tes09.awk BEGIN arima_yuuichi@example.com BEGIN ooizumi_sadawo@example.com BEGIN taguchi_kenji@example.com ここで、BEGIN句での ARGV[1]="hoge.txt" という代入を本編(?)でも有効にする為 にはどうすればいいでしょうか?
437 名前:デフォルトの名無しさん mailto:sage [2011/01/06(木) 00:31:45 .net] なにもしなくても有効だと思うんだけど 質問の趣旨がわからん
438 名前:430 mailto:sage [2011/01/06(木) 06:20:53 .net] 分かり辛くてすみません。 hoge.txtの中身は下記です。 ▼ arima_yuuichi@example.com ooizumi_sadawo@example.com taguchi_kenji@example.com >>430 はWin32のバイナリ「GNU Awk 3.1.7(windows special Nov 24 2009)」を使用した結果です。 下のほうの実行結果では、BEGIN句でのARGV[1]への代入はBEGIN句では有効ですが、 本編では有効になっていないので出力されていないように見えます。 ちなみに、CentOS5.5上の GNU Awk 3.1.5 では下記エラーになりました。 ▼ gawk: tes09.awk:2: if (ARGV[1]=="") gawk: tes09.awk:2: ^ 表現の char '・' は不正です。
439 名前:デフォルトの名無しさん mailto:sage [2011/01/06(木) 08:57:49 .net] 入力レコードが1件も無いからでしょ >gawk: tes09.awk:2: ^ 表現の char '・' は不正です。 これは全角スペース
440 名前:デフォルトの名無しさん mailto:sage [2011/01/06(木) 09:12:00 .net] >BEGIN arima_yuuichi@example.com >BEGIN ooizumi_sadawo@example.com >BEGIN taguchi_kenji@example.com コレはgetlineで読んで出力したもの >BODY arima_yuuichi@example.com >BODY ooizumi_sadawo@example.com >BODY taguchi_kenji@example.com コレはコマンドで指定したファイルから出力したもの たとえば { print "BODY\t"$0 } としてやれば明らか
441 名前:デフォルトの名無しさん [2011/01/06(木) 13:46:53 .net] 質問の趣旨は、プログラム(スクリプト)の中で入力ファイル等の コマンドライン引数を追加したいという事ですか。 コマンドライン引数の配列は ARGV ですが、コマンドライン引数の 個数を格納する ARGC という組み込み変数があります。 ARGV配列を追加したら一緒に ARGC を修正してあげないと、awkは配列が 追加された事を認識しません。 BEGIN内でARGV配列を追加した分だけARGCをインクルメントしてあげれば 追加されたARGV配列で指定されたファイルも本文の処理に渡されます。 蛇足としては、 現在処理中のファイル名が格納されている配列 ARGV のインデックスを 示す組み込み変数は ARGIND です。 私のは Win版の gawkm115 です。スクリプト内でARGV/ARGCを操作しても 期待通り正常に動きますよ。 試してみてね。
442 名前:430 mailto:sage [2011/01/06(木) 23:56:01 .net] 皆様レスありがとうございます。 >>433 >これは全角スペース お恥ずかしい限りです(汗) 出勤前に思いつきで試したもので、スレ用に書いた 物をそのままコピってました・・・ >>434 BEGIN句のgetlineではARGV[1]への代入ができているのに、本文では有効に ならないという事を伝えたかったのです。
443 名前:430 mailto:sage [2011/01/06(木) 23:56:17 .net] >>435 自分の質問を見直してみると全く質問になっていなかったにも関わらずエスパー してくださってありがとうございます。 ARGCについて理解できました。 BEGIN{ ARGV[1]="hoge.txt" ARGC=2 } ARGV[1]=="hoge.txt"{ print "BODY\t"$0 } こんな感じで意図した通りに出力されました。 おかげさまで今までawkの補助としてshを使ってましたが、awkだけで書ける事が 多くなりました。 引数にワイルドカードを指定して、ARGIND で特定パターンのファイル名の 物のみ処理をするとかできそうですね。
444 名前:デフォルトの名無しさん mailto:sage [2011/01/09(日) 22:38:39 .net] 質問です。 My Documents\2011\01\09(日) というようにフォルダを切っていて、今日にcdするために、 today.bat gawk -f today.awk > tmp.bat tmp.bat del tmp.bat today.awk BEGIN{year = strftime("%Y",systime()+9*60*60); month = strftime("%m",systime()+9*60*60); date = strftime("%d",systime()+9*60*60); day = strftime("%a",systime()+9*60*60); gsub(/(Sun)/, "(日)", day); gsub(/(Mon)/, "(月)", day); gsub(/(Tue)/, "(火)", day); gsub(/(Wed)/, "(水)", day); gsub(/(Thu)/, "(木)", day); gsub(/(Fri)/, "(金)", day); gsub(/(Sat)/, "(土)", day); print "cd \"My Documents\" year "\" month "\" date day } というように処理しています。 これって、ひょっとして、gawkの内部からprintせずに実行することは可能でしょうか?
445 名前:デフォルトの名無しさん mailto:sage [2011/01/09(日) 22:54:33 .net] system関数で出来るんでは?winは分からないけど
446 名前:デフォルトの名無しさん mailto:sage [2011/01/09(日) 23:06:13 .net] system("cd \"My Documents\" year "\" month "\" date day); とかではだめでした。
447 名前:デフォルトの名無しさん mailto:sage [2011/01/10(月) 03:54:21 .net] >440 なんか " と \ の数がおかしくね? My Documents\2011\01\09(日) ↓ "My Documents\\2011\\01\\09(日)" ↓ "My Documents\\" year "\\" month "\\" date day だよな?
448 名前:デフォルトの名無しさん mailto:sage [2011/01/10(月) 11:42:11 .net] アドバイスありがとうございます。 はい。 \はおっしゃるとおりですが、依然としてだめです。 today.batをコマンドプロンプトから実行すると、 printしてそのtmp.batを実行する438のパターンだと、 ちゃんとcdできて、今日のフォルダに移動するのですが、 system("cd \\"My Documents\\" year "\\" month "\\" date day); だと、移動せずに終了してしまいます。 なんでだろーな。
449 名前:デフォルトの名無しさん mailto:sage [2011/01/10(月) 12:32:20 .net] cygwinを入れてやってみた systemはshで動くっぽいので rm /cygdrive/c/Documents\ and\ Settings/test.txt みたいに書くとちゃんと消えるみたい
450 名前:デフォルトの名無しさん mailto:sage [2011/01/10(月) 13:24:47 .net] >>438 ,442 438で書いてるgawkでやりたいことってのはバッチファイルでやってるのと同じこと? だったら無理。 system() でcdしてもsystem()から返ってきたところで元に戻る。
451 名前:デフォルトの名無しさん mailto:sage [2011/01/11(火) 01:15:49 .net] どうせ糞nixツールだから日本語や空白はダメなんだろ
452 名前:デフォルトの名無しさん mailto:sage [2011/01/11(火) 09:05:01 .net] >>444 なるほど。gawk内部ではシステムを実行していても、gawkを出ると、それも終わっちゃうんですね。なるほど。 よくわかりました。ありがとうございます。
453 名前:デフォルトの名無しさん mailto:sage [2011/01/19(水) 02:44:33 .net] とりあえずAWKで書いた巨大なスクリプトを、鯖で回し続けるのはやめてください。 非効率極まりない
454 名前:デフォルトの名無しさん mailto:sage [2011/01/19(水) 15:27:12 .net] それはその人に言って下さい
455 名前:デフォルトの名無しさん mailto:sage [2011/01/19(水) 21:03:10 .net] その場で使えるのがawkだけだったんです
456 名前:デフォルトの名無しさん [2011/01/19(水) 23:56:54 .net] 文字から文字コード取り出せないのが残念 逆はsprintf("%c", 0x41)とか出来るのにな
457 名前:430 mailto:sage [2011/01/20(木) 00:40:40 .net] >>447 効率のいいプログラムで書き直してやればいいじゃない。
458 名前:デフォルトの名無しさん mailto:sage [2011/01/20(木) 09:05:02 .net] >>450 つord.awk gawk付属のライブラリで、asciiの範囲の対応表作ってひくという 簡単な仕組み。
459 名前:デフォルトの名無しさん mailto:sage [2011/01/20(木) 23:49:13 .net] #!/bin/gawk --re-interval -f ↑のファイルを実行するとオプションが不正と言われて実行できないのですが コマンドラインのオプションで指定する以外にやり方はありますか?
460 名前:デフォルトの名無しさん mailto:sage [2011/01/21(金) 05:12:58 .net] >>453 無理にawkスクリプトにせずに #!/bin/sh awk ' #awkコード ' っていうシェルスクリプトにしたらどうかな
461 名前:デフォルトの名無しさん mailto:sage [2011/01/21(金) 08:45:02 .net] #!でインタプリタに渡す引数の扱いは実装依存だからな。 linuxだと空白を含んだ全ての文字列が一つの引数として 渡されるので、複数のオプションは渡せない。不便だけど そういうものなのであきらめてください。素直にシェルを 間に入れるのがいいと思うよ。
462 名前:デフォルトの名無しさん mailto:sage [2011/01/21(金) 12:45:00 .net] gawk '$3!="*"' in.txt>out.txt という処理で、20GBぐらいのin.txtを数百MBぐらいにスリムアップしてます。 問題は、その処理を10本ほど並行に作業させているんですが topで見てみるとほとんどのgawkプロセスがsleepかstackedになっていて あんまりもりもり働いてくれません。IOが律速なのでしょうか? CPUもメモリも最大限積んでます。
463 名前:デフォルトの名無しさん mailto:sage [2011/01/21(金) 12:50:02 .net] stacked -> stuckでした。すいません。
464 名前:デフォルトの名無しさん [2011/01/21(金) 13:26:09 .net] '$3!="*"' これって書き間違い?
465 名前:デフォルトの名無しさん mailto:sage [2011/01/21(金) 13:47:33 .net] 削られるデータの例 745_17_70_F3 4 * 0 0 * * 0 0 GGAGTGCCCCACACTTGGAGGCGAGCGCCCGGCAGACTTCCCCGCCGCC &+))8'1%+%-%%'((-)%%)8+,&+*7'+/%5''%%%%%-')-/'%/( XM:i:0 残るデータの例 745_377_43_F3 0 chr1 181855450 255 48M * 0 0 CATGTATGTGGCCAAAGGAACAACGCTATGTTTCCTAAAAGGCCTAGA G`[[`a`ab`^\ZYZ[SIR\Z[L7I_L>HU^bOKSDES[PO9-HNG7= XA:i:2 MD:Z:26C21 NM:i:1 CM:i:3 こういうのが80万行ぐらいあるようです。
466 名前:デフォルトの名無しさん [2011/01/21(金) 13:52:48 .net] スクリプトの中身は実際は違うわけね たぶん、データの格納場所がプログラム実行マシンと別のマシンの ディスクなんじゃないかな。 ネットワークがビジー状態だと思う。
467 名前:453 mailto:sage [2011/01/21(金) 16:09:37 .net] >454-455 ありがとうございました。 挙動を変える組み込み変数も無いようですね。
468 名前:デフォルトの名無しさん [2011/01/21(金) 16:47:10 .net] とりあえず df コマンドで作業ディレクトリと /var/tmp の空き領域が 確保されていることと、出力ファイルのサイズやタイムスタンプが徐々に 更新されていることを確認するくらいしかないんじゃないかな。 ローカルディスクでやればもっと早いと思うけど。
469 名前:デフォルトの名無しさん mailto:sage [2011/01/21(金) 17:42:04 .net] >>460 なるほど。 xgridをつかって、2台のマシンで10本ずつほど並行してgawkを走らせておりました。 NFSをつかって5GBほどの(先ほどは20GBと書きましたが間違いです)in.txtの のデータを読み込んで、処理後のデータをout.txtに書き出しているので、 ネットワークビジーになってしまうというわけですね。 ネットワークの問題とは。。。 一応、エラーでこけることなく、しゅくしゅくと処理は進むので気にしないことにします。
470 名前:デフォルトの名無しさん mailto:sage [2011/01/21(金) 17:44:39 .net] 2台のマシンで20本でした(10+11)。。。 一プロセスあたり5GBのファイルを読み込むので、ネットワークが悲鳴を上げていると。
471 名前:デフォルトの名無しさん mailto:sage [2011/01/24(月) 21:31:50 .net] 今年、gawkを大学で習って色々弄ってるんだけど、perlとかより自由度が低いと言われた。そんなに差があるの?
472 名前:デフォルトの名無しさん mailto:sage [2011/01/24(月) 21:46:54 .net] >>465 簡易言語として捉えるかツールとして捉えるかの違いじゃね〜 俺パールよりオークの方が好きだけど。
473 名前:デフォルトの名無しさん mailto:sage [2011/01/24(月) 22:19:29 .net] >>466 なるほど。まぁ、そんなに複雑なことをこなすスキルを持ち合わせてないからもう暫くawkで遊んでみるか。
474 名前:デフォルトの名無しさん mailto:sage [2011/01/24(月) 23:30:11 .net] 自由度というよりは機能が少ないじゃないのか?