awkについて語るスレ $2
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/02/23(金) 23:55:42三人の碩学が生み出したスクリプト言語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/
0322デフォルトの名無しさん
2009/10/24(土) 22:11:41リングバッファで処理するようにしてみた。
BEGIN {
SKIPTAILS = 10
ringpos = SKIPTAILS
}
{
ringpos = (ringpos + 1) % SKIPTAILS
line = buf[ringpos]
buf[ringpos] = $0
}
NR > SKIPTAILS {
# lineを処理
}
0323デフォルトの名無しさん
2009/10/24(土) 23:18:06リングバッファ、勉強になりました
使わせて頂きます
0324デフォルトの名無しさん
2009/11/19(木) 20:22:22sed awk して船山に登る だろ?
0325デフォルトの名無しさん
2009/11/23(月) 12:06:14gawkで
{
printf("%d,%s\n", NR, $0 ) > FILENAME;
}
という行頭に番号を振って保存する処理をして
batファイルで一括処理させようとしたんですが
c:\windows\gawk\gawk -f g:\作業用\n.awk g:\作業用\*.txt
実行結果が
ファイル1 ファイル2
1A 4D
2B 5E
3C 6F
になります
ファイル2も
1D
2E
3F
にするにはどうしたらよいでしょうか?
0326デフォルトの名無しさん
2009/11/23(月) 12:27:220327デフォルトの名無しさん
2009/11/23(月) 12:35:21おお、出来た!
迅速な回答ありがとうございます
0328デフォルトの名無しさん
2009/12/21(月) 13:53:34あれ、vaioのOSがWindows7 64bitバージョンに・・・
ダメじゃん!gawkが使えなくなってしまう・・・
うーん、、、またXPを買うべきか・・・悩む・・・
0329デフォルトの名無しさん
2009/12/21(月) 14:21:01自分でコンパイルし直せばいいだけじゃないの?
0330デフォルトの名無しさん
2010/01/14(木) 03:52:20ttp://slashdot.jp/developers/article.pl?sid=10/01/06/0345207
多分必要性を感じない程度には使ってるから、買わないけど嬉しい。
布教用に買うってのもちょっとな。
0331デフォルトの名無しさん
2010/02/28(日) 11:08:56awk新参です。
-O(オプション)を検索し、
-Oとそれ以降をリダイレクトしたいのですが…
良い方法、ありますでしょうか
0332デフォルトの名無しさん
2010/02/28(日) 15:36:31その AAA で始まる文字列も一体どういうものなの。
コマンドライン引数なのか、ファイルから読み込んでくるのとか。
用語と状況はきちんと書いてくれ。
0333デフォルトの名無しさん
2010/02/28(日) 16:19:07AAA BBB CCC … -O ZZZ YYY XXX 0…
AAA BBB CCC … -O ZZZ YYY XXX 1…
AAA BBB CCC … -O ZZZ YYY XXX 2…
D:\My Documents\gawk\331>type 331.awk
{match($0, " -O .*", a);
print a[0];}
D:\My Documents\gawk\331>gawk -f 331.awk 331.txt >a.txt
D:\My Documents\gawk\331>type a.txt
-O ZZZ YYY XXX 0…
-O ZZZ YYY XXX 1…
-O ZZZ YYY XXX 2…
D:\My Documents\gawk\331>
0334331
2010/02/28(日) 18:43:32>>332すみません。書き直します。
AAA BBB CCC … -O ZZZ YYY XXX …
と書複数行書かれたファイルがあり、
「-O」以降の文字列を別ファイルに保存する
ってことをしたかったのです。
>>333
エスパーな文だったのにありがとうございます。
想定してたのはそんな感じです。
ただ以下のエラーが出て上手くいきません…
gawk: 331.awk:2: fatal: match() cannot have 3 arguments
match使ってるのにaという3つ目の引数を使ってるから…ってことでしょうか…?
0335デフォルトの名無しさん
2010/02/28(日) 19:00:04A: Your AWK is too old to recreate the Makefile. The build is done based on the distributed Makefile. Everything shall compile successfully though.
So if the compile succeeds just ignore such errors, please.
0336335
2010/02/28(日) 19:22:380338デフォルトの名無しさん
2010/02/28(日) 22:25:50おっと一言オウかったか。
0339デフォルトの名無しさん
2010/03/04(木) 15:04:38gsub(str1,str2)みたいに。
0340デフォルトの名無しさん
2010/03/04(木) 21:44:52man gawkより
gsub(r, s [, t])
For each substring matching the regular expression r in the string t,
substitute the string s, and return the number of substitutions.
If t is not supplied, use $0. An & in the replacement text is
replaced with the text that was actually matched. Use \& to get a
literal &. (This must be typed as "\\&"; see GAWK: Effective AWK
Programming for a fuller discussion of the rules for &'s and
backslashes in the replacement text of sub(), gsub(), and gen sub().)
0341デフォルトの名無しさん
2010/03/08(月) 21:36:03何が難しいのかよくわからん。
0342デフォルトの名無しさん
2010/03/17(水) 22:07:37実際のところ速くなるんでしょうか?
私の環境ではforループや加算などはawkのほうが速そうですが、
どのような処理の場合にperlのほうが速くなりますか?
$ time mawk 'BEGIN{x=0;for(i=1;i<=1000000;i++){x=x+i};printf("%f\n" ,x)}'
500000500000.000000
real 0m0.131s
user 0m0.120s
sys 0m0.000s
$ time gawk 'BEGIN{x=0;for(i=1;i<=1000000;i++){x=x+i};print x}'
500000500000
real 0m0.289s
user 0m0.284s
sys 0m0.000s
$ time perl -e '$x=0;for($i=1;$i<=1000000;$i++){$x=$x+$i};print $x'
500000500000
real 0m0.379s
user 0m0.376s
sys 0m0.004s
0343デフォルトの名無しさん
2010/03/17(水) 22:26:14「awkだと遅いのでperlに書き換えるという人」 に聞けば分かる
0344デフォルトの名無しさん
2010/03/19(金) 09:08:06遅いというawkはgawkなの?
素のawkよりgawkの方が早くなかったっけ?
0345デフォルトの名無しさん
2010/03/20(土) 01:03:01(とCとC++とJAVA)の比較があるな
今のマシン使って書き換えなきゃならないほど遅いって
どんな処理なんだろう?
0346デフォルトの名無しさん
2010/03/21(日) 13:44:10awk 等を組み合わせて実行するとプロセス起動のコストがかかるので perl で一つに纏める、という話じゃないの?
0347デフォルトの名無しさん
2010/03/22(月) 17:35:11文字列中の全角文字を半角文字に変える華麗な方法を模索しています。
0348デフォルトの名無しさん
2010/03/22(月) 18:01:580349デフォルトの名無しさん
2010/03/22(月) 18:25:10なにをしたいのかよくわかんないんだけど。
> 文字列中の全角文字を半角文字に変える華麗な方法を模索しています。
華麗なのはtrコマンドを使う方法。ただtrがマルチバイトをうまく扱ってくれるか
どうかはこころもとない。
Perlならtrを、Rubyなら文字列クラスのtrメソッドを、
Pythonならstringモジュールのmaketrans関数と文字列のメソッドtransleteを使う、
という手がある。
awkないし(tr以外の)古典的なツールで華麗にやる方法はないと思う。
0350デフォルトの名無しさん
2010/03/24(水) 17:11:16全角半角変換は ASC()
半角全角変換は JIS()
0351デフォルトの名無しさん
2010/03/25(木) 08:34:111. EUC-JPにして(nkfとか)kakasi で、戻す
2. それだったら最初から、nkf -Z
3. gawk前提で、文字毎に処理(LANGを指定して子プロセス起動)
awkの中で閉じてやるのはめんどくさそう
0352デフォルトの名無しさん
2010/03/29(月) 23:34:27system(cmd) を使うと、アンチウィルスソフト(kaspersky)の
アプリケーション履歴にバッチファイルが登録されるのを発見。
close(cmd) しても同じ。
while(cmd|getline>0){}
で代用すると残らなくなった。??
0353デフォルトの名無しさん
2010/05/13(木) 00:22:57http://www.cnn.co.jp/world/AIC201005120004.html
テヘランで、ブルカを着て入出国する時って、顔のチェックどうするんだろう。
他人や男でもばれないの?
0354デフォルトの名無しさん
2010/05/13(木) 00:23:49誤爆スマン
0355デフォルトの名無しさん
2010/05/14(金) 13:38:240356デフォルトの名無しさん
2010/05/18(火) 10:51:40下のような出力が有った場合、例えば
lrwxrwxrwx 1 root root 70 May 18 10:37 hoge
ls -al | awk '{print$1$2$2$4$6$7$8$9}' とすれば「$5」の
「70」を抜くことが出来ますが、これが$100とかまで続く場合、
「$5」だけを抜きたい場合記述が大変になります。
何か良い方法は無いものでしょうか?
0357デフォルトの名無しさん
2010/05/18(火) 11:01:32区切りの空白が$5のあったところだけ2個になるのが気にならなければ、
ls -al | awk '{$5 = ""; print}'
とすればよい。
空白2個を修正するならこうする。
ls -al | awk '{$5 = ""; print $0}' | awk '{$1 = $1; print}'
0358デフォルトの名無しさん
2010/05/18(火) 11:03:15ls -al | awk '{$5 = ""; print}' | awk '{$1 = $1; print}'
0359デフォルトの名無しさん
2010/05/18(火) 11:07:030360デフォルトの名無しさん
2010/05/18(火) 11:34:06$1=$1で代入してやると、$1, $2, ...を空白1個でつないだものが$0に代入されるので、
空白2個だったところが空白1個になる。
0361デフォルトの名無しさん
2010/05/18(火) 11:35:04空白2個なので$0を再構成すると空白1個区切りになる
0362デフォルトの名無しさん
2010/05/18(火) 12:21:12非常に解りやすいご説明、ありがとうございます。
なるほど代入することで解決するんですね。
勉強になりました。
0363デフォルトの名無しさん
2010/05/18(火) 15:08:38$1ってFSで区切られた一つ目だよね?
なんでそれ自身を自分に代入したらスペースが消えるん?
0364デフォルトの名無しさん
2010/05/18(火) 15:27:35$0の再構成とはいったんばらした$1,$2,...をOFSを挟んで
つなげ直すってことなので、何で区切られていたかは
保存されない。
0365デフォルトの名無しさん
2010/05/18(火) 15:41:56>$1=$1で代入してやると、$1, $2, ...を空白1個でつないだものが$0に代入される
って約束事を覚えておけってことかい?
0366デフォルトの名無しさん
2010/05/18(火) 15:42:39% echo a b | gawk '{OFS="-";$1=$1;OFS="=";print}'
a=b
再構成は$1=$1をやってすぐじゃなくて、次に$0が使われるとき、ってこと
なのかな?
0367365
2010/05/18(火) 16:27:59http://www.kt.rim.or.jp/~kbk/gawk-3.1/gawk.html
警告: 一部のバージョンのawkは NFを減じたときに$0の再構築を行わない。
結局のところ、awkにレコード全体の再構築を強制したときにはその時点で
フィールドの値とOFSが使われる。再構築を行うためには、何らかの無害な
代入を行う:
$1 = $1 # force record to be reconstituted
賢くなった。あんがと。
0368デフォルトの名無しさん
2010/05/18(火) 16:46:580369デフォルトの名無しさん
2010/05/19(水) 22:24:520370デフォルトの名無しさん
2010/05/24(月) 09:55:14勉強になった。
0371デフォルトの名無しさん
2010/05/24(月) 15:25:460372デフォルトの名無しさん
2010/05/29(土) 04:53:07E-mail:
内容:
cygwinだと
% cut -f1 -d, hoge.csv
より
% awk -F, '{print $1}' hoge.csv
の方が速かった。
#実行時間ね
#Perl?シラネ
0373デフォルトの名無しさん
2010/06/07(月) 11:45:38sed -e 's/,.*//'でもawkと同じくらいだから、cutの実装が遅いんだね。
cutが無駄にオプション多い所為じゃない?
0374デフォルトの名無しさん
2010/06/07(月) 12:04:05hoge.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
0375デフォルトの名無しさん
2010/06/07(月) 12:22:48fgetc()とfgets()で時間を較べたときにfgetc()の方がずっと遅かった記憶がある。
0376デフォルトの名無しさん
2010/09/13(月) 14:14:54そのページがwell-formedか極悪かは私にとってどうでもよく、単に内容を得たいだけなので、文末まで処理し終えて欲しいのです。
どうにかならないでしょうか。
0377デフォルトの名無しさん
2010/09/25(土) 14:55:22アクションをヒアドキュメントで書く事は出来るでしょうか。
0378デフォルトの名無しさん
2010/09/27(月) 14:57:18データが
|1|aaa|
|2|bbb|
|3|ccc|
などとなっているとき
aaa
bbb
ccc
を取り出そうとして
awk 'FS="|"{print $3}' ファイル名
としたんですが、1行目だけがうまくとれません。
データファイルの1行目を空行にすれば解決できないことはないんですが、
空行を入れ忘れてしまう懸念があります。
どうすればいいんでしょうか?
0379デフォルトの名無しさん
2010/09/27(月) 15:01:460380デフォルトの名無しさん
2010/09/27(月) 15:08:38>>379
どうもありがとうございました。
0381デフォルトの名無しさん
2010/09/27(月) 18:42:12下記サイトでは、17番目まで普通に指定できるような事が書いてあるけど、
http://tounderlinedk.blogspot.com/2010/08/gensub-n-awk.html
gensub(pattern,"\\10","g",$2) とかくと
\\1(マッチ箇所)と0(文字)として解釈されちゃって上手くいなかい。
シェルスクリプト風かと思って、\\{10} も試したけどダメダッター。
GNU Awk 3.1.5です。
0382381
2010/09/27(月) 19:00:47実装によって違うのかなあ
パターンを動的に生成してマッチさせようとしてるから結構困る(´・ω・`)
http://www.linux.or.jp/JM/html/GNU_gawk/man1/gawk.1.html
0383デフォルトの名無しさん
2010/09/27(月) 19:04:47マニュアルには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';
なんてやってる。
0384デフォルトの名無しさん
2010/09/27(月) 19:08:030386デフォルトの名無しさん
2010/09/27(月) 21:27:29なんでそこのひとは16までできたんだ?
0387デフォルトの名無しさん
2010/09/28(火) 00:32:520388デフォルトの名無しさん
2010/09/28(火) 03:15:24記念パピコ。
0389デフォルトの名無しさん
2010/09/28(火) 03:41:50気付いたらperlばっかりやっててawkすっかり忘れてしまったなぁ
今はperl捨てて専らpythonやってるけどawkもいいよね
0390デフォルトの名無しさん
2010/09/28(火) 09:40:13手軽であるにも関わらず、結構高度な処理もガリガリ書けるから好き。
Cとシェルスクリプトが好きだから、文法的にもしっくり来る。
上位互換のPerlも大好き。
0391デフォルトの名無しさん
2010/09/28(火) 14:37:590392デフォルトの名無しさん
2010/09/28(火) 14:52:08どれでも好きなのを選べ
1. xgawkを改造
2. エラーになるXMLを事前に修正してwell-formedにしてから食わせる
3. xgawkは捨てて別の言語、ライブラリを試す
0393デフォルトの名無しさん
2010/09/28(火) 17:23:080394デフォルトの名無しさん
2010/10/01(金) 11:21:26シェルスクリプト > awk >>> perl >>>>> python >>>>> ruby >>> haskel etc.
となるだろうな。
シェルスクリプトはシェル依存な部分が多く、perl ほど高機能なものも要らない。
そんな時、小さな端末でもスマートに動いてくれる awk にちんこ勃つ。
>>389
言語に捨てるも拾うもないよ。その時々に都合の良いものを組み合わせて使うのがUNIX的な発想。
0395デフォルトの名無しさん
2010/10/01(金) 15:33:40「一発やろう」ですね!
0396デフォルトの名無しさん
2010/10/09(土) 04:40:48これなら俺でも挫折しなくてすみそう
0397デフォルトの名無しさん
2010/10/09(土) 04:57:140398デフォルトの名無しさん
2010/10/21(木) 20:16:46/ー/{print}
を実行すると
awk:
awk: ^ 正規表現が終端されていません。
awk: 致命的: [ または [^ が対応しません。: /[/{print}/
のエラーになってしまいます。
ーの2バイト目が[なせいだと思いますが、どう対応したらいいでしょうか?
入力ファイルはsjisで書かれていて、文字コード変換はできません。
0399デフォルトの名無しさん
2010/10/21(木) 20:55:41環境の問題なんだから、実行環境くらいまともに書けよ。
0400デフォルトの名無しさん
2010/10/21(木) 21:38:24gawk を使う
0401デフォルトの名無しさん
2010/10/21(木) 22:52:57/bin/awkはシンボリックリンクで、実体はgawkでした。
0402デフォルトの名無しさん
2010/10/21(木) 23:49:35--help 嫁
0403デフォルトの名無しさん
2010/10/22(金) 01:41:070404デフォルトの名無しさん
2010/10/22(金) 02:19:300405398
2010/10/22(金) 07:32:34/\x81\[/{print}
0406デフォルトの名無しさん
2010/10/22(金) 09:41:36根本的な解決になってないけどねぇ。
0407デフォルトの名無しさん
2010/10/22(金) 13:52:100408398
2010/10/22(金) 19:55:530409デフォルトの名無しさん
2010/10/22(金) 20:03:18今あるのかどうか知らないけど。
0410デフォルトの名無しさん
2010/10/22(金) 20:28:38$ echo 'てすと' | gawk '/[ぁ-ん]/ { print length($0) }'
3
UTF-8ロケールでしか試してないけど
cygwinでも大丈夫
0411デフォルトの名無しさん
2010/10/23(土) 01:29:00gawkでいいかな
0412399
2010/10/23(土) 06:55:10問題は解決したのかもしらんが、一応。
以下2つのWin用バイナリは問題ないので、ソースもらってLinux上でコンパイルしてみたら?
ttp://gnuwin32.sourceforge.net/packages/gawk.htm
ttp://www.kt.rim.or.jp/~kbk/gawk-3.1/
0413398
2010/10/23(土) 10:53:14これにしたらsjisでも動くようになるのでしょうか?
0414デフォルトの名無しさん
2010/10/23(土) 12:27:19少なくとも自分が試した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とかにすればいいのかと思ったが、ロケール変更自体がうまくいかなかったわ。
困ってる事があるなら、最終的に何がしたいか言ったほうがいいよ。
0415398
2010/10/23(土) 12:40:31困っていたことは405で解決したので大丈夫です。
今は「根本的な解決」に興味があったのでお聞きした次第です。
0416初心者
2010/11/04(木) 22:14:100417デフォルトの名無しさん
2010/11/04(木) 23:14:10初心者だからマルチが許されるとでも思ったか?
0418初心者
2010/11/05(金) 06:32:09知りませんでした。
0419デフォルトの名無しさん
2010/12/15(水) 01:54:35length みたいなのは無い?
0420デフォルトの名無しさん
2010/12/15(水) 02:27:500421デフォルトの名無しさん
2010/12/15(水) 02:42:46と思ったら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.
■ このスレッドは過去ログ倉庫に格納されています