08/09/16 15:07:48
うげ、一旦ファイルを作るのはありなのかよ。
ifを使うのは冗長なのに、ファイルを作るのは冗長じゃないってどんなセンスなんだ。
201:デフォルトの名無しさん
08/09/16 17:48:16
>200
入力データは規則性のあるもので、生成してしまえるけど
それに対しての分岐は多い…という場合
ifやsplitを羅列するよりも、awkが元々持ってる
パターンとフィールド分割を使った方が
スッキリすると思うのですが間違ってるでしょうか…。
202:デフォルトの名無しさん
08/09/16 19:39:26
>>201
別にいいんじゃね?
巨大な中間ファイルを作るってわけでもないんだろうし。
まぁ、次の理由で私は中間ファイルを作るのは避けるけどね。
・フルパスを指定しない場合、カレントディレクトリに書き込み権限がある保障がない。
・そもそも同名ファイルが存在していて書き込み権限がないかも知れない。
・つーか、同時に2件動かしたらバッティングしてしまう。
・だからと言って、一々ユニークな名前のファイル名を生成するのも面倒だ。
・しかも、中間ファイルは後で消しておく必要があるかもしれない。
それと、自前で入力を生成するなら、最初から分割された状態で作ればいいからsplitは要らないね。
パターンを使うかifを使うかは趣味の問題のような気がするけど。
# $1+$2+$3<10{print;}と書くかif($1+$2+$3<10){print;}と書くかの違いだもんね。
203:デフォルトの名無しさん
08/09/18 01:19:00
色々考え方があるのね。
自分ならトリッキーな細工して1つに収めず分割してif使わずに書くけど。
手早くカタをつけられるのがawkの良い所だと思うし、
技巧に走ると間違いなく忘れるのでメンテ不可能になる可能性大
ま、それはそれとして>>198はパズル的な面白さがあって良いね。
204:デフォルトの名無しさん
08/09/19 19:54:42
>202
う~ん、言われてみればそうかも。
一応、今回のは仕事で使うわけでもなければ他人に使ってもらう予定もない
完全な個人用スクリプトなのでどうにでもなりますが
これが業務や自分以外も使うものであれば素直にifなんでしょうね。
205:デフォルトの名無しさん
08/09/22 20:50:40
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
BEGIN{date=strftime("%m/%d")} $0 ~ date {print $0}
207:デフォルトの名無しさん
08/09/22 21:45:34
>>206
thanks!
208:デフォルトの名無しさん
08/10/10 19:41:51
質問です。
入力中のファイル名はFILENAMEにセットされますが、
入力中のファイルのパスを取得するにはどうしたらよいですか。
209:デフォルトの名無しさん
08/10/10 22:13:43
>>208
FILENAMEで得られる情報が全て。フルパスが欲しいということなら、
cwdを取得してそこからの相対パスがFILENAME。
210:デフォルトの名無しさん
08/11/12 19:19:08
awkの結果を set か setenv の変数に代入したいです。
awk '{ print $1+ $3 }' test.txt
で数値が出ます。
この結果を変数に代入するにはどうしたらいいんでしょうか?
set tmp=`awk '{ $1+ $3 }' test.txt`
これだと上手くいきません。print はそのままでいいのでしょうか?
211:デフォルトの名無しさん
08/11/12 20:24:22
なんで print を省略できると考えたのかが謎だが
212:デフォルトの名無しさん
08/11/12 23:57:16
>print はそのままでいいのでしょうか?
まず試せよw
213:デフォルトの名無しさん
08/11/13 14:17:14
新紀元社のプログラミング言語awkがどこも売り切れなんだけど
もう入らないのかな
214:デフォルトの名無しさん
08/11/16 03:02:56
>>211
printは画面表示するもの→変数に入れるだけなら不要
…と思ったんじゃ内科ね
215:デフォルトの名無しさん
08/11/18 11:28:33
カンマ区切りのデータファイルがあり、その中で、第1フィールドと第3フィールド内にもし
子音、子音、子音、母音が存在すればその行だけ抜き出すオークのスクリプトファイルをつくりたいのですがどうすればよいですか
216:デフォルトの名無しさん
08/11/18 11:41:15
>>215
データファイルのサンプルと抜き出したい行ヨロ
217:デフォルトの名無しさん
08/11/18 11:50:40
こんな感じです
takeshi,fiad,fdjioaf,fdjsoafds(←該当なし)
dddacea,fsaofsa,rrra,fjisaofdjsa(dddaとrrraが該当)
aexxxu,dsoifsa,yyyuo,fjsaofa(xxxuとyyyuが該当)
218:びぎなぁ
08/11/18 12:12:55
オークスクリプトを実行すると情報を表示するようにしたのですが1行目と最後の行だけを表示しないようにするには
END内に何て書けば宜しいでしょうか
219:デフォルトの名無しさん
08/11/18 12:43:59
>>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
>>218
逐次出力してる?
END でまとめて出力してる?
221:デフォルトの名無しさん
08/11/18 13:53:22
>>218
1行ずつバッファリングして、次の行の入力で前の行を出力すれば最後の行は消えてなくなる。
awk 'NR > 2 {print buffer;} NR > 1 {buffer = $0;}'
222:デフォルトの名無しさん
08/11/18 14:20:29
>>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
>>219
助かりました!
224:びぎなぁ
08/11/18 16:46:03
出来ました ありがとうございます
225:デフォルトの名無しさん
08/11/19 23:48:41
込み入ってて整理できないので教えてください。
・対象のテキストは2行目がない(1行目しかない)かつ
・1行目はひらがなカタカナ漢字で15文字以内
という条件を書くのって、次のようにしたのですが、うまくヒットしません。
どう書けばいいでしょう?
NR==2 && length($0) == 0 && NR==1 && /[ぁ-んァ-ヶ亜-腕]{1,15}/
226:デフォルトの名無しさん
08/11/19 23:53:31
>>225
NR == 2 && NR == 1じゃ、絶対成立しないだろ。
227:デフォルトの名無しさん
08/11/19 23:54:54
awkは行を1行ずつ処理するから、事前にトータル行数を知ることはできない。
トータル行数が1行であることを保証したいなら、ENDブロックで処理するしかない。
228:デフォルトの名無しさん
08/11/20 00:22:37
>事前にトータル行数を知ることはできない
BEGIN部で数えれば?
229:デフォルトの名無しさん
08/11/20 00:28:19
>>228
どうやって? 対象がファイルである保証があるならwcでも呼べばいいけどそれならawkでやる必要さえないよね。
230:デフォルトの名無しさん
08/11/20 03:49:07
{ a = $0 }
END { if (NR == 1 && a ~ /re/) print a }
とか?
231:デフォルトの名無しさん
08/11/20 23:58:06
どなたか、任意ビット幅の2の補数HEXをDECに変換するプログラムを書いてもらえませぬか?
232:デフォルトの名無しさん
08/11/22 12:02:58
仕様が不明確なところがあるし、なによりなんでawkで?
233:デフォルトの名無しさん
08/11/26 22:53:51
>>232
ここがawkスレだからでしょ。
234:デフォルトの名無しさん
08/11/29 03:05:38
>>232
考えるな。感じろw
235:デフォルトの名無しさん
08/12/12 07:21:00
「あなたは何故awkでやろうとするのですか?」
「そこにawkがあるから」
236:デフォルトの名無しさん
08/12/13 04:23:45
awkからsystem()でgrepとかsedとか呼んだりする癖が付いている
シェルスクリプトにする方がむしろ違和感
237:デフォルトの名無しさん
08/12/13 23:56:31
おいおい、grepやsedぐらい呼び出さずにawkでやろうぜ。
238:デフォルトの名無しさん
08/12/16 00:29:26
grepやsedはパイプでつなげて使うものじゃないの?(^^;
239:デフォルトの名無しさん
09/01/10 22:10:41
gawk 3.1.4 mb のwindows版のEXEファイルが欲しい…
240:デフォルトの名無しさん
09/01/11 00:38:51
なんでそんな古いバージョンが欲しいの?
241:デフォルトの名無しさん
09/01/11 12:16:04
>なんでそんな古いバージョンが欲しいの?
lengthとかsubstrで、「j」付き文字列関数があるからです。
3.1.5以降だと、同じスクリプトファイル内で、バイト単位処理と
キャラクター単位処理の混在が難儀なのです。
242:240
09/01/11 15:01:36
3.1.5で文字の扱いが変わったのはその通りだけど、3.1.4のWindows版て
jlengthやらあったっけ?
なかったと思うんだけど。
243:デフォルトの名無しさん
09/01/11 15:48:22
>なかったと思うんだけど。
えっ。3.1.4以前のはバイト単位オンリーって事ですか?
…それでも2バイト換算で扱えばいいから、まだマシかも。
j付きが追加されていたけど、動作変更に伴って廃止された…
と思っていました。
記憶にあるのは、どなたかの独自拡張別Verだったのか…?
244:240
09/01/11 17:54:21
> えっ。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
>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
>>245
URLリンク(www.hinadori.atnifty.com)
にあるよ。3.0.6のやつ。
DOS版だけじゃなくてWin32版もある。
3.0.6→3.1.xで増えた機能でも使ってんの?
247:デフォルトの名無しさん
09/01/11 22:30:39
>あるよ。3.0.6のやつ。
おお。 ありがとうございます。
>3.0.6→3.1.xで増えた機能でも使ってんの?
いつ何が増えたのかよく把握していないんですが、
gensubとかmktimeとかswitch-caseとか…ありますかね。
まあ、代替手段はあるので試してみます。どうもです。
248:デフォルトの名無しさん
09/02/23 08:11:12
awkで、組み合わせの全てを作る、という事はできるのでしょうか?
いわゆるnCrの、個数ではなくて、中身を知りたいという事なのですが・・・。
(mawkを使っています)
249:デフォルトの名無しさん
09/02/24 18:18:34
>>248
できます
250:sage
09/03/04 15:23:19
248です。
なんとかできました。249さんどうもです。
251:デフォルトの名無しさん
09/03/04 15:24:16
sage間違えた…
252:デフォルトの名無しさん
09/03/23 11:47:59
int(0.5005*10000)が5004になるのはなぜですか。
253:デフォルトの名無しさん
09/03/23 12:41:00
丸め誤差でしょう。
切り捨て前に0.5足すとか工夫してみては如何でしょうか。
詳しくは、IEEEと丸め誤差辺りのキーワードで検索のこと。
254:デフォルトの名無しさん
09/03/23 19:57:34
>253
ありがとう