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せずに実行することは可能でしょうか?
439:デフォルトの名無しさん
11/01/09 22:54:33 .net
system関数で出来るんでは?winは分からないけど
440:デフォルトの名無しさん
11/01/09 23:06:13 .net
system("cd \"My Documents\" year "\" month "\" date day);
とかではだめでした。
441:デフォルトの名無しさん
11/01/10 03:54:21 .net
>440
なんか " と \ の数がおかしくね?
My Documents\2011\01\09(日)
↓
"My Documents\\2011\\01\\09(日)"
↓
"My Documents\\" year "\\" month "\\" date day
だよな?
442:デフォルトの名無しさん
11/01/10 11:42:11 .net
アドバイスありがとうございます。
はい。
\はおっしゃるとおりですが、依然としてだめです。
today.batをコマンドプロンプトから実行すると、
printしてそのtmp.batを実行する438のパターンだと、
ちゃんとcdできて、今日のフォルダに移動するのですが、
system("cd \\"My Documents\\" year "\\" month "\\" date day);
だと、移動せずに終了してしまいます。
なんでだろーな。
443:デフォルトの名無しさん
11/01/10 12:32:20 .net
cygwinを入れてやってみた
systemはshで動くっぽいので
rm /cygdrive/c/Documents\ and\ Settings/test.txt
みたいに書くとちゃんと消えるみたい
444:デフォルトの名無しさん
11/01/10 13:24:47 .net
>>438,442
438で書いてるgawkでやりたいことってのはバッチファイルでやってるのと同じこと?
だったら無理。
system() でcdしてもsystem()から返ってきたところで元に戻る。
445:デフォルトの名無しさん
11/01/11 01:15:49 .net
どうせ糞nixツールだから日本語や空白はダメなんだろ
446:デフォルトの名無しさん
11/01/11 09:05:01 .net
>>444
なるほど。gawk内部ではシステムを実行していても、gawkを出ると、それも終わっちゃうんですね。なるほど。
よくわかりました。ありがとうございます。
447:デフォルトの名無しさん
11/01/19 02:44:33 .net
とりあえずAWKで書いた巨大なスクリプトを、鯖で回し続けるのはやめてください。
非効率極まりない
448:デフォルトの名無しさん
11/01/19 15:27:12 .net
それはその人に言って下さい
449:デフォルトの名無しさん
11/01/19 21:03:10 .net
その場で使えるのがawkだけだったんです
450:デフォルトの名無しさん
11/01/19 23:56:54 .net
文字から文字コード取り出せないのが残念
逆はsprintf("%c", 0x41)とか出来るのにな
451:430
11/01/20 00:40:40 .net
>>447
効率のいいプログラムで書き直してやればいいじゃない。
452:デフォルトの名無しさん
11/01/20 09:05:02 .net
>>450
つord.awk
gawk付属のライブラリで、asciiの範囲の対応表作ってひくという
簡単な仕組み。
453:デフォルトの名無しさん
11/01/20 23:49:13 .net
#!/bin/gawk --re-interval -f
↑のファイルを実行するとオプションが不正と言われて実行できないのですが
コマンドラインのオプションで指定する以外にやり方はありますか?
454:デフォルトの名無しさん
11/01/21 05:12:58 .net
>>453
無理にawkスクリプトにせずに
#!/bin/sh
awk '
#awkコード
'
っていうシェルスクリプトにしたらどうかな
455:デフォルトの名無しさん
11/01/21 08:45:02 .net
#!でインタプリタに渡す引数の扱いは実装依存だからな。
linuxだと空白を含んだ全ての文字列が一つの引数として
渡されるので、複数のオプションは渡せない。不便だけど
そういうものなのであきらめてください。素直にシェルを
間に入れるのがいいと思うよ。
456:デフォルトの名無しさん
11/01/21 12:45:00 .net
gawk '$3!="*"' in.txt>out.txt
という処理で、20GBぐらいのin.txtを数百MBぐらいにスリムアップしてます。
問題は、その処理を10本ほど並行に作業させているんですが
topで見てみるとほとんどのgawkプロセスがsleepかstackedになっていて
あんまりもりもり働いてくれません。IOが律速なのでしょうか?
CPUもメモリも最大限積んでます。
457:デフォルトの名無しさん
11/01/21 12:50:02 .net
stacked -> stuckでした。すいません。
458:デフォルトの名無しさん
11/01/21 13:26:09 .net
'$3!="*"'
これって書き間違い?
459:デフォルトの名無しさん
11/01/21 13:47:33 .net
削られるデータの例
745_17_70_F3 4 * 0 0 * * 0 0 GGAGTGCCCCACACTTGGAGGCGAGCGCCCGGCAGACTTCCCCGCCGCC &+))8'1%+%-%%'((-)%%)8+,&+*7'+/%5''%%%%%-')-/'%/( XM:i:0
残るデータの例
745_377_43_F3 0 chr1 181855450 255 48M * 0 0 CATGTATGTGGCCAAAGGAACAACGCTATGTTTCCTAAAAGGCCTAGA G`[[`a`ab`^\ZYZ[SIR\Z[L7I_L>HU^bOKSDES[PO9-HNG7= XA:i:2 MD:Z:26C21 NM:i:1 CM:i:3
こういうのが80万行ぐらいあるようです。
460:デフォルトの名無しさん
11/01/21 13:52:48 .net
スクリプトの中身は実際は違うわけね
たぶん、データの格納場所がプログラム実行マシンと別のマシンの
ディスクなんじゃないかな。
ネットワークがビジー状態だと思う。
461:453
11/01/21 16:09:37 .net
>454-455
ありがとうございました。
挙動を変える組み込み変数も無いようですね。
462:デフォルトの名無しさん
11/01/21 16:47:10 .net
とりあえず df コマンドで作業ディレクトリと /var/tmp の空き領域が
確保されていることと、出力ファイルのサイズやタイムスタンプが徐々に
更新されていることを確認するくらいしかないんじゃないかな。
ローカルディスクでやればもっと早いと思うけど。
463:デフォルトの名無しさん
11/01/21 17:42:04 .net
>>460
なるほど。
xgridをつかって、2台のマシンで10本ずつほど並行してgawkを走らせておりました。
NFSをつかって5GBほどの(先ほどは20GBと書きましたが間違いです)in.txtの
のデータを読み込んで、処理後のデータをout.txtに書き出しているので、
ネットワークビジーになってしまうというわけですね。
ネットワークの問題とは。。。
一応、エラーでこけることなく、しゅくしゅくと処理は進むので気にしないことにします。
464:デフォルトの名無しさん
11/01/21 17:44:39 .net
2台のマシンで20本でした(10+11)。。。
一プロセスあたり5GBのファイルを読み込むので、ネットワークが悲鳴を上げていると。
465:デフォルトの名無しさん
11/01/24 21:31:50 .net
今年、gawkを大学で習って色々弄ってるんだけど、perlとかより自由度が低いと言われた。そんなに差があるの?
466:デフォルトの名無しさん
11/01/24 21:46:54 .net
>>465
簡易言語として捉えるかツールとして捉えるかの違いじゃね~
俺パールよりオークの方が好きだけど。
467:デフォルトの名無しさん
11/01/24 22:19:29 .net
>>466
なるほど。まぁ、そんなに複雑なことをこなすスキルを持ち合わせてないからもう暫くawkで遊んでみるか。
468:デフォルトの名無しさん
11/01/24 23:30:11 .net
自由度というよりは機能が少ないじゃないのか?
469:デフォルトの名無しさん
11/01/25 05:02:06 .net
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
470:デフォルトの名無しさん
11/01/25 11:23:33 .net
>>467
perlユーザはすべてをperlだけでやろうとする。C/C++/Javaも使うユーザはawkの方を好む。
C/C++/Javaに手を延ばすつもりならむしろawkのほうがいいよ。perlだと自己完結してしまうから。
471:デフォルトの名無しさん
11/01/25 16:02:25 .net
perlよりawkの方が速い事ってないじゃん。
今のawkの使い道はワンライナーをコマンドラインのパイプに混ぜる程度でしよ。
俺は、256倍本の長篇スクリプトをいくつか書いたけど、
当時はまだperlなんて使われてなかった。時代が違う。
472:デフォルトの名無しさん
11/01/25 18:11:52 .net
>>470
それは偏見だろ
autoconfなどの非常に基本的なツールでもPerlが使われているし
opensslのようにconfigureの(主にWindows用の)ポータビリティを上げるために
Perlを利用しているものもある
言語の適性をわかった上で適材適所で使えばいいんだよ
473:デフォルトの名無しさん
11/01/25 21:08:21 .net
日本国際賞
「米ベル研究所特別名誉技師のデニス・リッチー博士(69)と米グーグル社特別技師のケン・トンプソン博士(67)」
毎日jp - 毎日新聞のニュース・情報サイト
URLリンク(mainichi.jp)
474:デフォルトの名無しさん
11/01/25 21:29:34 .net
>>471
>時代が違う。
時代と言う意味では、最近はデフォで Python が入っていたりするので
Perl を使うなら Python を選んじゃうな。
あんまり速さを競う仕事をしていないのと、ワンライナーを書く事が
多いので、awk も絶賛大活躍しているけど。
Perl がフルセットの言語なら awk は DSL みたいな物で、個人的には
awk の方が気安く書ける気がする。
475:デフォルトの名無しさん
11/01/25 21:57:07 .net
pythonは、コマンドラインで使いにくい。
-cで引数に一応コマンド渡せるけど、インデントの問題があるし、
perlの-pや-nみたいに標準入力のループ渡せないから。
476:デフォルトの名無しさん
11/01/25 22:04:34 .net
質問させて下さい
次のようなテキストがあるとします
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:デフォルトの名無しさん
11/01/25 22:18:47 .net
で今考えている方法としては
substr($1,1,3) で姓を判定して
同じ姓なら、世帯を加算して行く
違う姓になったタイミングで1つ前の家の家計を print して
さらに各出費を初期化する
次の行に移って同じ世帯なら加算
という感じでスクリプトを組みたいんですが根本的なところでやり方が不味いでしょうか?
478:デフォルトの名無しさん
11/01/25 22:34:21 .net
連想配列とかじゃ駄目なのか?
name[$1] += 1
479:デフォルトの名無しさん
11/01/26 01:13:08 .net
>>476-477
全て連想配列に溜め込んで、 最後で一気に出力した方が良くないか?
>>477 の方法だと、 出力を行う箇所が
"姓が変わったとき" と "テキストが終わったとき" に分散してしまう。
{
a = substr($1,1,3);
b[a] += $2;
c[a] += $3;
d[a] += $4;
e[a] += $5;
}
END {
for (f in e) print f,b[f],c[f],d[f],e[f];
}
480:デフォルトの名無しさん
11/01/26 20:18:53 .net
>>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 がベスト。
481:474じゃないけど
11/01/26 21:22:28 .net
>>474と全く同じ意見だわ。
業務で使う事が多いRHELは余計な物はほとんど入れてない。
Python、Perlがデフォで入ってる感じ。
昔、UNIXを扱ってた頃はPerlならデフォで入ってたので、覚えようとしたけど結局身につかず。
sh、sed、awkでがんばってた。
482:デフォルトの名無しさん
11/01/27 00:10:46 .net
>>480
デフォで入っているのが嬉しいのは、自分の環境だけでなく、他人の環境でも
使える事が保証されている事だよ。誰かに使ってもらう為のコードを書く時に、
パッケージの追加をお願いしなくて良いのはとても楽。特に、それが仕事で
使われている環境なら尚更。
サポートやトレーニングの仕事をした事がある人なら理解してもらえると思う。
483:デフォルトの名無しさん
11/01/27 03:47:36 .net
AWKは、NEC PC-9801のMS-DOSでもうごいた。AWK95.exeは、日本語に対応してない
484:デフォルトの名無しさん
11/01/27 05:04:18 .net
AWKの活躍する場面は、やっぱりテキスト処理だと思う。
そのちょっと複雑版として使うならPerlかな。
組み込みライブラリがテキスト処理に特化してるから。
Pythonは正規表現が言語に組み込まれてなかったりと
テキスト処理は若干やりにくい印象が強い。
その分、テキスト処理以外なら結構使うけどね。
485:デフォルトの名無しさん
11/01/27 05:27:26 .net
>>482
ああ、それ分かるわ。業務マシンとして使う商用UNIX(HP-UX/Solaris/AIX)だと
RubyどころかPython/Perlすらデフォじゃ入っていないし、そういった
フリーソフトの類いは原則として一切インストール禁止という環境もある。
(Web/MailといったInternet系サーバは別ね。あくまで業務マシン限定の話。)
だから商用UNIXユーザは、デフォで入っているツールに長けることになる。
やっぱり本物のUNIXプロを自称するのなら、python/rubyではなくsh/awkだし、
emacs/vimではなくvi、latexではなくroffを選ぶべきだよね。
486:デフォルトの名無しさん
11/01/27 06:50:40 .net
>>484
>Pythonは正規表現が言語に組み込まれてなかったりと
へ?
487:デフォルトの名無しさん
11/01/27 07:07:12 .net
>>486
ん?言語には組み込まれてないだろ?ライブラリとして組み込まれてるだけで。
だから正規表現リテラルとか無いし、importなしには使えない。
488:デフォルトの名無しさん
11/01/27 07:10:47 .net
リテラルだと何か良いことあるの?
489:デフォルトの名無しさん
11/01/27 07:13:35 .net
文字列かパターンか区別しやすい。
490:デフォルトの名無しさん
11/01/27 07:16:17 .net
あと、マッチングの表記が自然。
491:デフォルトの名無しさん
11/01/27 09:03:47 .net
>>485
Solaris はデフォで Perl も Python も入ってるよ
もちろん入れない事も出来るけど
492:デフォルトの名無しさん
11/01/28 15:46:44 .net
>>491
それは簡易インストールで用途としてデスクトップあるいはインターネットサーバを
選択した場合の話じゃないのかな。基本システムにperl/pythonは含まれていないはず。
その簡易インストールも含めてデフォであるとするなら、Debianも同じ。
カテゴリでデスクトップを選べば「rubyもデフォ」でインストールされる。(RHLは知らん)
自分は余計な物は入れたくないから基本システムを選んでるけどね。
高可用性を要求される基幹業務システムの場合、自分はHP-UXを扱うケースが多いけど、
デフォでは基本システムを選び事前に設計したパッケージのみを追加するのが鉄則。
なぜならメーカのサポートが受けられない、あるいはあからさまに嫌な顔をされるから。
そんな環境だと、「真にデフォ」なsh/csh/sed/awkが大活躍していたりする。
493:デフォルトの名無しさん
11/01/28 17:06:59 .net
>>492
Solaris のデフォルトは "Entire Distribution" というパッケージのセットだよ。
インストーラーでデフォルトで選択されているのがこれだし、プリインストール
されているのもこれに近いもの。そこには Perl も Python も入ってる。
インストールする際の選択肢で "Core System" を選べば Perl や Python は
入らなかったと思うけど、これをデフォルトと呼ぶのはちょっと無理があると思うわ。
それと、簡易インストールとかカテゴリでデスクトップとか真にデフォと言った物は
Solaris には存在しない。Debian は知らん。
494:デフォルトの名無しさん
11/01/28 20:11:40 .net
Solaris2.6あたりのデフォでPerlは入ってた記憶がある。
15年くらい前のHP-UXだとPerlが入ってなかった記憶が。
495:デフォルトの名無しさん
11/01/29 00:42:19 .net
俺もHP-UXメインだけどPerl入ってないわ
496:デフォルトの名無しさん
11/01/29 00:47:55 .net
確かに、Solarisに慣れていてHP-UX使わされると使いにくいわー
497:デフォルトの名無しさん
11/01/29 07:33:12 .net
と言うわけで、UN*Xサーバ管理者の場合はawkを使えるようになっておけば間違いありませんね。
498:デフォルトの名無しさん
11/01/29 10:56:30 .net
環境を選ばないサーバ管理だったら、sh,grep,sed,tr,cut,paste,sort,uniqあたりで。
nawkとgawkの仕様差が結構あるので、awkは使いにくい。
499:デフォルトの名無しさん
11/01/29 13:15:51 .net
こういう話題の時にSolarisとかHP-UXは出るのにAIXは出ないイメージ
500:デフォルトの名無しさん
11/01/29 13:40:55 .net
日本男児ならHI-UX、特にHI-UX/WE2だろ。常識やね
501:デフォルトの名無しさん
11/01/29 14:15:09 .net
うむ
502:デフォルトの名無しさん
11/01/29 16:56:12 .net
いやここはedスクリプトで
503:デフォルトの名無しさん
11/01/29 18:47:15 .net
Solarisは、/usr/bin/awk /usr/bin/nawk /usr/xpg4/bin/awk
3つ別々なのが入ってた気がするな。
で、一番まともなのが3番目なので、よそから持ってきたスクリプトは、先頭の#!を
書き換えないといけないという、カオスな状態じゃなかっただろうか。
504:デフォルトの名無しさん
11/01/29 19:23:53 .net
>>503
自分アカウントのパスは真っ先に /usr/xpg4/bin/を持ってきてたわ。
505:デフォルトの名無しさん
11/01/29 19:25:17 .net
スクリプトを組む時はだいたい nawk を使う
他人のスクリプトを丸パクリする機会が無いのでカオスは感じた事が無い
506:デフォルトの名無しさん
11/01/29 19:32:53 .net
>>505
話の流れが>>497 >>498なので、可搬性が問題なんだよ。
507:デフォルトの名無しさん
11/01/29 19:39:08 .net
ウチは RHEL と Solaris だけ考えれば良いから、awk で問題がある時は Perl か Python で済ますわ
508:デフォルトの名無しさん
11/01/30 05:43:19 .net
#!/usr/bin/env [gn]*awk
だろ常考
509:デフォルトの名無しさん
11/02/01 10:39:45 .net
shebang行に /usr/bin/env 書くのってあんま良いと思えないんだよなあ
複数の引数の扱いとか、環境変数をそこまで信用して良いものなのかとか
あと /usr/bin/ に env があることは本当に保証できるのかとか
/bin/sh を書いたほうが良いんじゃないかって思ってしまう
510:デフォルトの名無しさん
11/02/01 11:45:20 .net
この話題も定番だな。前スレの558-564でもやってたぞ。とりあえず結論だけを引用しとくわ。
>調べてみたら#!にインタープリタの引数を2つ以上与えたときの
>挙動はOSによって違うようだった。
>
>FreeBSD4.2: 2つ以上あっても渡る(/usrbin/env gawk -f foo)
>Linux(2.6.8): 空白を含めて1つの引数として渡る(/usr/bin/env "gawk -f" foo)
>Soraris(5.8): 2つめ以降の引数は無視(/usr/bin/env gawk foo)
>
>結局/usr/bin/env使った書き方はgawkのインストール位置の差を
>吸収しようとしてるんだろうが、動作はOSによっててんでばらばら
>なのであまりお勧めできないということだろうか。
511:デフォルトの名無しさん
11/02/02 00:12:39 .net
ruby 界隈でも流行ってるな
意味も判らず「おまじない」と称して使ってるうちに
都市伝説化していくんだな
512:デフォルトの名無しさん
11/02/03 22:33:59 .net
なぜ gawk には tr が無いのだ
tr("A-Z","A-Z")とかしたいぞ
513:デフォルトの名無しさん
11/02/04 03:31:02 .net
つ Python
514:デフォルトの名無しさん
11/02/04 09:10:06 .net
>>512
BEGIN {
hankaku="0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z "
zenkaku="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
}
{
for (i=0; i<length(hankaku); i+=2) {
gsub(substr(hankaku,i+1,1),substr(zenkaku,i+1,2))
}
}
515:デフォルトの名無しさん
11/02/04 09:20:39 .net
それだとtr('ab', 'ba')がうまくいかないんだよなぁ。
516:デフォルトの名無しさん
11/02/04 09:54:40 .net
同じ事じゃん
517:デフォルトの名無しさん
11/02/04 19:22:21 .net
汎用的に1つ作っとけばいいじゃん
518:デフォルトの名無しさん
11/02/05 20:23:34 .net
>514みたいなベタ打ちじゃなくて
A-Zあ-ん
こういう表記で置換する方法ある?
519:デフォルトの名無しさん
11/02/05 20:37:26 .net
>>518
tr 使えば?
520:デフォルトの名無しさん
11/02/06 03:05:39 .net
tr コマンドって環境によってマルチバイトの扱いが違わね?ウチの場合
Ubuntu10.04に入ってるtr(GNU coreutils)7.4はどうやら2文字扱いにしちゃうらしいが
MacOSX10.5に入ってるtr(バージョン判らんがman見るとBSD系ぽい)は1文字扱いにしてくれた
521:デフォルトの名無しさん
11/02/06 05:00:06 .net
UNICODE = 文字数
mbcs = バイト数
522:デフォルトの名無しさん
11/02/07 08:10:44 .net
んーと、どゆこと?
gnome-terminalはユニコード設定のはずなんだが…
他にやらなきゃいけないことがあるってこと?
523:デフォルトの名無しさん
11/02/09 23:11:37 .net
awk++使ってる人いる?
URLリンク(awk.info)
524:デフォルトの名無しさん
11/02/10 14:20:51 .net
最近、awkの存在を知りました。
いろんな言語を触っては挫折・・・触っては挫折・・・を繰り返していました。
awkは何となくマスター出来そうな気がします。
これから頑張ります!!
256倍の本を今は読んでおります。
525:デフォルトの名無しさん
11/02/16 02:02:44 .net
gawkでフィールドをソートして表示したいんだが
{split($0, a);asort(a);for(i=1;i<NF;i++){printf("%s%s", a[i], FS);}printf("%s\n", a[NF]);}
よりもスマートな方法ある?
$1~$NFが入った特殊配列みたいなのがあったらうれしいのだが。
526:デフォルトの名無しさん
11/02/16 07:22:58 .net
>>525
$iとか書けるし代入もできるから
$1~を保存しなくていいのなら、後半は
for(i=1;i<=NF;i++){$i=a[i]} print
と書けばちょっと短くなるな。
527:デフォルトの名無しさん
11/02/16 12:11:40 .net
>>526
なるほど、そうできるのか。ありがとう。
528:デフォルトの名無しさん
11/02/17 01:07:36 .net
URLリンク(www.kt.rim.or.jp) に置いてあった
win32用gawkがいつの間にか公開停止になっていた。
wn32のgensubが使えて日本語が扱えて、
かつexeのみで稼動するのでインストール不要なのが便利で
公私にわたって愛用していたので、非常に悲しい・・・
529:デフォルトの名無しさん
11/02/17 02:14:57 .net
URLリンク(www.vector.co.jp)
↑とは違うの?
530:デフォルトの名無しさん
11/02/18 11:30:36 .net
それは少し古い.
gawk-mbcs-win32-20090920.zip が手元にあるので必要なら再配布するが?
531:528
11/02/19 01:36:10 .net
>>530
もし私に言ってくれているのであれば、
exeのみだけど2009/11/24版が手元にあるので、
これを使い続けようと思う。ありがとう。
532:デフォルトの名無しさん
11/02/19 08:18:59 .net
俺の手元に、gawk-mbcs-win32-20091124.zip があった。
欲しい人がいて、かつ再配布に問題無いという事がわかればどっかにうpするが。
しかしなんで配布やめちゃったんだろね。
どこからか拝借したコードとかのライセンス問題なのかな?
533:デフォルトの名無しさん
11/02/19 22:51:02.65 .net
AWK++によるオブジェクト指向入門
URLリンク(ja.wikibooks.org)
awk++は面白そうだけど、現実にはawkでOOをやる人はほとんどいないだろう。
そもそもawk使いはOOを理解できない高齢者がほとんどだし。
でも、gawkがデフォルトでOOに対応すればawkでオブジェクト指向する人も増えるかもね。
534:デフォルトの名無しさん
11/02/19 23:05:51.24 .net
>>533
デフォでインストールされるawkでできる範囲のことしかやらないよ
535:デフォルトの名無しさん
11/02/20 00:59:51.51 .net
同感。>デフォでできる範囲
長めのスクリプトを書いた事があったのでOOあると便利と思うけど
わざわざインストールするならperl、ruby、pythonがあるしなぁ
536:デフォルトの名無しさん
11/02/22 10:31:51.00 .net
awkで書かれたawk++ってないの?
537:デフォルトの名無しさん
11/03/02 23:14:41.35 .net
gawkで平仮名・カタカナの部分を抜き出したいと思ってます。
例えば「awkについて語るスレ」だったら
"について" "るスレ" を変数に入れたいのですが、いい方法ありますでしょうか?
538:537
11/03/02 23:17:39.07 .net
「について」と「るスレ」はそれぞれ別の変数に入れたいと思っています
539:デフォルトの名無しさん
11/03/02 23:27:45.29 .net
アルファベット以外の部分だったら、アルファベットをFSに指定してwhileで回せばいいけど、
漢字も抜くのは難しいな。
それに、事実上変数は無限に生成するって事か。
540:デフォルトの名無しさん
11/03/02 23:58:57.50 .net
matchの第2引数に/[あ-んア-ン]+/を持ってくるとか?
541:デフォルトの名無しさん
11/03/03 13:28:46.50 .net
$0,$1...$NFを壊してもいいんだったら、私ならこうします。
gsubの検索文字鉄には正規表現を使用することができるから、
ひらがなとカタカナ以外の文字をスペースに置き換える。
gsub(/[^ーぁ-んァ-ン]/," ")
ひらがなとカタカナ以外の文字は半角スペース2つに置き換わる。
あとはNFを見て表示したいように処理する。
注意すべきは、Windows版の新しいバージョンのものでは、
正規表現として、ひらがなを ぁ-ん で、カタカナを ァ-ン で
指定できないものがあります。
たしかマルチバイト拡張で壊された。
542:537
11/03/03 14:28:35.14 .net
>541
まだ試してませんが、欲する文字以外を消してゴニョゴニョすればいけそうです。
>539-540さんもありがとうございました。
543:デフォルトの名無しさん
11/03/03 19:41:21.36 .net
BEGIN {
str = "デンコ漢字ばんざい元気abcdeだから"
c = split(str, a, "[^ーァ-ンぁ-ん]")
for (i = c; i>=1; i--) {
if ( a[i] !~ /^$/ ) { print a[i] }
}
}
544:デフォルトの名無しさん
11/03/03 19:44:47.65 .net
ボケかました
4行目は普通に
for ( i = 1; i <=c; i++) {
でOK。
545:デフォルトの名無しさん
11/03/03 22:55:52.84 .net
cを残さなくとも
for (i in a){if (a[i]) print a[i]}
で間に合うような。
546:デフォルトの名無しさん
11/03/04 01:04:03.52 .net
for-inだと順序が保障されないんじゃなかったっけ?
547:デフォルトの名無しさん
11/03/04 08:34:52.75 .net
for ( i = 1; i in a ; i++) って書き方もできるよ
548:デフォルトの名無しさん
11/03/07 14:14:11.11 .net
a1 a1 a1 a2 a2 a3
b1 b1 b1 b1
c1
d1 d2 d2
....
のように、フィールド数がバラバラで、フィールドが一致する場合もあれば
一致しないデータがあるのですが、重複を
a1 a2 a3
b1
c1
d1 d2
のようにまとめあげるにはどうしたらよいでしょうか?
さすがにググってコピペという訳にもいかず。。。
549:デフォルトの名無しさん
11/03/07 14:31:25.16 .net
>>548
いろいろやり方はあると思うが
awk '{j=0;delete a;for(i=1;i<=NF;i++){if(!a[$i]++){$(++j)=$i}}NF=j;print}'
550:デフォルトの名無しさん
11/03/07 14:53:42.21 .net
ありがとうございます。
それぞれ、4つ重複データのあったものは3つに、2つのものは1つにと減ったのですが
それ以上減ってません。同じコマンドを繰り返しかけてみたのですが、変化はなかったです。
a1 a1 a1 a1
b1 b1 b1
...の部分が
a1 a1 a1
b1 b1
にはなったという意味です。
もう少しおつきあいいただけないでしょうか。。。
551:デフォルトの名無しさん
11/03/07 15:06:41.15 .net
手元では一つになるけどなぁ。原理はわかるだろうからあとはがんばれ。
行ごとにフィールドの添字についてループするのと連想配列で出現チェックがキモ。
% cat hoge.txt
a1 a1 a1 a2 a2 a3
b1 b1 b1 b1
c1
d1 d2 d2
% awk '{j=0;delete a;for(i=1;i<=NF;i++){if(!a[$i]++){$(++j)=$i}}NF=j;print}' hoge.txt
a1 a2 a3
b1
c1
d1 d2
552:デフォルトの名無しさん
11/03/07 15:14:33.26 .net
0610005C13Rik 0610005C13Rik 0610005C13Rik
0610007C21Rik 0610007C21Rik 0610007C21Rik 0610007C21Rik 0610007C21Rik
こういう感じの文字列なんですが
a1とかb1で例えても大丈夫だったですか?
553:デフォルトの名無しさん
11/03/07 15:38:11.62 .net
空白で区切られた文字列ならなんでもいいが、そのレベルの質問が
出るようじゃもうすこし基礎を勉強しないとだめかもなぁ。
554:デフォルトの名無しさん
11/03/07 15:50:13.69 .net
シングルクオーテーション使用のサンプルで問題ないと言う事は~
UNIX環境なのかな~
555:デフォルトの名無しさん
11/03/07 15:58:11.87 .net
Mac OSXのターミナルを使ってます。
>>551はそのままうまく動きました。
いま昇順で手動で作業してますが、まだzを抜けることができません。
もう手がつりそうです
556:デフォルトの名無しさん
11/03/07 16:04:33.75 .net
一行野郎を分解してスクリプトに組み直して弄れば動作確認出来ると思う
557:デフォルトの名無しさん
11/03/07 16:21:10.50 .net
いまwまできました。もうだめです。
一応、ファイルをおいてみます。。。
URLリンク(www5.puny.jp)
パスは1234です。
558:デフォルトの名無しさん
11/03/07 17:18:15.93 .net
まだやってるのか~
ファイルの ^M が問題みたいだから
CRLFのファイル形式に変換して上の一行野郎で問題ないみたいだったよ。
559:デフォルトの名無しさん
11/04/19 03:07:46.46 .net
#複数行の入力中、先の行の11カラム目にOUTが含まれているかつ次の行の11カラム目にINが含まれている2行が揃った時、2行を出力
$11~/OUT/{ prev=$0; }
$11~/IN/{
if(prev!=""){ print prev; print; }
prev="";
}
560:デフォルトの名無しさん
11/04/19 15:55:50.78 .net
# 7.awk
NR >= 2{
if($0 ~ /^>'=+/){
if($0 ~ /~$/){
print "A";
}else{
print "NAA";
}
}else if($0 ~ /^>\^(Q=)+/){
if($0 ~ /~~$/){
print "B";
}else{
print "NAB";
}
}else{
print "NAC";
}
}
7.txt
3
>'======#======~
>^Q=Q=Q=Q=Q=Q=Q=Q=~~
>'===#====~
NAA
NBB
NAA となる。何で?
A
B
A となってほしいのに・・・gawk 3.1.7です・・
561:デフォルトの名無しさん
11/04/19 16:30:51.01 .net
俺の手元のgawk 3.1.7では期待通りの結果になるなあ。
行末がらみだと改行コードが違ってたり見えない空白が
入ってたりというのがよくあるので確認してみ。