awkについて語るスレ $2at TECH
awkについて語るスレ $2 - 暇つぶし2ch73:デフォルトの名無しさん
07/11/22 06:36:33 .net
xgawkで多倍長整数を使いたいんですが、
printf( "%ld\n", num );
では桁数は増えても精度は上がってないようです。
型宣言するにはどうするのでしょうか

74:デフォルトの名無しさん
07/11/22 07:17:23 .net
>>73
多倍長整数を実装するのに個別の精度を上げてどうする。

75:デフォルトの名無しさん
07/11/22 07:34:48 .net
xgawkは多倍長整数あるんですよね?
で、rubyのように無宣言で使えるかと思ったらそうではないらしいので、
どうするのかと。

URLリンク(home.vrweb.de)
いまこのへん見てるんですが

76:デフォルトの名無しさん
07/11/22 08:47:49 .net
MPFR,多倍長整数ではなく実数かな。
ググって見つけました。
URLリンク(www.kt.rim.or.jp)

URLリンク(golf.shinh.org)
実はこれやってるんですが。
あとはdllのパスが分かれば・・・

77:デフォルトの名無しさん
07/11/26 21:13:28 .net
>>76
「あなごる」の xgawk は MPFR 積んでないと思うが・・・。


78:デフォルトの名無しさん
07/11/29 08:00:03 .net
そうですか
どちらにしても実数って事はやっぱ無理な気がしました

79:デフォルトの名無しさん
08/01/04 07:28:20 .net
sedみたいに、パターン部分を行番号で指定出来ませんか?

80:デフォルトの名無しさん
08/01/04 09:32:19 .net
>>79
awk 'NR == 79 {print;}'
ってこと? それとも、
awk 'FNR == 79 {print;}'
ってこと?

81:デフォルトの名無しさん
08/01/04 14:24:54 .net
>80
はじめsedみたいに 10,35{ みたいな感じに書いてダメだったので; }
普通に比較式書くんですね。10<=NR&&NR<=35{ で出来ました; }
ありがとうございます。

82:デフォルトの名無しさん
08/01/05 00:50:26 .net
>>81
もう少し sed らしくしたいなら、
10==NR, NR==35 { print }
なんてのもあり

83:デフォルトの名無しさん
08/01/14 09:02:50 .net
awk はオプションなしだとワンライナーのコードを書くことになると思いますが
実際 awk のワンライナーってどんな時に使いますか?
あまり見たことがなくて…

84:デフォルトの名無しさん
08/01/14 09:45:08 .net
>>83
UNIXでは多くのファイルや出力が欄区切りテキストの形式になっているから
その場使い捨てワンライナーが本来の使い方なんだけど、
他のOSだと BEGIN を main 代わりに使うようなのばっかになるかもね。

85:デフォルトの名無しさん
08/01/14 09:46:06 .net
>>83がsedをどう使っているのか気になる。
sedスクリプトファイルとか作って、スクリプトの引数に処理対象のファイルを渡してたりするのかな。

86:デフォルトの名無しさん
08/01/14 10:18:29 .net
よく書く一行野郎。
--
du -sk /tmp/* | awk '{sum += $1;} END {print sum / NR;}'
# まぁ、duってのは今思いついただけで、実際にduの出力の平均を取ることはないけどね。
--
paste foo bar | awk '($1 - $2) > 1e-3 || ($1 - $2) < -1e-3 {print NR, $0;}'
# 一致を見るだけならdiffでいいけど、近似を見るには使えないんで。

87:デフォルトの名無しさん
08/01/15 18:34:44 .net
>>85
sedは単体の命令を見て「置換」「行の切り捨て」みたいな用途が
パッと見て思い付くので疑問は沸かないんです。

awkはひとつひとつの命令を見ても
普通にスクリプト言語の命令としか思えないので
「コード書くならともかく、ワンライナーでどう使うの?」と
疑問をもってしまうんです。

>>86
う~ん、結構複雑になりますね。
それだと私ならターミナルに書かずに
コードに起こしてしまいそうです。

でも、パターンとフィールドを上手く使えば
色々出来る気がしてきました。
例をありがとうございます。

88:デフォルトの名無しさん
08/01/15 18:59:18 .net
あ、コード書きそうなのは後者です。
平均とか合計みたいなモノには良さそうですね。

89:デフォルトの名無しさん
08/01/15 19:28:50 .net
今日書いた一行野郎。
--
awk '{for (ic = 1; ic <= NF; ++ic) {if (max < $ic) max = $ic;}} END {print max;}'
--
これも全フィールドに拡張しているだけで、単に最大値を得ているだけだね。

90:デフォルトの名無しさん
08/01/22 16:52:32 .net
よく書く一行
du -k|awk '$1 > 10000'
でかいデレクトリをさがす

91:デフォルトの名無しさん
08/01/29 23:34:51 .net
俺がよく書く一行野郎
$ awk 1 > hoge.sh

92:デフォルトの名無しさん
08/01/31 12:58:14 .net
>>91
それに何の意味が?
cat > hoge.shでも事が足りそうだが。

93:デフォルトの名無しさん
08/01/31 18:48:07 .net
>92
Windowsにawk入れてた時に、こんなヘンな癖が付いてしまった。

94:デフォルトの名無しさん
08/02/02 12:38:28 .net
すみません、初心者ですがawkに関するスレがここしかなかったので。
↓のソースを書いていただいたのですが、いったいどうすれば使えるのでしょうか?
ちなみに、これはフォルダ内のWinrar形式ファイルのリカバリレコードが付いているか否か
リストを一括で出力するものです。
よろしこ
**************
コマンドラインだけどunrar lt sample.rarの出力利用してリストを作るだけ
使い方はパイプでawkに渡して処理unrar lt *.rar | gawk -f rr.awk
awkなんか入ってないだろうから当然そのままじゃ動かない

rr.awk
#!/usr/local/bin/gawk

BEGIN {$rr=0; printf "%-30s\t%s\n", "FileName", "RecoveryRecord";}

{if($1=="Solid" && $2=="archive"){
for(i=3;i<=NF;i++) printf "%-30s ",$i;printf "\t";getline;getline;
if($0=="Recovery record is present"){printf "Yes / ";
for(;;){getline;if($0=="Data header type: RR"){getline;printf "%sbyte\n",$2;break;}}
}else printf "No\n";}}


95:デフォルトの名無しさん
08/02/02 13:01:48 .net
それを動かすにはまず gawk をどこかから入手する。

96:デフォルトの名無しさん
08/02/02 17:48:45 .net
>>94
>↓のソースを書いていただいたのですが、

書いた人に聞く。

と答えると、わけのわからん理由を言ってごねるだろうから、
先に言っとくと、そんな見苦しい言い訳するな。

どうせ答えたって、今度は○○がわかりませんとか言い出すんだろ?
どっかからgawkを落として展開しろよ。全く、一生ググってろよカス
"C:\Program Files\WinRAR\UnRAR.exe" lt *.rar | "gawkのフルパス" -f rr.awk


97:デフォルトの名無しさん
08/02/10 19:16:33 .net
すいません、あるテキストを{print $1,$2}として抽出して

aaa 1
aaa 2
aaa 3
bbb 1
bbb 2
ccc 1
ccc 4
...

とまではできたんですが、並んでいるデータをそれぞれ、

aaa 6
bbb 3
ccc 5

と集計したいんですが、どのようにすればいいでしょうか?

98:デフォルトの名無しさん
08/02/10 19:28:07 .net
awk '{count[$1] += $2;} END{for (aaa in count) {print aaa count[aaa]}}'
あとはソートすればいいはず

99:97
08/02/10 20:22:03 .net
>98さん、ありがとうございます!
情けないのですが、今まで便利なツールに頼っていて全然コマンドについて理解できていなかったので困っていました。
実はメールログで送信者がどれだけの通数を送信してるかを確かめるためにコマンドでできないか、で>97でつまづいていました。
何とか途中までできたんですが、非常にスーパーエレガントな1行コードでして…。

質問ついでで申し訳ないのですが、
(aaa in count) {print aaa count[aaa]}
のaaaについてはどう解釈すればいいのでしょうか?



100:デフォルトの名無しさん
08/02/10 20:33:27 .net
>>99
bashとかのforとかと同じで適当な文字列ならなんでもいいです.例に出てきたaaaなんかにするからややこしくなってすみません.
for(hoge in list) {...}
で配列listのキーを片っ端からhogeに入れてループするって意味になるはずですよ.

101:デフォルトの名無しさん
08/02/10 20:36:22 .net
98じゃないけど

awk '{count[$1] += $2;} END{for (i in count) {printf "%s %i\n", i, count[i]}}'

こうやって書けばしんせつじゃね?
データの中のaaaとloopカウンターのaaaを同じ名前にするのは意地悪だと思うよ



102:デフォルトの名無しさん
08/02/10 20:37:23 .net
101です。すまんonz


103:≠98
08/02/10 20:39:44 .net
あー、みんな書いているから私の書いたのは大幅に削るか。
そのENDブロック内は、
for (制御変数 in 連想配列) {...;}
というパターン。

その前段のcount[$1] += $2は一行目のとき
count["aaa"] += 1と解釈される。以下同様に。
このcountが連想配列として使われているということ。

104:デフォルトの名無しさん
08/02/10 20:42:05 .net
>>101
…反省してます

いや,ほら,ついいつものクセで…ごめん

105:97
08/02/10 20:52:15 .net
いえいえいえいえ…そういう意味じゃなくて教わっていながらすいませんです。
上記で書いたとおり便利ツールに頼り切ってて殆ど知らない私が悪いのですが…。
今一生懸命3byte程度の脳みそで勉強してるんですが、2日目で挫折しそうで質問させて貰いました…。

たとえばログには
Feb 9 22:44:40 localhost postfix/qmgr[1936]: 345C48C0154: from=<use1@example.com>, size=556, nrcpt=1 (queue active)
と必ず出ます。で、
1,生ログをそのまま処理するのが怖い(大きなファイル)ので、日付でログを抽出して別ファイルへ保存。
2,grepで nrcpt=と抽出して、さらにgrep -vで除外するドメインを指定して抽出
3,そしてsedでnrcpt=を削除して
4,ここで>97のように$7と$9を並べたところで脳みそのバッファエラーを起こしました。

この処理の方法もエレガントなことは分かっていますが、恥は承知でお伺いした次第です…。

106:デフォルトの名無しさん
08/02/13 07:31:34 .net
gsubで[.*]を置き換えるにはどうすればいいでしょうか?

107:デフォルトの名無しさん
08/02/14 02:38:02 .net
>>106
それはリテラルとして扱ってということかい?
なら全部エスケープすればいいと思うが何か問題があるの?


108:デフォルトの名無しさん
08/02/16 01:08:44 .net
awkで現在時刻からn分前から以降のログだけを抜き出したいんですが、どうすればいいでしょうか…。
02 15 12:34:56 xxxxxxxxx
02 15 13:45:01 xxxxxxxxx
...
...
...
とかの形式なので、strftime()とかで現在とログの時刻を比較して抜き出す、とかを試したんですがダメでした…

109:デフォルトの名無しさん
08/02/16 01:49:16 .net
>>108 これで駄目かな?(一応 gawk 3.0.4 では動いた)
BEGIN{
n=5
basetime=strftime("%m %d %H:%M:%S", systime()-60*n)
}
{
chktime=substr($0, 1, 14)
if(chktime >= basetime) print
}

110:デフォルトの名無しさん
08/02/16 02:23:28 .net
>109

ありがとうございます…素直に目が鱗でした…。

> chktime=substr($0, 1, 14)

なんですね…
perlが使えない環境なので、これが分かればいろいろ流用効くので助かりました。
ありがとうございます。もうちょっと精進します。。。

111:デフォルトの名無しさん
08/02/18 18:58:36 .net
>>29
昨年6月に「AWKを256倍使うための本」が本屋の書棚にあったので買いました。
奥付に
1993年8月21日初版発行
2007年5月9日 第1版第16刷発行
と書かれています。

112:デフォルトの名無しさん
08/02/18 22:32:44 .net
>>111
いつのレスにレスしてんだ(w

モレも買ったけど、まだ大きな本屋で見かけるね。


113:デフォルトの名無しさん
08/02/19 02:59:17 .net
>2007年5月9日 第1版第16刷発行 

本屋の棚で眠り続けてたってわけじゃないのかw


114:デフォルトの名無しさん
08/02/24 00:57:13 .net
目が鱗 に一致する日本語のページ 約 1,920 件中 1 - 20 件目 (0.24 秒)

115:デフォルトの名無しさん
08/02/24 01:00:56 .net
メガ鱗

116:デフォルトの名無しさん
08/03/28 21:53:28 .net
sed, awk, ruby を使う。
それぞれ適材適所で使うけど、
「sed だけ」「awk だけ」で済ませられると、
不思議な喜びを感じる。

117:デフォルトの名無しさん
08/03/30 14:05:33 .net
>>116
うち、AIX使ってるんでksh+sed+awk+perlだな。
rubyが標準でインストールされてる環境ってあんまないと思う。

118:デフォルトの名無しさん
08/03/30 16:22:26 .net
古いサーバだとPerlすら入ってない事があるからawkは重宝する。


119:デフォルトの名無しさん
08/04/06 10:26:45 .net
最近のgawkがネットワークにも使えると知ってちょっと驚いたw
カーニハンの本レベル(とか256倍)しか知らない人って多いと思う。

120:デフォルトの名無しさん
08/04/06 12:44:41 .net
ノーマルのawkでXMLを字下げしたりしてうまく表示させるにはどうすればいいのかな・・・

121:デフォルトの名無しさん
08/04/06 17:09:18 .net
sedだけで書けると、俺って頭イイかもって思う。

#!/bin/sed -f

122:デフォルトの名無しさん
08/04/06 17:16:17 .net
文字列の単純な置換だけならawkより簡単に書けるんだけど。
awkに固執しないで臨機応変にsedを使うって意味でなら要領がいいという意味で賢いけど。
# awkで書いた方が簡単なことをsedで頑張って書いたのだとしたら、その意味では頭悪いなw

123:デフォルトの名無しさん
08/04/06 17:34:45 .net
awkからsystemでsed呼ぶことは時々あるw

124:デフォルトの名無しさん
08/04/06 18:49:04 .net
>>24
awkって表計算のような処理に特化してますよね。
その点が非常にユニークというか事務処理の言語だな、と。
visicalc(1979)awk(1977)ですからawkのほうが若干古いんですが、
表計算はセルに直接式を書くという発想が新しかった。うむむ。

125:デフォルトの名無しさん
08/04/06 19:26:56 .net
VisiCalcの考案者Dan Bricklinによるアイデアの説明
URLリンク(www.danbricklin.com)

Danの電卓がHPじゃなくてTIなのが意外な感じ。
The idea for the electronic spreadsheet came to me while I was a student at the Harvard Business School, working on my MBA degree, in the spring of 1978.
Sitting in Aldrich Hall, room 108, I would daydream.
"Imagine if my calculator had a ball in its back, like a mouse..." (I had seen a mouse previously, I think in a demonstration at a conference by Doug Engelbart, and maybe the Alto).
And "..imagine if I had a heads-up display, like in a fighter plane, where I could see the virtual image hanging in the air in front of me.
I could just move my mouse/keyboard calculator around, punch in a few numbers, circle them to get a sum, do some calculations, and answer '10% will be fine!'"
(10% was always the answer in those days when we couldn't do very complicated calculations...)

126:デフォルトの名無しさん
08/04/07 02:52:10 .net
はじめましてgawkの質問です
お手すきの時にでもご解答頂けましたら助かります

2chでお話していただいた方からgawkを教えて頂きました
正規表現でマッチした部分がいくつあっても全ての箇所を1アクションで保存できる優れものです
当方、言語は全く知らないので先ほどまでテスト実行しては驚いていました
この優れものを今後末永く使っていきたいのですが
下記の事項をググって見たのですがわかりませんでした
どなたかわかる方おられましたら教えて下さい

私のやりたいこと
・EUCを読み込んでS-JISを出力
・既存のテキスト末尾に追加書き込み保存
(教えて頂いたスクリプトは上書き保存なので出力先の内容が消えてしまいます)

気長に待っていますので何卒よろしくお願い致します

127:デフォルトの名無しさん
08/04/07 03:10:31 .net
>>126
前者はawkでやるべきことではない。iconv, nkfなどそれ専用のツールがある。
後者も必ずしもawkは不要。コマンドラインが使える環境なら普通にできる。
例えば、Unix系なら cat append.txt >> original.txt で既存のファイルに追加できる。
DOS系でも、type append.txt >> original.txt でできる。
要は、awkのいいところはそれ単体でなんでもできる(或いはできない)ことではなく、
コマンドライン環境で力を発揮するツールであること。

例えば、正規表現でマッチした文字列を置換するだけならテキストエディタでもできる。
あーそうそう、エディタがあれば文字コードの変換もそれだけでできる。
所謂テキストエディタを使ったことがないなら、一度(正規表現検索機能、
文字コード変換機能のある)テキストエディタを触ってみるといいかもしれない。

128:デフォルトの名無しさん
08/04/07 03:32:54 .net
>>127さん
>>126です
お疲れのところ早々のご解答誠にありがとうございます
コンバートは別のツールで行う
DOS環境ではtype append.txt >> 出力先ファイル名で追加書き込み
了解しました
エディターは秀丸エディターを使っています
コンバートは出来るのですが検索でマッチした文字列は1箇所ずつコピーなんです
sakuraエディターで一括コピーや切り取りが出来ると教えてくれた方もいてたのですが
sakuraエディターは試したことが無いんです
詳しくありがとうございました

129:デフォルトの名無しさん
08/04/07 03:56:33 .net
AAA.txtを開き”東京(.+?)号室”を検索する
マッチした複数箇所を一括でコピーしてTEST.txtにペーストする

BBB.txtを開き”東京(.+?)号室”を検索する
マッチした複数箇所を一括でコピーしてTEST.txtの末尾にペーストする

CCC.txtを開き”東京(.+?)号室”を検索する
マッチした複数箇所を一括でコピーしてTEST.txtの末尾にペーストする

よろしくお願いします

130:デフォルトの名無しさん
08/04/07 04:02:07 .net
>>127は結局awkの解答はしないのになんでしゃしゃり出てきたの?
できないじゃん

131:デフォルトの名無しさん
08/04/07 06:48:34 .net
>>130
質問に具体性がないから一般論を書いただけだけど。

>>129
awk '/東京(.+?)号室/ {print > "TEST.txt";}' AAA.txt
awk '/東京(.+?)号室/ {print >> "TEST.txt";}' BBB.txt
以下同様に。

132:デフォルトの名無しさん
08/04/07 12:02:34 .net
>>131
レスありがと
gawk '/東京(.+?)号室/ {print > "TEST.txt";}' AAA.txt
gawk '/東京(.+?)号室/ {print >> "TEST.txt";}' BBB.txt
ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。
gawk3.16では使えない?



133:デフォルトの名無しさん
08/04/07 13:29:56 .net
>>132
DOSのコマンドラインの使い方は他所で聞いてくれ。

134:デフォルトの名無しさん
08/04/07 13:38:24 .net
役所の窓口みたいな対応だな。


135:デフォルトの名無しさん
08/04/07 13:43:47 .net
DOSのコマンドラインについては多くを知らないんだよ。

136:デフォルトの名無しさん
08/04/07 16:36:42 .net
DOSの場合は空白を含む場合シングルクォートじゃダメだからな。
ダブルクォートで括って中のコードは
シングルクォートか、エスケープしてダブルクォート入れるか。

一番簡単なのは、ワンライナーでもファイルに起こしてしまうこと。
gawk -f myscript.awk AAA.txt
とやってしまえば、シングルクォートとかダブルクォートとか気にする必要はない。

137:デフォルトの名無しさん
08/04/07 18:22:15 .net
>>132
二つ問題がある。
gawkの正規表現では.+?というのは使えない。
cmd.exeでは、シングルクォートを引数を
くくるのに使えない。

なんかよくわからんが、perlでテキストを丸飲みしてから
処理すればいいんじゃないのか?


138:デフォルトの名無しさん
08/04/12 19:00:42 .net
VisiCalc といえば、出始めの頃に TRS-80 用 を Radio Shack で見せてもらったんだけど、学生だった私には価値がわからなかったなぁ。
まぁ、これに限らず、『なんでこんなコマンドやオプションがあるんだ?』ってのは多い。
使い方じゃなく、なぜそれがあるのかを包括的に解説した本や web site ってありますか。(たとえば多くの unix コマンドを網羅しているとか)

139:デフォルトの名無しさん
08/04/12 19:01:22 .net
ああ、スレ違いだった。ごめんごめん。

140:デフォルトの名無しさん
08/04/12 19:58:47 .net
なんという誤爆


141:デフォルトの名無しさん
08/05/06 02:42:04 .net
>>132 もう居ないかな。gawk3.1.6 + nkf2.0 使用@cmd.exe

C:\work>type aaa.txt (※EUCなので化ける事を確認)
、ロ、イ、ロ、イ
ナ・ケ貍シ
ナ・」イケ貍シ
ナ・」ア」ーケ貍シ
ナ・、ロ、イケ貍シ
ナ・、ユ、ャケ・ナ・ユ、ャケ貍シ
ナ・」ウケ貍シ、ネナ・」オケ貍シ

C:\work>nkf -Es AAA.txt
ほげほげ
東京号室
東京2号室
東京10号室
東京ほげ号室
東京ふが号
東ふが号室
東京3号室と東京5号室

C:\work>nkf -Es AAA.txt| gawk "/東京.*号室/{print $0}"
東京号室
東京2号室
東京10号室
東京ほげ号室
東京3号室と東京5号室

既出の通り文字変換nkf(>>127) 正規表現の制約で条件変更(>>137)
実際に使う場合はこんな感じでバッチ作るとか。
C:\work>nkf -Es AAA.txt| gawk "/東京.*号室/{print $0}" >>TEST.txt


142:141
08/05/06 02:56:02 .net
と、方法を書いておいてアレだけど、
秀丸使ってるならgrepの実行で検索するファイルに(現在の内容)で
検索結果からファイル名と行番号を除去するのでもできそうな気がする。
盛大にスレ違いだけど。


143:デフォルトの名無しさん
08/05/06 14:28:43 .net
>>142さん
ありがと
まだ思うようにできていないんだ
参考になるよ感謝です

144:デフォルトの名無しさん
08/06/16 01:50:26 .net
ひでえwwwwwwwwwwwwww

145:デフォルトの名無しさん
08/06/16 01:50:57 .net
すまん誤爆

146:デフォルトの名無しさん
08/06/25 02:17:58 .net
質問です!

以下のファイルhogeからawkで、価格を抜き出して合計値を出したいと思っています。
ファイルの内容は、書籍名と価格です。価格は一番後ろの数字になります。

----------------------
$ cat hoge
それいけ!あんぱんまん 1000
メタボリックを撃退せよ 1000
下流社会 1000
上流社会と下流社会 日本のこれから 1000
論文 2008 日本の抱える問題 1000
論文 2007 日本の抱える問題 過去問題集 1000
----------------------

難しいのが、書籍名の2008や2007などの数値が含まれていることや空白が含まれていることです。
1行目の場合2列目が価格になりますが、2行目の場合4列目が価格となります。

このように一番最後の列(価格)を取得し、合計値を計算するにはどうすればよいでしょうか?

ご教示お願いいたします。




147:デフォルトの名無しさん
08/06/25 02:28:00 .net
awk '{x+=$NF}END{print x}' hoge

148:デフォルトの名無しさん
08/06/25 09:33:15 .net
xじゃなくてsumとかにしようよ。

149:デフォルトの名無しさん
08/06/25 13:36:51 .net
一行野郎は手数(打数)重視なんじゃまいか

150:デフォルトの名無しさん
08/06/25 15:27:28 .net
難しいってマニュアル読めば最後の要素を指すものが何か書いてあると思うが

151:デフォルトの名無しさん
08/06/25 16:09:13 .net
読んでたら他人になんか聞きません。

152:デフォルトの名無しさん
08/06/25 16:34:16 .net
じゃあ、マニュアル読んでもわからなかったらお手上げか

153:デフォルトの名無しさん
08/06/29 21:37:04 .net
Windows 版の gawk-3.1.5 で`双方向パイプがうまく動作しません。以下、
URLリンク(www.kt.rim.or.jp)
からのサンプルファイルですが、途中で止まってしまって、返事が返ってきません。

BEGIN {
command = "sort"
n = split("abcdefghijklmnopqrstuvwxyz", a, "")

for (i = n; i > 0; i--)
print a[i] |& command
close(command, "to")

while ((command |& getline line) > 0)
print "got", line
close(command)
}

Cygwin の gawk では問題ありませんでした。


154:デフォルトの名無しさん
08/07/01 20:42:14 .net
これ使うといいよ
URLリンク(www.pipeunish.jp)


155:デフォルトの名無しさん
08/07/02 01:35:15 .net
どうやったら Cygwin の gawk(GNU Awk 3.1.6) で print length("あいう") が 3 になるのですか?


156:デフォルトの名無しさん
08/07/02 02:13:54 .net
Windowsのバージョンくらい書こうな。でないと釣りと思われるよ

157:デフォルトの名無しさん
08/07/02 08:51:57 .net
jgawk?

158:デフォルトの名無しさん
08/07/02 09:32:16 .net
gawk.dllって、まだ誰かメンテしてくださってるんでしょうか?
最新版gawkのdllを探してるんですが、見つかりません。

または、ソースのtar.gzからdllを作る方法が載っているページを
御存知の方がいらっしゃいましたら、教えていただけると助かります。


159:デフォルトの名無しさん
08/07/02 10:34:53 .net
なにをいってるのかわからん
ソースのtar.gzってなに?

160:デフォルトの名無しさん
08/07/02 10:42:47 .net
URLリンク(ftp.gnu.org) からダウンロードできるgawk-*.tar.gzのことですが。。
sourceからgawk.exeを作ったりしないのですか??

dllと書いているのでわかるかとは思いますが、
windows環境下での話です。普段はcygwinでmakeしたgawkを使っているのですが、
dllがあると他の言語から呼び出して使えるので便利かなーと思ってます。


161:デフォルトの名無しさん
08/07/02 10:45:49 .net
cygwinはwin用のソースじゃないから
win用のソースがいる

162:デフォルトの名無しさん
08/07/02 11:53:32 .net
>>160
昔あったDLL版は作者が独自に作ったものみたいで
本家に反映されてないから本家のソースからDLLを作るのは無理。
DLL版のソースを参考にして自力で作るか
できないなら作者に連絡して協力を求めるしかない。

163:デフォルトの名無しさん
08/07/02 12:05:07 .net
>>160
自分で改修するしかないだろ

164:デフォルトの名無しさん
08/07/03 02:36:53 .net
(ノ∀`) アイタタタ

165:155
08/07/05 15:47:31 .net
>156
XP [Version 5.1.2600] でつ

166: [―{}@{}@{}-] デフォルトの名無しさん
08/07/05 17:55:22 .net
>>153
まだ見てるか?
多分なおってると思うんで新しいので試してみてくりや。


167:デフォルトの名無しさん
08/07/06 06:36:13 .net
うお?
作者降臨か

168:デフォルトの名無しさん
08/07/06 07:02:21 .net
すんばらすぃ

169:デフォルトの名無しさん
08/07/20 00:40:48 .net
AWK 使って15年? 30年前のコードが吐き出すデータをちょこっと処理しようとして…
FS=/[ ()]+/ は期待通りの動きをせず、FS="[ ()]+" と書かねばならない。
初めて知った。
 検索しても、これについて明快に書いてあるページがなかなか見つからなかったが
>正規表現定数がそれ自身として現れたとき、それはパターン中に現れたかのように、
>つまり`($0 ~ /foo/)' のようにみなされる。
<中略>
>言語のこの機能は、POSIX標準までドキュメント化されなかった。
orz
 これで1時間ぐらいムダにした。私が知らなかっただけですか??


170:デフォルトの名無しさん
08/07/20 00:58:40 .net
『プログラミング言語AWK』には一応載ってるけどな
> (FSに代入される)文字列が1文字より長いときは,正規表現として扱われる

171:デフォルトの名無しさん
08/07/20 01:10:48 .net
ベル研系統の言語は記述の自由度はあるが挙動がつかみづらい

172:デフォルトの名無しさん
08/07/20 02:09:53 .net
>>170
 ””で囲んだ文字列が正規表現として扱われる ということと
 //で囲んだ正規表現定数で書いてはいけない ということは同じではない。
実際、split関数の 第3引数に与える正規表現は どちらでも動く
 むむむ、ここでは($0~/foo/)に置き換えて評価されないんだ…
171の意見が正しいようだね チャンチャン



173:デフォルトの名無しさん
08/07/21 12:39:44 .net
複数のファイルの読み込みってできますか?
print ファイル1の$2 ファイル2の$1
みたいな感じで

174:デフォルトの名無しさん
08/07/21 13:06:32 .net
>>173
pasteで繋いじゃダメ?
私はよくやるけど。
仮にファイル1が5カラム固定なら、
paste ファイル1 ファイル2| awk '{print $2 $6;}'
てな感じで。
# カラム数可変ならもう一捻り必要だけどね。

175:デフォルトの名無しさん
08/07/21 13:50:02 .net
>>173
awkだけでやりたいならgetlineを使えばできる。

176:デフォルトの名無しさん
08/07/22 18:37:52 .net
awkすごい便利で、gnuplotと組み合わせてExcelから解放されつつあります。
上の方にあったDFAとNFA使ってる事からくる違いってなんですか?


177:デフォルトの名無しさん
08/07/23 02:40:07 .net
>>176

一番の違いは、DFAだと後方参照ができないことかな。
とりあえず

DFA
前準備に手間を掛けるけど処理そのものは早い

NFA
即座に処理を始めるけど、処理に時間がかかる場合がある。

ぐらいに考えておけばいいと思う。


178:デフォルトの名無しさん
08/08/02 00:57:57 .net
保守

179:デフォルトの名無しさん
08/08/02 14:34:05 .net
sh + awk は明らかに簡単だと思う。
sh + awk で出来ることを perl のみで記述する人の気持ちがどうしても理解出来ない。
ただ、ネットワークプログラミング以上になるとC, perl, ruby にならざるを得ないけど。

マシン単体での種々の手続き記述だと、
sh + awk がやっぱり一番完結になると思うんだけどな~。

180:デフォルトの名無しさん
08/08/02 14:49:58 .net
おれもawkでできることならawkでやる。
でもあまりにトリッキーなことになりそうだったらperlでやったりするかな。


181:あいちゃん
08/08/03 01:39:18 .net
人に渡す可能性があるなら、awkは結構つらいことがある。
Perlでやれば基本的に問題ないから、Perlで書く癖がつく。
ShellScriptでいったん使うだけなら、awkは便利だけど。

182:デフォルトの名無しさん
08/08/04 01:23:58 .net
>>180
俺も AWK でできるならAWK。
と考えると バイナリーのデータいじる以外はAWKでできるのでは…
(少なくとも 俺に日常のニーヅでは そうだ)

183:デフォルトの名無しさん
08/08/04 02:16:24 .net
>>182
同感。ただバイナリは仕方ないにしても、
全半角混在の固定長フォーマットが扱いにくいんだよな。
ASCIIにすると全角のみ部分が処理しにくいし、
SJISとかにすると正しく切り出せないし・・・
あれはなんとかならんものかな。

184:デフォルトの名無しさん
08/08/07 01:55:09 .net
やっぱり ASCII だけの問題にしておいた方が無難。

185:デフォルトの名無しさん
08/08/11 15:38:13 .net
URLリンク(www.kt.rim.or.jp)
でダウソできるのがASCIIとSJISをうまく扱えるやつぢゃねの?

186:デフォルトの名無しさん
08/08/13 00:38:23 .net
>>185
いや、そのgawk使ってるけど、全半角混在の固定長は困るはず。
両方別々なら問題なく扱えるけど、同時には扱えない。
例えば。SJIS1行5バイト+改行の固定長ファイルで
1行は2項目(a:全半角混在4バイト b:半角のみ1バイト)のファイルがあるとき。
asciiモードならa, bを切り分けられるがaの全角文字は処理できない。
sjisモードならa, bを切り分けられない。

悩ましいのは、項目を切り分けるスクリプトをascii オプションで起動して
出力結果をsjisで処理すれば(めんどくさいけど)現状で処理できてしまう。
ので、マニュアルに書いてある通り、作者をおねがいすれば可能性はあるかもしれないが、
お願いするのが躊躇われる感じなのね。


187:デフォルトの名無しさん
08/08/13 22:12:09 .net
awkは時代の関数だから使われなくなっていくんだろなあ

188:デフォルトの名無しさん
08/08/15 02:08:00 .net
UTF-8の場合でも固定長は半角幅しか対応できてない。
文字数とバイト数と表示幅とか、日本語は面倒だのう。

length()とかでバイト数を拾えないから自前で処理もやりにくい。

189:デフォルトの名無しさん
08/08/19 22:37:59 .net
>>188
一瞬納得しかけたけど。
冷静に考えると、そもそも1文字が可変長であるUTF8を
固定長ファイルの文字コードに使おうと考えた奴を締め上げて
泣くほど問い詰める方が先だと思うのは俺だけ?

考えても考えてもメリットが思いつかないよ…

190:デフォルトの名無しさん
08/08/21 00:40:10 .net
>>189
ほとんどの文字コードが可変長だからなあ。
相対的に見ればマシな方に入るんじゃない?
ホストが絡むと文字コード周りは悲惨だよ…
ホストじゃないならそもそも固定長じゃなくて良いんだけどね。

191:デフォルトの名無しさん
08/08/23 01:53:25 .net
あるフィルタスクリプトをgawkで書いているのですが
文字のコードを整数値に変換しようとしてうまくいきません
たとえば「c」という文字のコードを整数値にしようとして
BEGIN {
 testChar = "c";
 printf("testChar=%d\n",testChar);
}
のようにしても「testChar=0」と表示されてしまいます
良い方法があればお教えください

192:デフォルトの名無しさん
08/08/23 03:21:15 .net
>>191

awklib に ord ってユーザー定義のライブラリ関数があるからそれを使う。
自前で作ってもいいけどね。

くわしくは info gawk で調べて。


193:191
08/08/23 03:28:08 .net
>>192
ありがとうございます
早速検討してみます

194:191
08/08/23 10:56:41 .net
>>192
URLリンク(www.kt.rim.or.jp)
にあったものを試してみました.期待どおりの動作をしてくれます.
どうもありがとうございました.

195:デフォルトの名無しさん
08/09/15 01:12:37 .net
入力内容をawkで生成することは出来ますでしょうか
もしくはBEGIN等のブロック内で文字列を生成して
その文字列のパターン毎に分岐、フィールドを使っての処理
(要はawkに入力ファイル渡した時に簡単に書ける処理)
を簡単に書くことは出来るのでしょうか

例えば…どんな処理が適切な説明か判りませんが
BEGIN{for(i=0;i<10;i++) print int(rand()*10),int(rand()*10),int(rand()*10)}
の結果に対して
$1+$2+$3<10{ print $1+$2+$3 }
$1+$2+$3>=10{ print ($1+$2+$3) % 10 }
…とかそんな感じで、テキストを生成した結果に対して
フィルターとして比較式や正規表現で分岐して、フィールドを使って処理する感じです。

やっぱりバッチファイルとawkファイルをいくつも作ったり
一行一行に対してif文で分岐したりsplitで分割するしか無いですかね…。

196:デフォルトの名無しさん
08/09/15 01:52:51 .net
>>195
敢えて入力を生成したいのなら、awkをパイプで繋げばいいと思う。
そうではなく、単に乱数で処理を振り分けたいのなら普通にif文でいいと思う。

それはさておき、
--
$1+$2+$3<10{ print $1+$2+$3 }
$1+$2+$3>=10{ print ($1+$2+$3) % 10 }
--
は別に上の条件式は要らんだろ。一桁の数値を10で割った余りは元のままだからな。

197:デフォルトの名無しさん
08/09/15 14:18:55 .net
>196
いやあくまで例題なので内容は深く考えないでください…orz

普通にif文とは言うものの、折角awkが標準で備えてる便利な機能を無視して冗長な書き方するのも難だし
かと言って.awkファイル複数個とバッチで、パイプでつなげて処理するのも…う~ん、となってしまう。
良い書き方無いかなぁと思ったので聞いてみたのですが、ifとsplitで頑張ります。

198:デフォルトの名無しさん
08/09/16 02:58:54 .net
質問がよくわからんのだが、BEGIN部で生成したファイルを処理部で扱いたいということかな?
例えば、
gawk 'BEGIN{ ARGV[1]="in_file.txt"; ARGC=2; }{ print }'
ってやったら in_file.txt を表示できるぞい

199:デフォルトの名無しさん
08/09/16 09:51:03 .net
>198
!!!
目から鱗です。

そっか、ファイル生成しちゃえば一発で行けるのか…やってみます

200:デフォルトの名無しさん
08/09/16 15:07:48 .net
うげ、一旦ファイルを作るのはありなのかよ。
ifを使うのは冗長なのに、ファイルを作るのは冗長じゃないってどんなセンスなんだ。

201:デフォルトの名無しさん
08/09/16 17:48:16 .net
>200
入力データは規則性のあるもので、生成してしまえるけど
それに対しての分岐は多い…という場合
ifやsplitを羅列するよりも、awkが元々持ってる
パターンとフィールド分割を使った方が
スッキリすると思うのですが間違ってるでしょうか…。

202:デフォルトの名無しさん
08/09/16 19:39:26 .net
>>201
別にいいんじゃね?
巨大な中間ファイルを作るってわけでもないんだろうし。
まぁ、次の理由で私は中間ファイルを作るのは避けるけどね。
・フルパスを指定しない場合、カレントディレクトリに書き込み権限がある保障がない。
・そもそも同名ファイルが存在していて書き込み権限がないかも知れない。
・つーか、同時に2件動かしたらバッティングしてしまう。
・だからと言って、一々ユニークな名前のファイル名を生成するのも面倒だ。
・しかも、中間ファイルは後で消しておく必要があるかもしれない。

それと、自前で入力を生成するなら、最初から分割された状態で作ればいいからsplitは要らないね。
パターンを使うかifを使うかは趣味の問題のような気がするけど。
# $1+$2+$3<10{print;}と書くかif($1+$2+$3<10){print;}と書くかの違いだもんね。

203:デフォルトの名無しさん
08/09/18 01:19:00 .net
色々考え方があるのね。

自分ならトリッキーな細工して1つに収めず分割してif使わずに書くけど。
手早くカタをつけられるのがawkの良い所だと思うし、
技巧に走ると間違いなく忘れるのでメンテ不可能になる可能性大

ま、それはそれとして>>198はパズル的な面白さがあって良いね。


204:デフォルトの名無しさん
08/09/19 19:54:42 .net
>202
う~ん、言われてみればそうかも。
一応、今回のは仕事で使うわけでもなければ他人に使ってもらう予定もない
完全な個人用スクリプトなのでどうにでもなりますが
これが業務や自分以外も使うものであれば素直にifなんでしょうね。

205:デフォルトの名無しさん
08/09/22 20:50:40 .net
2008/09/15 13:17 61 20080915142145.txt
2008/09/16 13:17 316 2008091611529.txt
2008/09/22 20:09 24,028 2008_0922asahiindex.txt
2008/09/22 12:57 1,545 clean.txt

というファイル一覧から、gawkで今日の日付のファイルだけ抜き出すにはどうすりゃいいんだっけ?

BEGIN{month = strftime("%m",systime()); date = strftime("%d",systime())}

/month/ && /date/ {print $0}

でいいかと思ったら、/ /のなかにmonthとかは使えないらしい。

/strftime("%d",systime())/ {print $0}
とべた書きしてもだめ。
ど忘れ中。ヘルプミー。


206:デフォルトの名無しさん
08/09/22 21:05:13 .net
BEGIN{date=strftime("%m/%d")} $0 ~ date {print $0}

207:デフォルトの名無しさん
08/09/22 21:45:34 .net
>>206
thanks!

208:デフォルトの名無しさん
08/10/10 19:41:51 .net
質問です。
入力中のファイル名はFILENAMEにセットされますが、
入力中のファイルのパスを取得するにはどうしたらよいですか。


209:デフォルトの名無しさん
08/10/10 22:13:43 .net
>>208
FILENAMEで得られる情報が全て。フルパスが欲しいということなら、
cwdを取得してそこからの相対パスがFILENAME。

210:デフォルトの名無しさん
08/11/12 19:19:08 .net

awkの結果を set か setenv の変数に代入したいです。

awk '{ print $1+ $3 }' test.txt
で数値が出ます。
この結果を変数に代入するにはどうしたらいいんでしょうか?

set tmp=`awk '{ $1+ $3 }' test.txt`

これだと上手くいきません。print はそのままでいいのでしょうか?

211:デフォルトの名無しさん
08/11/12 20:24:22 .net
なんで print を省略できると考えたのかが謎だが

212:デフォルトの名無しさん
08/11/12 23:57:16 .net
>print はそのままでいいのでしょうか?
まず試せよw

213:デフォルトの名無しさん
08/11/13 14:17:14 .net
新紀元社のプログラミング言語awkがどこも売り切れなんだけど
もう入らないのかな

214:デフォルトの名無しさん
08/11/16 03:02:56 .net
>>211
printは画面表示するもの→変数に入れるだけなら不要
…と思ったんじゃ内科ね

215:デフォルトの名無しさん
08/11/18 11:28:33 .net
カンマ区切りのデータファイルがあり、その中で、第1フィールドと第3フィールド内にもし
子音、子音、子音、母音が存在すればその行だけ抜き出すオークのスクリプトファイルをつくりたいのですがどうすればよいですか

216:デフォルトの名無しさん
08/11/18 11:41:15 .net
>>215
データファイルのサンプルと抜き出したい行ヨロ

217:デフォルトの名無しさん
08/11/18 11:50:40 .net
こんな感じです
takeshi,fiad,fdjioaf,fdjsoafds(←該当なし)
dddacea,fsaofsa,rrra,fjisaofdjsa(dddaとrrraが該当)
aexxxu,dsoifsa,yyyuo,fjsaofa(xxxuとyyyuが該当)

218:びぎなぁ
08/11/18 12:12:55 .net
オークスクリプトを実行すると情報を表示するようにしたのですが1行目と最後の行だけを表示しないようにするには
END内に何て書けば宜しいでしょうか

219:デフォルトの名無しさん
08/11/18 12:43:59 .net
>>215
BEGIN{FS=","}
function term_check(term, lower_term) # lower_term は局所変数
{
lower_term=tolower(term)
if(lower_term ~ /[bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][bcdfghjklmnpqrstvwxyz][aiueo]/) return 1
return 0
}
{
if(term_check($1) && term_check($3)) print
}

パターン繰り返しって {3} とかでいけるはずなんだが
書き方知らないのでコピペしたw

220:デフォルトの名無しさん
08/11/18 12:47:37 .net
>>218
逐次出力してる?
END でまとめて出力してる?

221:デフォルトの名無しさん
08/11/18 13:53:22 .net
>>218
1行ずつバッファリングして、次の行の入力で前の行を出力すれば最後の行は消えてなくなる。
awk 'NR > 2 {print buffer;} NR > 1 {buffer = $0;}'

222:デフォルトの名無しさん
08/11/18 14:20:29 .net
>>215
gawkなら
awk -F "," -v r="[bcdfghj-np-tv-z]{3}[aiueo]" --posix '$1 ~ r && $3 ~ r'
$1と$3どちらか一方にあればいいなら&&を||に変えてね

223:デフォルトの名無しさん
08/11/18 16:29:37 .net
>>219
助かりました!

224:びぎなぁ
08/11/18 16:46:03 .net
出来ました ありがとうございます

225:デフォルトの名無しさん
08/11/19 23:48:41 .net
込み入ってて整理できないので教えてください。
・対象のテキストは2行目がない(1行目しかない)かつ
・1行目はひらがなカタカナ漢字で15文字以内
という条件を書くのって、次のようにしたのですが、うまくヒットしません。
どう書けばいいでしょう?

NR==2 && length($0) == 0 && NR==1 && /[ぁ-んァ-ヶ亜-腕]{1,15}/


226:デフォルトの名無しさん
08/11/19 23:53:31 .net
>>225
NR == 2 && NR == 1じゃ、絶対成立しないだろ。

227:デフォルトの名無しさん
08/11/19 23:54:54 .net
awkは行を1行ずつ処理するから、事前にトータル行数を知ることはできない。
トータル行数が1行であることを保証したいなら、ENDブロックで処理するしかない。

228:デフォルトの名無しさん
08/11/20 00:22:37 .net
>事前にトータル行数を知ることはできない
BEGIN部で数えれば?

229:デフォルトの名無しさん
08/11/20 00:28:19 .net
>>228
どうやって? 対象がファイルである保証があるならwcでも呼べばいいけどそれならawkでやる必要さえないよね。

230:デフォルトの名無しさん
08/11/20 03:49:07 .net
{ a = $0 }
END { if (NR == 1 && a ~ /re/) print a }
とか?

231:デフォルトの名無しさん
08/11/20 23:58:06 .net
どなたか、任意ビット幅の2の補数HEXをDECに変換するプログラムを書いてもらえませぬか?

232:デフォルトの名無しさん
08/11/22 12:02:58 .net
仕様が不明確なところがあるし、なによりなんでawkで?


233:デフォルトの名無しさん
08/11/26 22:53:51 .net
>>232
ここがawkスレだからでしょ。

234:デフォルトの名無しさん
08/11/29 03:05:38 .net
>>232
考えるな。感じろw

235:デフォルトの名無しさん
08/12/12 07:21:00 .net
「あなたは何故awkでやろうとするのですか?」
「そこにawkがあるから」

236:デフォルトの名無しさん
08/12/13 04:23:45 .net
awkからsystem()でgrepとかsedとか呼んだりする癖が付いている
シェルスクリプトにする方がむしろ違和感

237:デフォルトの名無しさん
08/12/13 23:56:31 .net
おいおい、grepやsedぐらい呼び出さずにawkでやろうぜ。


238:デフォルトの名無しさん
08/12/16 00:29:26 .net
grepやsedはパイプでつなげて使うものじゃないの?(^^;

239:デフォルトの名無しさん
09/01/10 22:10:41 .net
gawk 3.1.4 mb のwindows版のEXEファイルが欲しい…

240:デフォルトの名無しさん
09/01/11 00:38:51 .net
なんでそんな古いバージョンが欲しいの?


241:デフォルトの名無しさん
09/01/11 12:16:04 .net
>なんでそんな古いバージョンが欲しいの?
lengthとかsubstrで、「j」付き文字列関数があるからです。
3.1.5以降だと、同じスクリプトファイル内で、バイト単位処理と
キャラクター単位処理の混在が難儀なのです。


242:240
09/01/11 15:01:36 .net
3.1.5で文字の扱いが変わったのはその通りだけど、3.1.4のWindows版て
jlengthやらあったっけ?
なかったと思うんだけど。


243:デフォルトの名無しさん
09/01/11 15:48:22 .net
>なかったと思うんだけど。
えっ。3.1.4以前のはバイト単位オンリーって事ですか?
…それでも2バイト換算で扱えばいいから、まだマシかも。

j付きが追加されていたけど、動作変更に伴って廃止された…
と思っていました。
記憶にあるのは、どなたかの独自拡張別Verだったのか…?


244:240
09/01/11 17:54:21 .net
> えっ。3.1.4以前のはバイト単位オンリーって事ですか? ちゃう。
jなんとかがあったのは、
2.11ベースのjgawkと2.15ベースのjgawk
2.15ベースのとgawk+mb
3.0.xベースのgawk+mb
で、3.1.xベースのにはなかったという話だったと思う。
それぞれやってる人が違う。


245:デフォルトの名無しさん
09/01/11 19:05:17 .net
>3.1.xベースのにはなかったという話だったと思う。
そうですか…。
gawk 3.1.4 mb のwindows版のEXEファイルが欲しい…
ではなくて、
3.0.xベースのgawk+mb のwindows版のEXEファイルが欲しい…
という事になる訳ですが…無理っぽい。
あっても関数や組込変数が減少…その前に16bitDOS版ONLYの予感…。
諦めます。240さん、どうもでした。

246:デフォルトの名無しさん
09/01/11 19:50:26 .net
>>245

URLリンク(www.hinadori.atnifty.com)
にあるよ。3.0.6のやつ。
DOS版だけじゃなくてWin32版もある。

3.0.6→3.1.xで増えた機能でも使ってんの?



247:デフォルトの名無しさん
09/01/11 22:30:39 .net
>あるよ。3.0.6のやつ。
おお。 ありがとうございます。
>3.0.6→3.1.xで増えた機能でも使ってんの?
いつ何が増えたのかよく把握していないんですが、
gensubとかmktimeとかswitch-caseとか…ありますかね。
まあ、代替手段はあるので試してみます。どうもです。

248:デフォルトの名無しさん
09/02/23 08:11:12 .net
awkで、組み合わせの全てを作る、という事はできるのでしょうか?
いわゆるnCrの、個数ではなくて、中身を知りたいという事なのですが・・・。
(mawkを使っています)


249:デフォルトの名無しさん
09/02/24 18:18:34 .net
>>248
できます

250:sage
09/03/04 15:23:19 .net
248です。
なんとかできました。249さんどうもです。

251:デフォルトの名無しさん
09/03/04 15:24:16 .net
sage間違えた…

252:デフォルトの名無しさん
09/03/23 11:47:59 .net
int(0.5005*10000)が5004になるのはなぜですか。

253:デフォルトの名無しさん
09/03/23 12:41:00 .net
丸め誤差でしょう。
切り捨て前に0.5足すとか工夫してみては如何でしょうか。
詳しくは、IEEEと丸め誤差辺りのキーワードで検索のこと。

254:デフォルトの名無しさん
09/03/23 19:57:34 .net
>253
ありがとう

255:デフォルトの名無しさん
09/04/13 21:36:16 .net
gawkで掲示板作りたいんですけど、
gawkが使える無料鯖どこかにありませんか?

256:デフォルトの名無しさん
09/04/13 21:58:14 .net
Linuxが入ってるレンタル鯖なら入ってるんじゃないかなぁ?
レンタル鯖板できいてみたら。
さくらのFreeBSDはFreeBSDのawk(!=gawk)だった。

257:デフォルトの名無しさん
09/04/13 22:07:10 .net
>>256
さくらはgawkですか。
Windowsじゃないレンタル鯖ならawkが使えても良さそうですけど、
無料ではなかなか見つからないんですよね。
perl,ruby,phpは多いんですけどねぇ。。

258:257
09/04/13 22:14:30 .net
失礼。
さくらはgawkじゃないawkですか。

259:デフォルトの名無しさん
09/04/18 13:07:13 .net
わらうw
URLリンク(awk.info)

object_variable = class_name.new[(optional parameters)]
object_variable.method_name(parameters)
object_variable.delete

260:デフォルトの名無しさん
09/04/18 13:30:10 .net
>>259
同じくウケた
awkは永続的に使っていて,C-->C++-->Javaと乗り継いできたが,awkはこれらコンパイラ言語を使う上で
良い学習材料になってきたと思い感謝している(もちろん未だにscriptのawkをawkで書いている).
唯一awkで勉強できなかったのがOOPだったから,学習材料としてのawkがこういう方向に活路を見いだすのは
良いことかもしれない.ただし実用に向けて考えてみると,個人的にはOOPが本領を発揮するのは頭の中でalgorithmを
把握しきれなくなる程度に大きなシステムを組み上げる場合なので,果たしてそれをawkで書くかといわれると….

261:260
09/04/18 13:57:19 .net
s/algorithm/データ構造/

262:デフォルトの名無しさん
09/05/09 23:49:39 .net
最近rubyの勉強始めたんだが、
「rubyがあればAWKいらね」とは思えん。
逆にAWKの便利さを再認識した。

やっぱり、簡単なテキスト処理は
AWKでやったほうが簡単だ。

263:デフォルトの名無しさん
09/05/09 23:58:09 .net
各行に対して処理って場合はawkが良いね

264:デフォルトの名無しさん
09/05/10 00:37:15 .net
rubyはオブジェクト指向を強制されるから小回りがきかん

265:デフォルトの名無しさん
09/05/10 01:20:35 .net
JavaScriptが動く HTML実験部屋
URLリンク(homepage2.nifty.com)


266:デフォルトの名無しさん
09/05/14 08:38:05 .net
jawkの話題が全然出ないね。
使ってる人少ないの?

267:デフォルトの名無しさん
09/05/19 23:16:20 .net
>>266
さくっと1行で済むのが気に入ってる俺には無用だな

268:デフォルトの名無しさん
09/06/01 15:22:34 .net
>>266
Jア(オ)ーク、プラグアウッ!

269:デフォルトの名無しさん
09/06/08 01:31:39 .net
URLリンク(gauc.no-ip.org)
Geocoding - 住所から緯度経度を検索 だって。何これおもろい。

270:デフォルトの名無しさん
09/06/21 16:39:12 .net
{if(miso<$1){printf($1)}} miso=30
を実行すると$1が1桁の数字のときにうまくいかないんですけどなぜ?

271:デフォルトの名無しさん
09/06/21 19:43:04 .net
文字列で比較されてるんじゃね?
miso<$1-0
でやったらどう?

272:デフォルトの名無しさん
09/06/21 21:34:56 .net
>>271
ありがとうございます。でもだめでした。
文字列で比較されてるっぽいですね。

273:デフォルトの名無しさん
09/06/21 22:04:19 .net
>>270
何を入力したときに何が出て欲しいの?
うまくいかないってどうなるの?

274:デフォルトの名無しさん
09/06/21 22:23:40 .net
>>273
$1が4のときに出てほしくないのに出てしまうんです...

275:デフォルトの名無しさん
09/06/21 22:31:41 .net
>>274
こんなん?
BEGIN{miso=30}{if(miso<$1){printf("%d\n",$1)}}

276:デフォルトの名無しさん
09/06/21 22:46:46 .net
>>275
出てしまう理由が気になります...なんででしょう
やっぱり271さんの言うとおり文字列比較してるんでしょうか?

277:デフォルトの名無しさん
09/06/21 22:54:47 .net
>>276
awk のバージョン(種別)が分からない
何を食わせてるのか分からない
スクリプトは一行で書いてるのかファイルにしてるのか分からない
一行で書いているならシェルに何を使っているのか

278:デフォルトの名無しさん
09/06/22 00:38:26 .net
文字列比較されてるなら一桁のときに上手くいかないというより
二桁のときだけ上手くいくという感じなのかね。
WindowsXPのコマンドプロンプトでgawk(3.1.5)使って下記を試してみたけど
その現象再現できなかった。
gawk "{if(miso<$1){printf($1)}}" miso=30

279:デフォルトの名無しさん
09/06/22 07:43:07 .net
$awk -W version
mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan

compiled limits:
max NF 32767
sprintf buffer 2040
$seq 1 40 | awk '{if(miso<$1)printf($1)}' miso=30
31323334353637383940
うまく動いているようだが。

280:デフォルトの名無しさん
09/06/22 18:20:09 .net
>>279をマネさせてもらった
$ awk -W version
GNU Awk 3.1.6
Copyright (C) 1989, 1991-2007 Free Software Foundation.

$ seq 1 40 | awk '{if(miso<$1)printf($1)}' miso=30
31323334353637383940

281:デフォルトの名無しさん
09/06/22 19:59:10 .net
miso=30って-v付けなくていけるんだ。しらんかった。

282:270 のが再現できない...
09/06/23 01:02:55 .net
gawkは
コマンドラインで指定されたファイル名が var=val という形式ならば、それは変数への代入であると解釈されます。変数 var は値 val に設定されます (これは、すべての BEGIN ブロックを実行したあとに行われます)。


やっぱりもれの XPコマンドプロンプト環境でも
>gawk -W version
GNU Awk 3.1.6
Copyright (C) 1989, 1991-2007 Free Software Foundation.

>seq 1 40 | gawk "{if(miso<$1) print}" miso=30
31
32
33
34
35
36
37
38
39
40

って期待通りの動きだYO!

283:デフォルトの名無しさん
09/06/24 00:39:07 .net
固定長で改行なしのファイル(6MB超)を処理することになり、
他のソフトで「改行ありの固定長」にしてから、awkで処理していたのですが…

データファイルによく出てくる文字をとりあえずRSに見立てて読み込み
→RSに指定した文字を連接
→固定長の1行分より長かったらその部分を切り出し

していくと「改行ありの固定長」、できちゃいました。
RSに指定した文字がしばらく出てこなければ変数パンクしちゃうし、大分危なっかしいの
ですが、とりあえずawkでできたのが少しうれしい。

284:デフォルトの名無しさん
09/06/24 03:25:12 .net
改行ありの固定長をawkで読んだのなら
substr($0, start, length) でばらせよw

285:デフォルトの名無しさん
09/06/26 11:29:46 .net
>>283
>284みたいな読解力ない馬鹿が湧かないように、判り易く書きましょう。
つーか、具体的なコードも出さずに「awkでできてうれしい」なんてのはチラシの裏にどうぞ。

286:デフォルトの名無しさん
09/06/30 01:27:46 .net
fold とか?

287:デフォルトの名無しさん
09/07/13 09:52:52 .net
正規表現で空白で区切られたテキストをHTMLでいうtableにしたいです。
例)

10進 2進 8進
000 000 000
001 001 001
002 010 002
003 011 003

↓↓↓↓↓↓↓

<table>
<tr><th>10進</th> <th>2進</th> <th>8進</th></tr>
<tr><td>000</td> <td>000</td> <td>000</td></tr>
<tr><td>001</td> <td>001</td> <td>001</td></tr>
<tr><td>002</td> <td>010</td> <td>002</td></tr>
<tr><td>003</td> <td>011</td> <td>003</td></tr>
</table>

288:デフォルトの名無しさん
09/07/13 12:07:49 .net
>>287
正規表現を使うほどのことではない
コアの部分だけ書くとこれだけ
for(i=1;i<=NF;i++) printf("<td>%s</td>", $i)

289:デフォルトの名無しさん
09/07/13 16:12:21 .net
正規表現使ってタグを切り替えたいのかな?

290:hogehoge
09/07/17 16:37:34 .net
split や asort したらどうして添字が1からになるんだ!
なんでだ!
仕様書読み飛ばしててデータ欠落させるところだった(´・ω・`)

>>287
sed でええやん

291:デフォルトの名無しさん
09/07/17 18:35:54 .net
今までawk '{print $3}'程度しか使って無かったが、最近これを読んでawkを見直した。

URLリンク(www.eecs.harvard.edu)

292:デフォルトの名無しさん
09/07/26 15:10:31 .net
URLリンク(www.kt.rim.or.jp)
ここのgawkで>>17のサンプルを試したが動かなかった。

gawk: test.awk:4: 致命的: 入出力用の双方向ソケット `/inet/tcp/0/www.yahoo.com/80' が開けません (No such file or directory)。

293:hogehoge
09/07/27 11:13:15 .net
それはそこのサイトの人に言えよ

294:デフォルトの名無しさん
09/07/28 00:11:42 .net
いつのまにかgawk 3.1.7が出てた。

295:デフォルトの名無しさん
09/07/30 11:45:58 .net
Ruby 勉強中だけど AWK のほうが楽しいぜ(´・ω・`)

296:デフォルトの名無しさん
09/08/06 10:22:37 .net
7月7日→[[7月7日|07月07日]]
7月28日→[[7月28日|07月28日]]
11月3日→[[11月3日|11月3日]]
12月16日→[[12月16日|12月16日]]

と置き換えたいです。
perlならわりと簡単なのですが、awkで簡単にいきますか?
自分がawkのことを勉強不足だからかもしれませんけど…。

297:デフォルトの名無しさん
09/08/06 10:24:13 .net
↑間違いました。
7月7日→[[7月7日|07月07日]]
7月28日→[[7月28日|07月28日]]
11月3日→[[11月3日|11月03日]]
12月16日→[[12月16日|12月16日]]

298:デフォルトの名無しさん
09/08/06 11:03:17 .net
例がよくわからないんだけど,数字1桁の部分を2桁にしたいってこと?

299:デフォルトの名無しさん
09/08/06 11:13:12 .net
{
gsub(/月|日/," ");
printf("%02d月%02d日\n",$1,$2);
}
とか.
フィールドセパレータがデフォルト(半角スペース)の場合ね.

300:デフォルトの名無しさん
09/08/06 11:15:10 .net
>296
Perlで簡単に書けるなら、一旦Perlコード晒してくれるか?
どうも仕様がよく解らんのだ…

301:デフォルトの名無しさん
09/08/06 11:54:28 .net
print gensub(/0([0-9])([0-9])/, "\\1\\2", "g", gensub(/([0-9]+)/, "0\\1", "g",
$1))

我ながら汚ねぇなぁ(´・ω・`)
>>299の方がいいな

302:デフォルトの名無しさん
09/08/06 12:27:22 .net
>>298,300 置換しないで変えたいとこだけ出力するならこういう意味です。
#!/usr/bin/perl
while(1){
$line = <STDIN>;
if($line =~ /(0?[1-9]|1[0-2])月(0?[1-9]|[1-2][0-9]|3[01])日/){
$month = $1; $day = $2;
if($month >= 10) {
if($day >=10){
print "$& -> [[$month月$day日]]";
}
else {
print "$& -> [[$month月$day日|$month月0$day]]";
}
}
else{
if($day >=10){
print "$& -> [[$month月$day日|0$month月$day]]";
}
else{
print "$& -> [[$month月$day日|0$month月0$day]]";
}
}
}
}
1月1日 - ユーロ導入10周年。
1月1日 -> [[1月1日|01月01]]
12月31日 - ニューヨークのマンハッタン橋開通100周年。
12月31日 -> [[12月31日]]
8月21日 - ハワイ州州制50周年。
8月21日 -> [[8月21日|08月21]]
10月1日 - パラオ独立15周年。
10月1日 -> [[10月1日|10月01]]

303:デフォルトの名無しさん
09/08/06 14:16:23 .net
なんか素直にPerlでやったほうが楽そうだなあ、それ。
ちなみに、そのコードじゃ無限ループするぞ。
#!/usr/bin/perl
while($line = <STDIN>) {
    if($line =~ /(0?[1-9]|1[0-2])月(0?[1-9]|[1-2][0-9]|3[01])日/) {
        $month = $1; $day = $2;
        if($month < 10 || $day < 10) {
            printf "%s -> [[%d月%d日|%02d月%02d]]\n", $&, $month, $day, $month, $day;
        }
        else {
            print "$& -> [[$month月$day日]]\n";
        }
    }
}

304:デフォルトの名無しさん
09/08/06 14:44:03 .net
だめだ…コードの意味は分かるが,仕様が良く分からん.

305:デフォルトの名無しさん
09/08/06 14:47:14 .net
7月7日
という文字列を
[[7月7日|07月07日]]
と置き換える、ってことでしょ。
なんで分からんかなぁ。そっちのが分からん。

306:デフォルトの名無しさん
09/08/06 14:53:30 .net
入力が07月07日だったら,
出力は[[07月07日|07月07日]]になるよね?これはOK?
そもそも,そういう入力は起こりえないの?

307:デフォルトの名無しさん
09/08/06 18:17:38 ?2BP(0).net
>>305
そんな感じです。
目的を言っていないので、何がやりたいのかよくわからないのだと思います。
早い話、Wikiの記法を使ってリンクを張りたいのです。
0をくわえて桁を調整している理由は
文字列としてソートして正しく昇順に並ぶようにするためです。例えばWikipediaなら
7月7日のときは、[[7月7日|07月07日]]とすることで
リンクはURLリンク(ja.wikipedia.org)月7日
表示される文字列は 07月07日 
となります。
これをソートできるテーブルの要素にします。参考までに
URLリンク(ja.wikipedia.org)
この処理はawkでも可能なことは可能だったんですが、無知なせいか
おそろしく不格好になりました。

>>306
それ思いました。できれば
07月07日->[[7月7日|07月07日]]
のように処理したいです。

308:デフォルトの名無しさん
09/08/06 18:26:07 .net
>>303
それです。そういう意味です。

309:デフォルトの名無しさん
09/08/06 21:17:06 .net
# gawk による match 関数の拡張を使っている.
# 一行に複数回現れた場合は無視.

BEGIN {
    F = "(0?[1-9]|1[0-2])月(0?[1-9]|[1-2][0-9]|3[01])日";
}

{
    if ($0 ~ F) {
        match($0, F, a);
        if (a[1]+0 < 10 || a[2]+0 < 10) {
            sub(a[0], sprintf("[[%d月%d日|%02d月%02d日]]", $0, a[2], a[1], a[2], a[1]));
        } else {
            sub(a[0], sprintf("[[%d月%d日]]", $0, a[2], a[1]));
        }
    }
    print $0;
}

310:309
09/08/06 21:21:15 .net
# 訂正.

BEGIN {
    F = "(0?[1-9]|1[0-2])月(0?[1-9]|[1-2][0-9]|3[01])日";
}

{
    if ($0 ~ F) {
        match($0, F, a);
        if (a[1]+0 < 10 || a[2]+0 < 10) {
            sub(a[0], sprintf("[[%d月%d日|%02d月%02d日]]", a[1], a[2], a[1], a[2]));
        } else {
            sub(a[0], sprintf("[[%d月%d日]]", a[1], a[2]));
        }
    }
    print $0;
}

311:デフォルトの名無しさん
09/08/06 23:59:03 .net
>>310 完璧です。今度からこれを使います有難うございました。

$ cat test.txt
1月1日 #m月d日
01月1日 #0m月d日
1月01日 #m月0d日
01月01日 #0m月0d日

2月10日 #m月dd日
02月10日 #0m月dd日

11月3日 #mm月d日
11月03日 #mm月0d日

12月16日 #mm月dd日

$ awk -f test.awk test.txt
[[1月1日|01月01日]] #m月d日
[[1月1日|01月01日]] #0m月d日
[[1月1日|01月01日]] #m月0d日
[[1月1日|01月01日]] #0m月0d日

[[2月10日|02月10日]] #m月dd日
[[2月10日|02月10日]] #0m月dd日

[[11月3日|11月03日]] #mm月d日
[[11月3日|11月03日]] #mm月0d日

[[12月16日]] #mm月dd日

312:デフォルトの名無しさん
09/08/07 06:34:47 .net
最初にそういうテストバターンを出そうね

313:デフォルトの名無しさん
09/08/07 11:45:35 .net
ここの住人がコーディング好きだからって甘えやがって(´・ω・`)

> perlならわりと簡単なのですが、awkで簡単にいきますか?
って言ってるんだから、「いきます」って答えりゃいいんだよな

314:デフォルトの名無しさん
09/08/07 11:46:39 .net
>>312
なにその死の行進こわい

315:デフォルトの名無しさん
09/08/15 11:36:30 .net
バターン テストのデスマーチ

316:デフォルトの名無しさん
09/08/16 09:46:09 .net
>>294
3.1.7ベースのWindows用バイナリ、出ました。
URLリンク(www.kt.rim.or.jp)

317:222.248.109.70
09/08/17 17:45:07 .net
自動焼人 ★ = 自動保守 ◆KAWORUKOFI = 自動保守#K9K?_D[L

名言集 その3
『いつもサボってばかりのキャップがウゼえ』

スレリンク(news4vip板) ID:PVAf+dux0 = 自動焼人 ★
> 71 :以下、名無しにかわりましてVIPがお送りします [sage] :2009/08/10(月) 00:58:57.28 ID:PVAf+dux0
> >>69
> 大変って言うか
> 毎日、報告されたのを見て、判断して、処理して、完了報告して、以下ループ。
> ちょっとでもミスすると、普段は作業もしてないキャップさんたちがさんざん文句言ってきて
> その言いわけを考えないと、キャップはく奪されたりアカウント凍結されたりするから
>
> 登録されてから一年以上経って、やっといいたいこと言えるようになってきたよ。



----------------------------------------------
この自動焼人 ★メールマガジンの配信停止をご希望される方は
スレリンク(sec2chd板)
にて自動焼人 ★までご連絡ください

318:デフォルトの名無しさん
09/10/24 17:23:04 .net
最後の10行を処理したくない場合、どう書けば良いでしょうか?

319:デフォルトの名無しさん
09/10/24 18:19:03 .net
最後まで読まずに最後の10行かどうか判定する方法は無いだろうな
処理対象がファイルなら、事前にwc -lか何かで行数調べて awk に渡してみては

320:デフォルトの名無しさん
09/10/24 18:52:07 .net
成る程、これ、という方法は無さそうですね
ちょっと考えながらやってみます

321:デフォルトの名無しさん
09/10/24 19:15:52 .net
とりあえず、こんな感じにしました
BEGIN {
SKIPTAILS = 10
}
{
line = buf[1]
for(i=1;i<SKIPTAILS;i++) buf[i] = buf[i+1]
buf[SKIPTAILS] = $0
}
NR > SKIPTAILS {
# lineを処理
}

322:デフォルトの名無しさん
09/10/24 22:11:41 .net
>>321 考え方は同じだけど、forが気になったので
リングバッファで処理するようにしてみた。

BEGIN {
  SKIPTAILS = 10
  ringpos = SKIPTAILS
}
{
  ringpos = (ringpos + 1) % SKIPTAILS
  line = buf[ringpos]
  buf[ringpos] = $0
}
NR > SKIPTAILS {
  # lineを処理
}


323:デフォルトの名無しさん
09/10/24 23:18:06 .net
ありがとうございます
リングバッファ、勉強になりました
使わせて頂きます


324:デフォルトの名無しさん
09/11/19 20:22:22 .net
>>42
sed awk して船山に登る だろ?


325:デフォルトの名無しさん
09/11/23 12:06:14 .net
質問です
gawkで
{
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
にするにはどうしたらよいでしょうか?

326:デフォルトの名無しさん
09/11/23 12:27:22 .net
FNR

327:デフォルトの名無しさん
09/11/23 12:35:21 .net
>>326
おお、出来た!
迅速な回答ありがとうございます

328:デフォルトの名無しさん
09/12/21 13:53:34 .net
年末にパソコンを買い換えようと思って機種選びをしていてふと気づいた、
あれ、vaioのOSがWindows7 64bitバージョンに・・・
ダメじゃん!gawkが使えなくなってしまう・・・
うーん、、、またXPを買うべきか・・・悩む・・・

329:デフォルトの名無しさん
09/12/21 14:21:01 .net
>>328
自分でコンパイルし直せばいいだけじゃないの?

330:デフォルトの名無しさん
10/01/14 03:52:20 .net
プログラミング言語AWK復刊だってね。
URLリンク(slashdot.jp)

多分必要性を感じない程度には使ってるから、買わないけど嬉しい。
布教用に買うってのもちょっとな。



331:デフォルトの名無しさん
10/02/28 11:08:56 .net
AAA BBB CCC … -O ZZZ YYY XXX …

awk新参です。
-O(オプション)を検索し、
-Oとそれ以降をリダイレクトしたいのですが…
良い方法、ありますでしょうか

332:デフォルトの名無しさん
10/02/28 15:36:31 .net
リダイレクトってどういう意味で使ってる?

その AAA で始まる文字列も一体どういうものなの。
コマンドライン引数なのか、ファイルから読み込んでくるのとか。

用語と状況はきちんと書いてくれ。


333:デフォルトの名無しさん
10/02/28 16:19:07 .net
D:\My Documents\gawk\331>type 331.txt
AAA 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>

334:331
10/02/28 18:43:32 .net
レスありがとうございます。

>>332すみません。書き直します。
AAA BBB CCC … -O ZZZ YYY XXX …
と書複数行書かれたファイルがあり、
「-O」以降の文字列を別ファイルに保存する
ってことをしたかったのです。

>>333
エスパーな文だったのにありがとうございます。
想定してたのはそんな感じです。
ただ以下のエラーが出て上手くいきません…

gawk: 331.awk:2: fatal: match() cannot have 3 arguments

match使ってるのにaという3つ目の引数を使ってるから…ってことでしょうか…?


335:デフォルトの名無しさん
10/02/28 19:00:04 .net
Q: make spits out errors like Makefile.awk:256: fatal: match() cannot have 3 arguments

A: 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.

336:335
10/02/28 19:22:38 .net
{print substr($0, match($0, " -O .*")+1);}

337:331
10/02/28 20:03:12 .net
>>336
出来ました。まさか本日中に解決できるとは思いませんでした。
ありがとうございます。大変勉強になりました。

338:デフォルトの名無しさん
10/02/28 22:25:50 .net
ボソ 本当に勉強になったかどうかは疑問だ・・・
 おっと一言オウかったか。

339:デフォルトの名無しさん
10/03/04 15:04:38 .net
gsub()とかで引数に変数を利用したいのですがどうすればいいのでしょうか?
gsub(str1,str2)みたいに。

340:デフォルトの名無しさん
10/03/04 21:44:52 .net
>>339
man 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().)


341:デフォルトの名無しさん
10/03/08 21:36:03 .net
awk 'BEGIN{x="ABCDE";y="BCD";z="XXX";gsub(y,z,x);print x}'

何が難しいのかよくわからん。

342:デフォルトの名無しさん
10/03/17 22:07:37 .net
時々awkだと遅いのでperlに書き換えるという人がいますが、
実際のところ速くなるんでしょうか?
私の環境では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


343:デフォルトの名無しさん
10/03/17 22:26:14 .net
>>342
「awkだと遅いのでperlに書き換えるという人」 に聞けば分かる

344:デフォルトの名無しさん
10/03/19 09:08:06 .net
>>342
遅いというawkはgawkなの?
素のawkよりgawkの方が早くなかったっけ?


345:デフォルトの名無しさん
10/03/20 01:03:01 .net
カーニハンとパイクの『プログラミング作法』にawkとperl
(とCとC++とJAVA)の比較があるな

今のマシン使って書き換えなきゃならないほど遅いって
どんな処理なんだろう?

346:デフォルトの名無しさん
10/03/21 13:44:10 .net
>342
awk 等を組み合わせて実行するとプロセス起動のコストがかかるので perl で一つに纏める、という話じゃないの?

347:デフォルトの名無しさん
10/03/22 17:35:11 .net
文字コードのコードを変数にして文字列を操作することってできますか?
文字列中の全角文字を半角文字に変える華麗な方法を模索しています。

348:デフォルトの名無しさん
10/03/22 18:01:58 .net
Use iconv.

349:デフォルトの名無しさん
10/03/22 18:25:10 .net
> 文字コードのコードを変数にして文字列を操作することってできますか?

なにをしたいのかよくわかんないんだけど。

> 文字列中の全角文字を半角文字に変える華麗な方法を模索しています。

華麗なのはtrコマンドを使う方法。ただtrがマルチバイトをうまく扱ってくれるか
どうかはこころもとない。
Perlならtrを、Rubyなら文字列クラスのtrメソッドを、
Pythonならstringモジュールのmaketrans関数と文字列のメソッドtransleteを使う、
という手がある。
awkないし(tr以外の)古典的なツールで華麗にやる方法はないと思う。

350:デフォルトの名無しさん
10/03/24 17:11:16 .net
Excelで
全角半角変換は ASC()
半角全角変換は JIS()


351:デフォルトの名無しさん
10/03/25 08:34:11 .net
>>347
1. EUC-JPにして(nkfとか)kakasi で、戻す
2. それだったら最初から、nkf -Z
3. gawk前提で、文字毎に処理(LANGを指定して子プロセス起動)

awkの中で閉じてやるのはめんどくさそう

352:デフォルトの名無しさん
10/03/29 23:34:27 .net
gawk 3.1.6
system(cmd) を使うと、アンチウィルスソフト(kaspersky)の
アプリケーション履歴にバッチファイルが登録されるのを発見。
close(cmd) しても同じ。

while(cmd|getline>0){}
で代用すると残らなくなった。??

353:デフォルトの名無しさん
10/05/13 00:22:57 .net
仏でブルカ否定の決議採択 「国の価値観と相容れない」
URLリンク(www.cnn.co.jp)

テヘランで、ブルカを着て入出国する時って、顔のチェックどうするんだろう。
他人や男でもばれないの?

354:デフォルトの名無しさん
10/05/13 00:23:49 .net
>>353
誤爆スマン

355:デフォルトの名無しさん
10/05/14 13:38:24 .net
スレリンク(linux板:65番)

356:デフォルトの名無しさん
10/05/18 10:51:40 .net
awkのprintについてご教示下さい。

下のような出力が有った場合、例えば
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」だけを抜きたい場合記述が大変になります。

何か良い方法は無いものでしょうか?

357:デフォルトの名無しさん
10/05/18 11:01:32 .net
$nに代入があると、その時点で$0が再構成される。

区切りの空白が$5のあったところだけ2個になるのが気にならなければ、
ls -al | awk '{$5 = ""; print}'
とすればよい。

空白2個を修正するならこうする。
ls -al | awk '{$5 = ""; print $0}' | awk '{$1 = $1; print}'

358:デフォルトの名無しさん
10/05/18 11:03:15 .net
$0 は余計だった。
ls -al | awk '{$5 = ""; print}' | awk '{$1 = $1; print}'

359:デフォルトの名無しさん
10/05/18 11:07:03 .net
2つめのawkの$1 = $1は何のため?

360:デフォルトの名無しさん
10/05/18 11:34:06 .net
なにもしないと、$0は読み込んだそのままなので空白2個は空白2個のまま。
$1=$1で代入してやると、$1, $2, ...を空白1個でつないだものが$0に代入されるので、
空白2個だったところが空白1個になる。

361:デフォルトの名無しさん
10/05/18 11:35:04 .net
2つめのawkに食わせた時点で$n (n>0)は詰まるけど$0は入力行そのまま
空白2個なので$0を再構成すると空白1個区切りになる

362:デフォルトの名無しさん
10/05/18 12:21:12 .net
>>357-358
非常に解りやすいご説明、ありがとうございます。
なるほど代入することで解決するんですね。
勉強になりました。

363:デフォルトの名無しさん
10/05/18 15:08:38 .net
$1 = $1 ってイマイチよく解らん

$1ってFSで区切られた一つ目だよね?
なんでそれ自身を自分に代入したらスペースが消えるん?

364:デフォルトの名無しさん
10/05/18 15:27:35 .net
$0の再構成が行われるからって説明されてるだろ。

$0の再構成とはいったんばらした$1,$2,...をOFSを挟んで
つなげ直すってことなので、何で区切られていたかは
保存されない。

365:デフォルトの名無しさん
10/05/18 15:41:56 .net
>>364
>$1=$1で代入してやると、$1, $2, ...を空白1個でつないだものが$0に代入される

って約束事を覚えておけってことかい?

366:デフォルトの名無しさん
10/05/18 15:42:39 .net
ちょっと気になって試してみた。

% echo a b | gawk '{OFS="-";$1=$1;OFS="=";print}'
a=b

再構成は$1=$1をやってすぐじゃなくて、次に$0が使われるとき、ってこと
なのかな?

367:365
10/05/18 16:27:59 .net
解った

URLリンク(www.kt.rim.or.jp)

警告: 一部のバージョンのawkは NFを減じたときに$0の再構築を行わない。
結局のところ、awkにレコード全体の再構築を強制したときにはその時点で
フィールドの値とOFSが使われる。再構築を行うためには、何らかの無害な
代入を行う:

$1 = $1 # force record to be reconstituted


賢くなった。あんがと。

368:デフォルトの名無しさん
10/05/18 16:46:58 .net
awkは奧が深いのぉ

369:デフォルトの名無しさん
10/05/19 22:24:52 .net
久しぶりにいいもんを見させてもらいますた><


370:デフォルトの名無しさん
10/05/24 09:55:14 .net
知らなかった。
勉強になった。

371:デフォルトの名無しさん
10/05/24 15:25:46 .net
みんな>357のお蔭で多くを学んだな。

372:デフォルトの名無しさん
10/05/29 04:53:07 .net
名前:
E-mail:
内容:
cygwinだと
% cut -f1 -d, hoge.csv
より
% awk -F, '{print $1}' hoge.csv
の方が速かった。
#実行時間ね
#Perl?シラネ


373:デフォルトの名無しさん
10/06/07 11:45:38 .net
>>372
sed -e 's/,.*//'でもawkと同じくらいだから、cutの実装が遅いんだね。
cutが無駄にオプション多い所為じゃない?

374:デフォルトの名無しさん
10/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

375:デフォルトの名無しさん
10/06/07 12:22:48 .net
あーなるほど、なんか判った。cygwinのfgetc()が遅いからじゃないかな。
fgetc()とfgets()で時間を較べたときにfgetc()の方がずっと遅かった記憶がある。

376:デフォルトの名無しさん
10/09/13 14:14:54 .net
xgawk (gawkでなく)にとあるwebページを食べさせると、XMLERRR (not well-formed)で中断します。
そのページがwell-formedか極悪かは私にとってどうでもよく、単に内容を得たいだけなので、文末まで処理し終えて欲しいのです。
どうにかならないでしょうか。

377:デフォルトの名無しさん
10/09/25 14:55:22 .net
シェルスクリプト内でパイプ入力されたものを処理する
アクションをヒアドキュメントで書く事は出来るでしょうか。


378:デフォルトの名無しさん
10/09/27 14:57:18 .net
質問です。
データが
|1|aaa|
|2|bbb|
|3|ccc|
などとなっているとき
aaa
bbb
ccc
を取り出そうとして
awk 'FS="|"{print $3}' ファイル名
としたんですが、1行目だけがうまくとれません。
データファイルの1行目を空行にすれば解決できないことはないんですが、
空行を入れ忘れてしまう懸念があります。
どうすればいいんでしょうか?

379:デフォルトの名無しさん
10/09/27 15:01:46 .net
やりたいことは awk 'BEGIN {FS="|"} {print $3}' じゃないかと思うんだけど

380:デフォルトの名無しさん
10/09/27 15:08:38 .net
378です。
>>379
どうもありがとうございました。

381:デフォルトの名無しさん
10/09/27 18:42:12 .net
gensub()にて、マッチした10番目以降のグループの指定の仕方を教えてください。
下記サイトでは、17番目まで普通に指定できるような事が書いてあるけど、
URLリンク(tounderlinedk.blogspot.com)

gensub(pattern,"\\10","g",$2) とかくと
\\1(マッチ箇所)と0(文字)として解釈されちゃって上手くいなかい。

シェルスクリプト風かと思って、\\{10} も試したけどダメダッター。

GNU Awk 3.1.5です。


382:381
10/09/27 19:00:47 .net
BSDのjmanには、1から9までの数字って明記されてるなあ。
実装によって違うのかなあ
パターンを動的に生成してマッチさせようとしてるから結構困る(´・ω・`)
URLリンク(www.linux.or.jp)


383:デフォルトの名無しさん
10/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';

なんてやってる。

384:デフォルトの名無しさん
10/09/27 19:08:03 .net
一旦ぶった切るしかないんじゃね

385:381
10/09/27 19:12:31 .net
>>383
どうもありがとうございます。

>>384
ちょっと見栄え悪くなるけどそうする(´・ω・`)

386:デフォルトの名無しさん
10/09/27 21:27:29 .net
>>381
なんでそこのひとは16までできたんだ?

387:デフォルトの名無しさん
10/09/28 00:32:52 .net
10の代わりに:を使っていたりして。

388:デフォルトの名無しさん
10/09/28 03:15:24 .net
このスレが盛況なのが珍しいから
記念パピコ。

389:デフォルトの名無しさん
10/09/28 03:41:50 .net
15年以上前だけどawkの勉強始めて同時にperlの勉強もしてたら
気付いたらperlばっかりやっててawkすっかり忘れてしまったなぁ
今はperl捨てて専らpythonやってるけどawkもいいよね

390:デフォルトの名無しさん
10/09/28 09:40:13 .net
Busyboxに組み込めば、それこそ炊飯器や冷蔵庫でも動くからなあ。
手軽であるにも関わらず、結構高度な処理もガリガリ書けるから好き。

Cとシェルスクリプトが好きだから、文法的にもしっくり来る。
上位互換のPerlも大好き。

391:デフォルトの名無しさん
10/09/28 14:37:59 .net
>>376ですが、誰もかまってくれないので寂しさで死にそうです。

392:デフォルトの名無しさん
10/09/28 14:52:08 .net
>>391
どれでも好きなのを選べ

1. xgawkを改造
2. エラーになるXMLを事前に修正してwell-formedにしてから食わせる
3. xgawkは捨てて別の言語、ライブラリを試す

393:デフォルトの名無しさん
10/09/28 17:23:08 .net
jawkがjwalkに見えてしまう

394:デフォルトの名無しさん
10/10/01 11:21:26 .net
動く環境の多さ順にインタプリタを選ぶんなら、

シェルスクリプト > awk >>> perl >>>>> python >>>>> ruby >>> haskel etc.

となるだろうな。

シェルスクリプトはシェル依存な部分が多く、perl ほど高機能なものも要らない。
そんな時、小さな端末でもスマートに動いてくれる awk にちんこ勃つ。

>>389
言語に捨てるも拾うもないよ。その時々に都合の良いものを組み合わせて使うのがUNIX的な発想。

395:デフォルトの名無しさん
10/10/01 15:33:40 .net
>>394
「一発やろう」ですね!

396:デフォルトの名無しさん
10/10/09 04:40:48 .net
awk最近勉強してる。perlより全然簡単。
これなら俺でも挫折しなくてすみそう

397:デフォルトの名無しさん
10/10/09 04:57:14 .net
>>396 がんば!

398:デフォルトの名無しさん
10/10/21 20:16:46 .net
sjisで書いた
/ー/{print}
を実行すると

awk:
awk: ^ 正規表現が終端されていません。
awk: 致命的: [ または [^ が対応しません。: /[/{print}/

のエラーになってしまいます。
ーの2バイト目が[なせいだと思いますが、どう対応したらいいでしょうか?
入力ファイルはsjisで書かれていて、文字コード変換はできません。


399:デフォルトの名無しさん
10/10/21 20:55:41 .net
>>398
環境の問題なんだから、実行環境くらいまともに書けよ。

400:デフォルトの名無しさん
10/10/21 21:38:24 .net
>>398
gawk を使う

401:デフォルトの名無しさん
10/10/21 22:52:57 .net
環境はCentOS-5.5-x86_64でGNU Awk 3.1.5です。
/bin/awkはシンボリックリンクで、実体はgawkでした。

402:デフォルトの名無しさん
10/10/21 23:49:35 .net
>>401
--help 嫁

403:デフォルトの名無しさん
10/10/22 01:41:07 .net
Windows7(64bit)で使えるawkありますか?


404:デフォルトの名無しさん
10/10/22 02:19:30 .net
32bit版のawkをを使うんじゃダメ?

405:398
10/10/22 07:32:34 .net
こうすることで対応できました。
/\x81\[/{print}

406:デフォルトの名無しさん
10/10/22 09:41:36 .net
それでいいなら、/ー[]/でもいい希ガス。
根本的な解決になってないけどねぇ。

407:デフォルトの名無しさん
10/10/22 13:52:10 .net
シングルクオーテーションやダブルクオーテーションの使い分けじゃね~

408:398
10/10/22 19:55:53 .net
根本的な解決するとしたら文字コードを変えることでしょうか?


409:デフォルトの名無しさん
10/10/22 20:03:18 .net
日本語の文字コードに対応してるawkを使う、という方法もある。
今あるのかどうか知らないけど。

410:デフォルトの名無しさん
10/10/22 20:28:38 .net
今のgawkは普通にUnicode対応してるみたい

$ echo 'てすと' | gawk '/[ぁ-ん]/ { print length($0) }'
3

UTF-8ロケールでしか試してないけど
cygwinでも大丈夫

411:デフォルトの名無しさん
10/10/23 01:29:00 .net
>>404
gawkでいいかな

412:399
10/10/23 06:55:10 .net
>>405

問題は解決したのかもしらんが、一応。
以下2つのWin用バイナリは問題ないので、ソースもらってLinux上でコンパイルしてみたら?

URLリンク(gnuwin32.sourceforge.net)
URLリンク(www.kt.rim.or.jp)


413:398
10/10/23 10:53:14 .net
サーバ管理者じゃないのでサーバをいじることはできないです。
これにしたらsjisでも動くようになるのでしょうか?

414:デフォルトの名無しさん
10/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とかにすればいいのかと思ったが、ロケール変更自体がうまくいかなかったわ。
困ってる事があるなら、最終的に何がしたいか言ったほうがいいよ。

415:398
10/10/23 12:40:31 .net
Windows2003だとちゃんと動くんですね。
困っていたことは405で解決したので大丈夫です。
今は「根本的な解決」に興味があったのでお聞きした次第です。

416:初心者
10/11/04 22:14:10 .net
awkでシェルのPATH変数をマッチさせるときにスラッシュ//を使わない方法を教えていただけませんか?

417:デフォルトの名無しさん
10/11/04 23:14:10 .net
>>416
初心者だからマルチが許されるとでも思ったか?

418:初心者
10/11/05 06:32:09 .net
ごめんなさい!
知りませんでした。

419:デフォルトの名無しさん
10/12/15 01:54:35 .net
配列の要素数を調べるなら、ループ処理しないと分からない?
length みたいなのは無い?

420:デフォルトの名無しさん
10/12/15 02:27:50 .net
あるよ。まさしく、length(array)。

421:デフォルトの名無しさん
10/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.

422:デフォルトの名無しさん
10/12/15 04:20:37 .net
むしろ配列が存在するってことはその配列を作成する過程があるだろ?
作成するときに数えればいいんじゃね?

423:デフォルトの名無しさん
10/12/15 08:40:15 .net
連想配列だったら数えないのが普通だがな

424:419
10/12/25 03:12:23 .net
function で処理する時、配列だけではダメで要素数まで必要なんだかなぁ、
って事が分かりますた

425:デフォルトの名無しさん
10/12/28 11:29:35 .net
function に渡すだけなら要素数なんていらないんじゃない?


426:デフォルトの名無しさん
10/12/28 13:55:13 .net
$1 = $1みたいなトリックを見る度に奥が深いと言うよりは糞に見えてきます
翻すとUNIX文化そのものが
まあ、あくまでおれの主観ですがね

427:デフォルトの名無しさん
10/12/28 15:24:21 .net
>>426
awk大好きなオイラに喧嘩売るのかw
ウニックス文化最高!(NT系はUNIXのパクリ)

428:デフォルトの名無しさん
10/12/28 15:28:13 .net
>>427
全角英字使う奴が awk 大好きだとは到底思えん

429:デフォルトの名無しさん
11/01/05 23:22:55 .net
まあ冬休み期間だものね。

430:デフォルトの名無しさん
11/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" という代入を本編(?)でも有効にする為
にはどうすればいいでしょうか?

431:デフォルトの名無しさん
11/01/06 00:31:45 .net
なにもしなくても有効だと思うんだけど
質問の趣旨がわからん

432:430
11/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 '・' は不正です。

433:デフォルトの名無しさん
11/01/06 08:57:49 .net
入力レコードが1件も無いからでしょ

>gawk: tes09.awk:2: ^ 表現の char '・' は不正です。
これは全角スペース

434:デフォルトの名無しさん
11/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
}
としてやれば明らか


435:デフォルトの名無しさん
11/01/06 13:46:53 .net
質問の趣旨は、プログラム(スクリプト)の中で入力ファイル等の
コマンドライン引数を追加したいという事ですか。

コマンドライン引数の配列は ARGV ですが、コマンドライン引数の
個数を格納する ARGC という組み込み変数があります。

ARGV配列を追加したら一緒に ARGC を修正してあげないと、awkは配列が
追加された事を認識しません。

BEGIN内でARGV配列を追加した分だけARGCをインクルメントしてあげれば
追加されたARGV配列で指定されたファイルも本文の処理に渡されます。

蛇足としては、
現在処理中のファイル名が格納されている配列 ARGV のインデックスを
示す組み込み変数は ARGIND です。

私のは Win版の gawkm115 です。スクリプト内でARGV/ARGCを操作しても
期待通り正常に動きますよ。

試してみてね。


436:430
11/01/06 23:56:01 .net
皆様レスありがとうございます。

>>433
>これは全角スペース

お恥ずかしい限りです(汗) 出勤前に思いつきで試したもので、スレ用に書いた
物をそのままコピってました・・・

>>434
BEGIN句のgetlineではARGV[1]への代入ができているのに、本文では有効に
ならないという事を伝えたかったのです。

437:430
11/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 で特定パターンのファイル名の
物のみ処理をするとかできそうですね。

438:デフォルトの名無しさん
11/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せずに実行することは可能でしょうか?


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch