腐っても鯛? 騏も老いては駑馬に劣る?
三人の碩学が生み出したスクリプト言語AWKについて語るスレ
◆ 前スレ
awkについて語るスレ
http://pc10.2ch.net/test/read.cgi/tech/1023556171/
◆ 関係スレ
シェルスクリプト相談室
http://pc10.2ch.net/test/read.cgi/tech/1112553783/
AWKでCGI
http://pc10.2ch.net/test/read.cgi/php/1171804314/
【sed】シェルスクリプト総合@LINUX Part2【awk】
http://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/
探検
awkについて語るスレ $2
■ このスレッドは過去ログ倉庫に格納されています
2007/02/23(金) 23:55:42
390デフォルトの名無しさん
2010/09/28(火) 09:40:13 Busyboxに組み込めば、それこそ炊飯器や冷蔵庫でも動くからなあ。
手軽であるにも関わらず、結構高度な処理もガリガリ書けるから好き。
Cとシェルスクリプトが好きだから、文法的にもしっくり来る。
上位互換のPerlも大好き。
手軽であるにも関わらず、結構高度な処理もガリガリ書けるから好き。
Cとシェルスクリプトが好きだから、文法的にもしっくり来る。
上位互換のPerlも大好き。
391デフォルトの名無しさん
2010/09/28(火) 14:37:59 >>376ですが、誰もかまってくれないので寂しさで死にそうです。
392デフォルトの名無しさん
2010/09/28(火) 14:52:08393デフォルトの名無しさん
2010/09/28(火) 17:23:08 jawkがjwalkに見えてしまう
394デフォルトの名無しさん
2010/10/01(金) 11:21:26 動く環境の多さ順にインタプリタを選ぶんなら、
シェルスクリプト > awk >>> perl >>>>> python >>>>> ruby >>> haskel etc.
となるだろうな。
シェルスクリプトはシェル依存な部分が多く、perl ほど高機能なものも要らない。
そんな時、小さな端末でもスマートに動いてくれる awk にちんこ勃つ。
>>389
言語に捨てるも拾うもないよ。その時々に都合の良いものを組み合わせて使うのがUNIX的な発想。
シェルスクリプト > awk >>> perl >>>>> python >>>>> ruby >>> haskel etc.
となるだろうな。
シェルスクリプトはシェル依存な部分が多く、perl ほど高機能なものも要らない。
そんな時、小さな端末でもスマートに動いてくれる awk にちんこ勃つ。
>>389
言語に捨てるも拾うもないよ。その時々に都合の良いものを組み合わせて使うのがUNIX的な発想。
395デフォルトの名無しさん
2010/10/01(金) 15:33:40 >>394
「一発やろう」ですね!
「一発やろう」ですね!
396デフォルトの名無しさん
2010/10/09(土) 04:40:48 awk最近勉強してる。perlより全然簡単。
これなら俺でも挫折しなくてすみそう
これなら俺でも挫折しなくてすみそう
397デフォルトの名無しさん
2010/10/09(土) 04:57:14 >>396 がんば!
398デフォルトの名無しさん
2010/10/21(木) 20:16:46 sjisで書いた
/ー/{print}
を実行すると
awk:
awk: ^ 正規表現が終端されていません。
awk: 致命的: [ または [^ が対応しません。: /[/{print}/
のエラーになってしまいます。
ーの2バイト目が[なせいだと思いますが、どう対応したらいいでしょうか?
入力ファイルはsjisで書かれていて、文字コード変換はできません。
/ー/{print}
を実行すると
awk:
awk: ^ 正規表現が終端されていません。
awk: 致命的: [ または [^ が対応しません。: /[/{print}/
のエラーになってしまいます。
ーの2バイト目が[なせいだと思いますが、どう対応したらいいでしょうか?
入力ファイルはsjisで書かれていて、文字コード変換はできません。
399デフォルトの名無しさん
2010/10/21(木) 20:55:41 >>398
環境の問題なんだから、実行環境くらいまともに書けよ。
環境の問題なんだから、実行環境くらいまともに書けよ。
400デフォルトの名無しさん
2010/10/21(木) 21:38:24 >>398
gawk を使う
gawk を使う
401デフォルトの名無しさん
2010/10/21(木) 22:52:57 環境はCentOS-5.5-x86_64でGNU Awk 3.1.5です。
/bin/awkはシンボリックリンクで、実体はgawkでした。
/bin/awkはシンボリックリンクで、実体はgawkでした。
402デフォルトの名無しさん
2010/10/21(木) 23:49:35 >>401
--help 嫁
--help 嫁
403デフォルトの名無しさん
2010/10/22(金) 01:41:07 Windows7(64bit)で使えるawkありますか?
404デフォルトの名無しさん
2010/10/22(金) 02:19:30 32bit版のawkをを使うんじゃダメ?
405398
2010/10/22(金) 07:32:34 こうすることで対応できました。
/\x81\[/{print}
/\x81\[/{print}
406デフォルトの名無しさん
2010/10/22(金) 09:41:36 それでいいなら、/ー[]/でもいい希ガス。
根本的な解決になってないけどねぇ。
根本的な解決になってないけどねぇ。
407デフォルトの名無しさん
2010/10/22(金) 13:52:10 シングルクオーテーションやダブルクオーテーションの使い分けじゃね〜
408398
2010/10/22(金) 19:55:53 根本的な解決するとしたら文字コードを変えることでしょうか?
409デフォルトの名無しさん
2010/10/22(金) 20:03:18 日本語の文字コードに対応してるawkを使う、という方法もある。
今あるのかどうか知らないけど。
今あるのかどうか知らないけど。
410デフォルトの名無しさん
2010/10/22(金) 20:28:38 今のgawkは普通にUnicode対応してるみたい
$ echo 'てすと' | gawk '/[ぁ-ん]/ { print length($0) }'
3
UTF-8ロケールでしか試してないけど
cygwinでも大丈夫
$ echo 'てすと' | gawk '/[ぁ-ん]/ { print length($0) }'
3
UTF-8ロケールでしか試してないけど
cygwinでも大丈夫
411デフォルトの名無しさん
2010/10/23(土) 01:29:00 >>404
gawkでいいかな
gawkでいいかな
412399
2010/10/23(土) 06:55:10 >>405
問題は解決したのかもしらんが、一応。
以下2つのWin用バイナリは問題ないので、ソースもらってLinux上でコンパイルしてみたら?
ttp://gnuwin32.sourceforge.net/packages/gawk.htm
ttp://www.kt.rim.or.jp/~kbk/gawk-3.1/
問題は解決したのかもしらんが、一応。
以下2つのWin用バイナリは問題ないので、ソースもらってLinux上でコンパイルしてみたら?
ttp://gnuwin32.sourceforge.net/packages/gawk.htm
ttp://www.kt.rim.or.jp/~kbk/gawk-3.1/
413398
2010/10/23(土) 10:53:14 サーバ管理者じゃないのでサーバをいじることはできないです。
これにしたらsjisでも動くようになるのでしょうか?
これにしたらsjisでも動くようになるのでしょうか?
414デフォルトの名無しさん
2010/10/23(土) 12:27:19 >>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とかにすればいいのかと思ったが、ロケール変更自体がうまくいかなかったわ。
困ってる事があるなら、最終的に何がしたいか言ったほうがいいよ。
少なくとも自分が試した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とかにすればいいのかと思ったが、ロケール変更自体がうまくいかなかったわ。
困ってる事があるなら、最終的に何がしたいか言ったほうがいいよ。
415398
2010/10/23(土) 12:40:31 Windows2003だとちゃんと動くんですね。
困っていたことは405で解決したので大丈夫です。
今は「根本的な解決」に興味があったのでお聞きした次第です。
困っていたことは405で解決したので大丈夫です。
今は「根本的な解決」に興味があったのでお聞きした次第です。
416初心者
2010/11/04(木) 22:14:10 awkでシェルのPATH変数をマッチさせるときにスラッシュ//を使わない方法を教えていただけませんか?
417デフォルトの名無しさん
2010/11/04(木) 23:14:10 >>416
初心者だからマルチが許されるとでも思ったか?
初心者だからマルチが許されるとでも思ったか?
418初心者
2010/11/05(金) 06:32:09 ごめんなさい!
知りませんでした。
知りませんでした。
419デフォルトの名無しさん
2010/12/15(水) 01:54:35 配列の要素数を調べるなら、ループ処理しないと分からない?
length みたいなのは無い?
length みたいなのは無い?
420デフォルトの名無しさん
2010/12/15(水) 02:27:50 あるよ。まさしく、length(array)。
421デフォルトの名無しさん
2010/12/15(水) 02:42:46 そんなもんねぇよ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.
と思ったら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.
422デフォルトの名無しさん
2010/12/15(水) 04:20:37 むしろ配列が存在するってことはその配列を作成する過程があるだろ?
作成するときに数えればいいんじゃね?
作成するときに数えればいいんじゃね?
423デフォルトの名無しさん
2010/12/15(水) 08:40:15 連想配列だったら数えないのが普通だがな
424419
2010/12/25(土) 03:12:23 function で処理する時、配列だけではダメで要素数まで必要なんだかなぁ、
って事が分かりますた
って事が分かりますた
425デフォルトの名無しさん
2010/12/28(火) 11:29:35 function に渡すだけなら要素数なんていらないんじゃない?
426デフォルトの名無しさん
2010/12/28(火) 13:55:13 $1 = $1みたいなトリックを見る度に奥が深いと言うよりは糞に見えてきます
翻すとUNIX文化そのものが
まあ、あくまでおれの主観ですがね
翻すとUNIX文化そのものが
まあ、あくまでおれの主観ですがね
427デフォルトの名無しさん
2010/12/28(火) 15:24:21428デフォルトの名無しさん
2010/12/28(火) 15:28:13 >>427
全角英字使う奴が awk 大好きだとは到底思えん
全角英字使う奴が awk 大好きだとは到底思えん
429デフォルトの名無しさん
2011/01/05(水) 23:22:55 まあ冬休み期間だものね。
430デフォルトの名無しさん
2011/01/06(木) 00:22:04 ▼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" という代入を本編(?)でも有効にする為
にはどうすればいいでしょうか?
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" という代入を本編(?)でも有効にする為
にはどうすればいいでしょうか?
431デフォルトの名無しさん
2011/01/06(木) 00:31:45 なにもしなくても有効だと思うんだけど
質問の趣旨がわからん
質問の趣旨がわからん
432430
2011/01/06(木) 06:20:53 分かり辛くてすみません。
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 '・' は不正です。
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 '・' は不正です。
433デフォルトの名無しさん
2011/01/06(木) 08:57:49 入力レコードが1件も無いからでしょ
>gawk: tes09.awk:2: ^ 表現の char '・' は不正です。
これは全角スペース
>gawk: tes09.awk:2: ^ 表現の char '・' は不正です。
これは全角スペース
434デフォルトの名無しさん
2011/01/06(木) 09:12:00 >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
}
としてやれば明らか
>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
}
としてやれば明らか
435デフォルトの名無しさん
2011/01/06(木) 13:46:53 質問の趣旨は、プログラム(スクリプト)の中で入力ファイル等の
コマンドライン引数を追加したいという事ですか。
コマンドライン引数の配列は ARGV ですが、コマンドライン引数の
個数を格納する ARGC という組み込み変数があります。
ARGV配列を追加したら一緒に ARGC を修正してあげないと、awkは配列が
追加された事を認識しません。
BEGIN内でARGV配列を追加した分だけARGCをインクルメントしてあげれば
追加されたARGV配列で指定されたファイルも本文の処理に渡されます。
蛇足としては、
現在処理中のファイル名が格納されている配列 ARGV のインデックスを
示す組み込み変数は ARGIND です。
私のは Win版の gawkm115 です。スクリプト内でARGV/ARGCを操作しても
期待通り正常に動きますよ。
試してみてね。
コマンドライン引数を追加したいという事ですか。
コマンドライン引数の配列は ARGV ですが、コマンドライン引数の
個数を格納する ARGC という組み込み変数があります。
ARGV配列を追加したら一緒に ARGC を修正してあげないと、awkは配列が
追加された事を認識しません。
BEGIN内でARGV配列を追加した分だけARGCをインクルメントしてあげれば
追加されたARGV配列で指定されたファイルも本文の処理に渡されます。
蛇足としては、
現在処理中のファイル名が格納されている配列 ARGV のインデックスを
示す組み込み変数は ARGIND です。
私のは Win版の gawkm115 です。スクリプト内でARGV/ARGCを操作しても
期待通り正常に動きますよ。
試してみてね。
436430
2011/01/06(木) 23:56:01437430
2011/01/06(木) 23:56:17 >>435
自分の質問を見直してみると全く質問になっていなかったにも関わらずエスパー
してくださってありがとうございます。
ARGCについて理解できました。
BEGIN{
ARGV[1]="hoge.txt"
ARGC=2
}
ARGV[1]=="hoge.txt"{
print "BODY\t"$0
}
こんな感じで意図した通りに出力されました。
おかげさまで今までawkの補助としてshを使ってましたが、awkだけで書ける事が
多くなりました。
引数にワイルドカードを指定して、ARGIND で特定パターンのファイル名の
物のみ処理をするとかできそうですね。
自分の質問を見直してみると全く質問になっていなかったにも関わらずエスパー
してくださってありがとうございます。
ARGCについて理解できました。
BEGIN{
ARGV[1]="hoge.txt"
ARGC=2
}
ARGV[1]=="hoge.txt"{
print "BODY\t"$0
}
こんな感じで意図した通りに出力されました。
おかげさまで今までawkの補助としてshを使ってましたが、awkだけで書ける事が
多くなりました。
引数にワイルドカードを指定して、ARGIND で特定パターンのファイル名の
物のみ処理をするとかできそうですね。
438デフォルトの名無しさん
2011/01/09(日) 22:38:39 質問です。
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せずに実行することは可能でしょうか?
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せずに実行することは可能でしょうか?
439デフォルトの名無しさん
2011/01/09(日) 22:54:33 system関数で出来るんでは?winは分からないけど
440デフォルトの名無しさん
2011/01/09(日) 23:06:13 system("cd \"My Documents\" year "\" month "\" date day);
とかではだめでした。
とかではだめでした。
441デフォルトの名無しさん
2011/01/10(月) 03:54:21 >440
なんか " と \ の数がおかしくね?
My Documents\2011\01\09(日)
↓
"My Documents\\2011\\01\\09(日)"
↓
"My Documents\\" year "\\" month "\\" date day
だよな?
なんか " と \ の数がおかしくね?
My Documents\2011\01\09(日)
↓
"My Documents\\2011\\01\\09(日)"
↓
"My Documents\\" year "\\" month "\\" date day
だよな?
442デフォルトの名無しさん
2011/01/10(月) 11:42:11 アドバイスありがとうございます。
はい。
\はおっしゃるとおりですが、依然としてだめです。
today.batをコマンドプロンプトから実行すると、
printしてそのtmp.batを実行する438のパターンだと、
ちゃんとcdできて、今日のフォルダに移動するのですが、
system("cd \\"My Documents\\" year "\\" month "\\" date day);
だと、移動せずに終了してしまいます。
なんでだろーな。
はい。
\はおっしゃるとおりですが、依然としてだめです。
today.batをコマンドプロンプトから実行すると、
printしてそのtmp.batを実行する438のパターンだと、
ちゃんとcdできて、今日のフォルダに移動するのですが、
system("cd \\"My Documents\\" year "\\" month "\\" date day);
だと、移動せずに終了してしまいます。
なんでだろーな。
443デフォルトの名無しさん
2011/01/10(月) 12:32:20 cygwinを入れてやってみた
systemはshで動くっぽいので
rm /cygdrive/c/Documents\ and\ Settings/test.txt
みたいに書くとちゃんと消えるみたい
systemはshで動くっぽいので
rm /cygdrive/c/Documents\ and\ Settings/test.txt
みたいに書くとちゃんと消えるみたい
444デフォルトの名無しさん
2011/01/10(月) 13:24:47 >>438,442
438で書いてるgawkでやりたいことってのはバッチファイルでやってるのと同じこと?
だったら無理。
system() でcdしてもsystem()から返ってきたところで元に戻る。
438で書いてるgawkでやりたいことってのはバッチファイルでやってるのと同じこと?
だったら無理。
system() でcdしてもsystem()から返ってきたところで元に戻る。
445デフォルトの名無しさん
2011/01/11(火) 01:15:49 どうせ糞nixツールだから日本語や空白はダメなんだろ
446デフォルトの名無しさん
2011/01/11(火) 09:05:01447デフォルトの名無しさん
2011/01/19(水) 02:44:33 とりあえずAWKで書いた巨大なスクリプトを、鯖で回し続けるのはやめてください。
非効率極まりない
非効率極まりない
448デフォルトの名無しさん
2011/01/19(水) 15:27:12 それはその人に言って下さい
449デフォルトの名無しさん
2011/01/19(水) 21:03:10 その場で使えるのがawkだけだったんです
450デフォルトの名無しさん
2011/01/19(水) 23:56:54 文字から文字コード取り出せないのが残念
逆はsprintf("%c", 0x41)とか出来るのにな
逆はsprintf("%c", 0x41)とか出来るのにな
452デフォルトの名無しさん
2011/01/20(木) 09:05:02453デフォルトの名無しさん
2011/01/20(木) 23:49:13 #!/bin/gawk --re-interval -f
↑のファイルを実行するとオプションが不正と言われて実行できないのですが
コマンドラインのオプションで指定する以外にやり方はありますか?
↑のファイルを実行するとオプションが不正と言われて実行できないのですが
コマンドラインのオプションで指定する以外にやり方はありますか?
454デフォルトの名無しさん
2011/01/21(金) 05:12:58455デフォルトの名無しさん
2011/01/21(金) 08:45:02 #!でインタプリタに渡す引数の扱いは実装依存だからな。
linuxだと空白を含んだ全ての文字列が一つの引数として
渡されるので、複数のオプションは渡せない。不便だけど
そういうものなのであきらめてください。素直にシェルを
間に入れるのがいいと思うよ。
linuxだと空白を含んだ全ての文字列が一つの引数として
渡されるので、複数のオプションは渡せない。不便だけど
そういうものなのであきらめてください。素直にシェルを
間に入れるのがいいと思うよ。
456デフォルトの名無しさん
2011/01/21(金) 12:45:00 gawk '$3!="*"' in.txt>out.txt
という処理で、20GBぐらいのin.txtを数百MBぐらいにスリムアップしてます。
問題は、その処理を10本ほど並行に作業させているんですが
topで見てみるとほとんどのgawkプロセスがsleepかstackedになっていて
あんまりもりもり働いてくれません。IOが律速なのでしょうか?
CPUもメモリも最大限積んでます。
という処理で、20GBぐらいのin.txtを数百MBぐらいにスリムアップしてます。
問題は、その処理を10本ほど並行に作業させているんですが
topで見てみるとほとんどのgawkプロセスがsleepかstackedになっていて
あんまりもりもり働いてくれません。IOが律速なのでしょうか?
CPUもメモリも最大限積んでます。
457デフォルトの名無しさん
2011/01/21(金) 12:50:02 stacked -> stuckでした。すいません。
458デフォルトの名無しさん
2011/01/21(金) 13:26:09 '$3!="*"'
これって書き間違い?
これって書き間違い?
459デフォルトの名無しさん
2011/01/21(金) 13:47:33 削られるデータの例
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万行ぐらいあるようです。
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万行ぐらいあるようです。
460デフォルトの名無しさん
2011/01/21(金) 13:52:48 スクリプトの中身は実際は違うわけね
たぶん、データの格納場所がプログラム実行マシンと別のマシンの
ディスクなんじゃないかな。
ネットワークがビジー状態だと思う。
たぶん、データの格納場所がプログラム実行マシンと別のマシンの
ディスクなんじゃないかな。
ネットワークがビジー状態だと思う。
461453
2011/01/21(金) 16:09:37 >454-455
ありがとうございました。
挙動を変える組み込み変数も無いようですね。
ありがとうございました。
挙動を変える組み込み変数も無いようですね。
462デフォルトの名無しさん
2011/01/21(金) 16:47:10 とりあえず df コマンドで作業ディレクトリと /var/tmp の空き領域が
確保されていることと、出力ファイルのサイズやタイムスタンプが徐々に
更新されていることを確認するくらいしかないんじゃないかな。
ローカルディスクでやればもっと早いと思うけど。
確保されていることと、出力ファイルのサイズやタイムスタンプが徐々に
更新されていることを確認するくらいしかないんじゃないかな。
ローカルディスクでやればもっと早いと思うけど。
463デフォルトの名無しさん
2011/01/21(金) 17:42:04 >>460
なるほど。
xgridをつかって、2台のマシンで10本ずつほど並行してgawkを走らせておりました。
NFSをつかって5GBほどの(先ほどは20GBと書きましたが間違いです)in.txtの
のデータを読み込んで、処理後のデータをout.txtに書き出しているので、
ネットワークビジーになってしまうというわけですね。
ネットワークの問題とは。。。
一応、エラーでこけることなく、しゅくしゅくと処理は進むので気にしないことにします。
なるほど。
xgridをつかって、2台のマシンで10本ずつほど並行してgawkを走らせておりました。
NFSをつかって5GBほどの(先ほどは20GBと書きましたが間違いです)in.txtの
のデータを読み込んで、処理後のデータをout.txtに書き出しているので、
ネットワークビジーになってしまうというわけですね。
ネットワークの問題とは。。。
一応、エラーでこけることなく、しゅくしゅくと処理は進むので気にしないことにします。
464デフォルトの名無しさん
2011/01/21(金) 17:44:39 2台のマシンで20本でした(10+11)。。。
一プロセスあたり5GBのファイルを読み込むので、ネットワークが悲鳴を上げていると。
一プロセスあたり5GBのファイルを読み込むので、ネットワークが悲鳴を上げていると。
465デフォルトの名無しさん
2011/01/24(月) 21:31:50 今年、gawkを大学で習って色々弄ってるんだけど、perlとかより自由度が低いと言われた。そんなに差があるの?
466デフォルトの名無しさん
2011/01/24(月) 21:46:54467デフォルトの名無しさん
2011/01/24(月) 22:19:29 >>466
なるほど。まぁ、そんなに複雑なことをこなすスキルを持ち合わせてないからもう暫くawkで遊んでみるか。
なるほど。まぁ、そんなに複雑なことをこなすスキルを持ち合わせてないからもう暫くawkで遊んでみるか。
468デフォルトの名無しさん
2011/01/24(月) 23:30:11 自由度というよりは機能が少ないじゃないのか?
469デフォルトの名無しさん
2011/01/25(火) 05:02:06 このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
470デフォルトの名無しさん
2011/01/25(火) 11:23:33 >>467
perlユーザはすべてをperlだけでやろうとする。C/C++/Javaも使うユーザはawkの方を好む。
C/C++/Javaに手を延ばすつもりならむしろawkのほうがいいよ。perlだと自己完結してしまうから。
perlユーザはすべてをperlだけでやろうとする。C/C++/Javaも使うユーザはawkの方を好む。
C/C++/Javaに手を延ばすつもりならむしろawkのほうがいいよ。perlだと自己完結してしまうから。
471デフォルトの名無しさん
2011/01/25(火) 16:02:25 perlよりawkの方が速い事ってないじゃん。
今のawkの使い道はワンライナーをコマンドラインのパイプに混ぜる程度でしよ。
俺は、256倍本の長篇スクリプトをいくつか書いたけど、
当時はまだperlなんて使われてなかった。時代が違う。
今のawkの使い道はワンライナーをコマンドラインのパイプに混ぜる程度でしよ。
俺は、256倍本の長篇スクリプトをいくつか書いたけど、
当時はまだperlなんて使われてなかった。時代が違う。
472デフォルトの名無しさん
2011/01/25(火) 18:11:52 >>470
それは偏見だろ
autoconfなどの非常に基本的なツールでもPerlが使われているし
opensslのようにconfigureの(主にWindows用の)ポータビリティを上げるために
Perlを利用しているものもある
言語の適性をわかった上で適材適所で使えばいいんだよ
それは偏見だろ
autoconfなどの非常に基本的なツールでもPerlが使われているし
opensslのようにconfigureの(主にWindows用の)ポータビリティを上げるために
Perlを利用しているものもある
言語の適性をわかった上で適材適所で使えばいいんだよ
473デフォルトの名無しさん
2011/01/25(火) 21:08:21 日本国際賞
「米ベル研究所特別名誉技師のデニス・リッチー博士(69)と米グーグル社特別技師のケン・トンプソン博士(67)」
毎日jp - 毎日新聞のニュース・情報サイト
http://mainichi.jp/select/science/news/m20110126k0000m040012000c.html
「米ベル研究所特別名誉技師のデニス・リッチー博士(69)と米グーグル社特別技師のケン・トンプソン博士(67)」
毎日jp - 毎日新聞のニュース・情報サイト
http://mainichi.jp/select/science/news/m20110126k0000m040012000c.html
474デフォルトの名無しさん
2011/01/25(火) 21:29:34 >>471
>時代が違う。
時代と言う意味では、最近はデフォで Python が入っていたりするので
Perl を使うなら Python を選んじゃうな。
あんまり速さを競う仕事をしていないのと、ワンライナーを書く事が
多いので、awk も絶賛大活躍しているけど。
Perl がフルセットの言語なら awk は DSL みたいな物で、個人的には
awk の方が気安く書ける気がする。
>時代が違う。
時代と言う意味では、最近はデフォで Python が入っていたりするので
Perl を使うなら Python を選んじゃうな。
あんまり速さを競う仕事をしていないのと、ワンライナーを書く事が
多いので、awk も絶賛大活躍しているけど。
Perl がフルセットの言語なら awk は DSL みたいな物で、個人的には
awk の方が気安く書ける気がする。
475デフォルトの名無しさん
2011/01/25(火) 21:57:07 pythonは、コマンドラインで使いにくい。
-cで引数に一応コマンド渡せるけど、インデントの問題があるし、
perlの-pや-nみたいに標準入力のループ渡せないから。
-cで引数に一応コマンド渡せるけど、インデントの問題があるし、
perlの-pや-nみたいに標準入力のループ渡せないから。
476デフォルトの名無しさん
2011/01/25(火) 22:04:34 質問させて下さい
次のようなテキストがあるとします
aaaaa 10 20 10 5
aaabb 5 10 10 10
aaabb 5 5 5 5
aabaa 5 20 20 30
aabbb 10 10 5 5
bbaaa 10 10 10 10
bbbaa 5 10 10 5
bbbbb 10 5 5 30
ここで、aaaaaなどは個人の名前でかつ、3文字目までが姓、4〜5文字目が名前、また数字が出費だとして
各世帯の出費を出力したいと考えています。
aaa 20 35 25 20
aab 15 30 25 35
bba 10 10 10 10
bbb 15 15 15 35
となって欲しい訳です。
次のようなテキストがあるとします
aaaaa 10 20 10 5
aaabb 5 10 10 10
aaabb 5 5 5 5
aabaa 5 20 20 30
aabbb 10 10 5 5
bbaaa 10 10 10 10
bbbaa 5 10 10 5
bbbbb 10 5 5 30
ここで、aaaaaなどは個人の名前でかつ、3文字目までが姓、4〜5文字目が名前、また数字が出費だとして
各世帯の出費を出力したいと考えています。
aaa 20 35 25 20
aab 15 30 25 35
bba 10 10 10 10
bbb 15 15 15 35
となって欲しい訳です。
477デフォルトの名無しさん
2011/01/25(火) 22:18:47 で今考えている方法としては
substr($1,1,3) で姓を判定して
同じ姓なら、世帯を加算して行く
違う姓になったタイミングで1つ前の家の家計を print して
さらに各出費を初期化する
次の行に移って同じ世帯なら加算
という感じでスクリプトを組みたいんですが根本的なところでやり方が不味いでしょうか?
substr($1,1,3) で姓を判定して
同じ姓なら、世帯を加算して行く
違う姓になったタイミングで1つ前の家の家計を print して
さらに各出費を初期化する
次の行に移って同じ世帯なら加算
という感じでスクリプトを組みたいんですが根本的なところでやり方が不味いでしょうか?
478デフォルトの名無しさん
2011/01/25(火) 22:34:21 連想配列とかじゃ駄目なのか?
name[$1] += 1
name[$1] += 1
479デフォルトの名無しさん
2011/01/26(水) 01:13:08480デフォルトの名無しさん
2011/01/26(水) 20:18:53 >>474
OS(Linux)をデフォだけで使うことはまずありえなくて、
何かしら追加パッケージが必要になるはずだから、
Pythonがデフォで入っている事は実用面で評価対象にはならんと思う。
自分はDebianをメインに使うけど、インストール時にはベースシステムだけを選び、
それにsshdとrubyを追加するのがデフォなんで気にならない。
MacならPython/Rubyともデフォで入ってるから無問題だし、
Winならどちらもデフォじゃ入っていないから同じ。
また日常的なプログラミングに関して、Rubyの場合は以下のようにリスト構造を
シェルのパイプライン感覚で書けるのが嬉しい。
hoge_list.select { |x| ....}.sort { |x,y| .... }.map { |x| .... }.inject(n) {|x, i| .... }
ブロック(クロージャ)の無いPyton/Perlでは、こういったお気軽な書き方はできない。
だから日常的な活躍度で比較すると、自分の場合は、bash > awk > ruby になる。
基本はbashで、面倒な文字列処理があればawkをワンライナーで埋め込むのがパターン。
で、色々と機能を追加してきてbashプログラミングが重荷に感じられるようになり、
なおかつ汎用性のある(再利用の可能性がある)ツールであれば、一気にrubyに書き換える。
Pythonは本格的な開発であれば(Rubyよりも)優れた面が多々あると思うけど、
(>>475の指摘も含めて)お手軽さ/お気軽さに限ると(Rubyよりも)使いづらく感じる。
もちろんbashスクリプト(or Makefile)に埋め込むワンライナーであれば、awk がベスト。
OS(Linux)をデフォだけで使うことはまずありえなくて、
何かしら追加パッケージが必要になるはずだから、
Pythonがデフォで入っている事は実用面で評価対象にはならんと思う。
自分はDebianをメインに使うけど、インストール時にはベースシステムだけを選び、
それにsshdとrubyを追加するのがデフォなんで気にならない。
MacならPython/Rubyともデフォで入ってるから無問題だし、
Winならどちらもデフォじゃ入っていないから同じ。
また日常的なプログラミングに関して、Rubyの場合は以下のようにリスト構造を
シェルのパイプライン感覚で書けるのが嬉しい。
hoge_list.select { |x| ....}.sort { |x,y| .... }.map { |x| .... }.inject(n) {|x, i| .... }
ブロック(クロージャ)の無いPyton/Perlでは、こういったお気軽な書き方はできない。
だから日常的な活躍度で比較すると、自分の場合は、bash > awk > ruby になる。
基本はbashで、面倒な文字列処理があればawkをワンライナーで埋め込むのがパターン。
で、色々と機能を追加してきてbashプログラミングが重荷に感じられるようになり、
なおかつ汎用性のある(再利用の可能性がある)ツールであれば、一気にrubyに書き換える。
Pythonは本格的な開発であれば(Rubyよりも)優れた面が多々あると思うけど、
(>>475の指摘も含めて)お手軽さ/お気軽さに限ると(Rubyよりも)使いづらく感じる。
もちろんbashスクリプト(or Makefile)に埋め込むワンライナーであれば、awk がベスト。
481474じゃないけど
2011/01/26(水) 21:22:28 >>474と全く同じ意見だわ。
業務で使う事が多いRHELは余計な物はほとんど入れてない。
Python、Perlがデフォで入ってる感じ。
昔、UNIXを扱ってた頃はPerlならデフォで入ってたので、覚えようとしたけど結局身につかず。
sh、sed、awkでがんばってた。
業務で使う事が多いRHELは余計な物はほとんど入れてない。
Python、Perlがデフォで入ってる感じ。
昔、UNIXを扱ってた頃はPerlならデフォで入ってたので、覚えようとしたけど結局身につかず。
sh、sed、awkでがんばってた。
482デフォルトの名無しさん
2011/01/27(木) 00:10:46 >>480
デフォで入っているのが嬉しいのは、自分の環境だけでなく、他人の環境でも
使える事が保証されている事だよ。誰かに使ってもらう為のコードを書く時に、
パッケージの追加をお願いしなくて良いのはとても楽。特に、それが仕事で
使われている環境なら尚更。
サポートやトレーニングの仕事をした事がある人なら理解してもらえると思う。
デフォで入っているのが嬉しいのは、自分の環境だけでなく、他人の環境でも
使える事が保証されている事だよ。誰かに使ってもらう為のコードを書く時に、
パッケージの追加をお願いしなくて良いのはとても楽。特に、それが仕事で
使われている環境なら尚更。
サポートやトレーニングの仕事をした事がある人なら理解してもらえると思う。
483デフォルトの名無しさん
2011/01/27(木) 03:47:36 AWKは、NEC PC-9801のMS-DOSでもうごいた。AWK95.exeは、日本語に対応してない
484デフォルトの名無しさん
2011/01/27(木) 05:04:18 AWKの活躍する場面は、やっぱりテキスト処理だと思う。
そのちょっと複雑版として使うならPerlかな。
組み込みライブラリがテキスト処理に特化してるから。
Pythonは正規表現が言語に組み込まれてなかったりと
テキスト処理は若干やりにくい印象が強い。
その分、テキスト処理以外なら結構使うけどね。
そのちょっと複雑版として使うならPerlかな。
組み込みライブラリがテキスト処理に特化してるから。
Pythonは正規表現が言語に組み込まれてなかったりと
テキスト処理は若干やりにくい印象が強い。
その分、テキスト処理以外なら結構使うけどね。
485デフォルトの名無しさん
2011/01/27(木) 05:27:26 >>482
ああ、それ分かるわ。業務マシンとして使う商用UNIX(HP-UX/Solaris/AIX)だと
RubyどころかPython/Perlすらデフォじゃ入っていないし、そういった
フリーソフトの類いは原則として一切インストール禁止という環境もある。
(Web/MailといったInternet系サーバは別ね。あくまで業務マシン限定の話。)
だから商用UNIXユーザは、デフォで入っているツールに長けることになる。
やっぱり本物のUNIXプロを自称するのなら、python/rubyではなくsh/awkだし、
emacs/vimではなくvi、latexではなくroffを選ぶべきだよね。
ああ、それ分かるわ。業務マシンとして使う商用UNIX(HP-UX/Solaris/AIX)だと
RubyどころかPython/Perlすらデフォじゃ入っていないし、そういった
フリーソフトの類いは原則として一切インストール禁止という環境もある。
(Web/MailといったInternet系サーバは別ね。あくまで業務マシン限定の話。)
だから商用UNIXユーザは、デフォで入っているツールに長けることになる。
やっぱり本物のUNIXプロを自称するのなら、python/rubyではなくsh/awkだし、
emacs/vimではなくvi、latexではなくroffを選ぶべきだよね。
486デフォルトの名無しさん
2011/01/27(木) 06:50:40487デフォルトの名無しさん
2011/01/27(木) 07:07:12488デフォルトの名無しさん
2011/01/27(木) 07:10:47 リテラルだと何か良いことあるの?
489デフォルトの名無しさん
2011/01/27(木) 07:13:35 文字列かパターンか区別しやすい。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- ミス・ユニバース フィンランド代表の「つり目」写真が波紋… 本人釈明も批判やまず 協会謝罪「徹底的に検証」へ [冬月記者★]
- 自民・麻生太郎副総裁 石破政権の1年は「どよーん」 高市政権発足で「何となく明るくなった」「世の中のことが決まり動いている」★2 [Hitzeschleier★]
- 【おこめ券】鈴木憲和農相 小泉前農相の備蓄米放出を“反省”「備蓄の円滑な運営を図ってまいります」 [Hitzeschleier★]
- 1人3千円の食品高騰対策、何に使える? あいまいなまま衆院通過 [蚤の市★]
- ゆたぼん 二重手術を報告「めちゃくちゃ気に入っています」 [muffin★]
- 【山形】クマ駆除で誤射した猟友会隊員に町が1663万円請求へ...弾当たり男性大けが2023年 小国町 [nita★]
- 【WOWOW】UEFAチャンピオンズリーグ・ヨーロッパリーグ ★18
- とらせん
- 巨専】
- 【WOWOW】UEFAチャンピオンズリーグ・ヨーロッパリーグ ★17
- こいせん 全レス転載禁止
- わしせん ようこそ佐藤直樹くん ありがとう石井さん
- 中国人、ガチ超正論。「日本人がアイヌに対してやったことを『問題ない』とするなら、中国が日本人に同じことをしても文句ないだろう?」 [314039747]
- 【悲報】新米、全く売れなくて倉庫が満杯になってしまうwwwwwwwwwwwwwwwwwwww [802034645]
- 最近レッテル貼りしてドヤ顔してるガチガイジが嫌儲に増えてない? [866936191]
- 木曜日のんなっしょい❗(・o・🍬)仕放題スレ🏡
- 【悲報】日本共産党、ツイッター速報にブチギレ法的措置WWWWWWWWWWWWWWWWWWWWWWWWWWWW [935793931]
- 官僚「台湾有事についての質問か、『政府として逐一答えない』と…(カタカタカタ)」高市「私1人で答弁できるわよ!」 [972432215]
