awkについて語るスレ $2at TECH
awkについて語るスレ $2 - 暇つぶし2ch450:デフォルトの名無しさん
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では期待通りの結果になるなあ。

行末がらみだと改行コードが違ってたり見えない空白が
入ってたりというのがよくあるので確認してみ。

562:デフォルトの名無しさん
11/04/19 16:32:43.45 .net
>>560
あと

/^>'=+/

ってキャプチャとかしてるわけじゃないから+は無駄じゃないか。


563:デフォルトの名無しさん
11/04/19 16:45:20.75 .net
>>561
ありがとうございました。改行コードをunix形式にしたら出来ました。
今後ともよろしくお願い致します。

564:デフォルトの名無しさん
11/04/19 17:00:39.34 .net
>>559

INがあるときにしかprevがクリアされていないから、OUTが出現した以降に
複数行が経過してもINが出現するとprintされるスクリプトになっているよ。


565:559
11/04/20 01:08:11.06 .net
URLリンク(okwave.jp)
とかの入力をイメージしてたもので...

$11~/OUT/{ prev=$0; }
$11~/IN/{
if(prev!=""){ print prev; print; }
}
$11!~/OUT/{ prev=""; }


566:デフォルトの名無しさん
11/05/01 16:22:39.39 .net
URLリンク(okwave.jp)
#2列目の項目がdisk1~4まで不足部分が埋まるようにし、不足していた部分の1列目には前の時間、3列目には0で埋めたい
BEGIN{ dt=prevDt="00:00:00"; }
NF>=3{ dt=$1; tgt=$2; n=$3; }
NF==2{ tgt=$1; n=$2; }
{ gapDisp(prevTgt,tgt); disp(dt,tgt,n); prevDt=dt; prevTgt=tgt; }
END{ gapDisp(tgt,"disk1"); }

function disp(dt,tgt,n){ print dt, tgt, n; }
function gapDisp(disk,endDisk, cnt)
{
for(cnt=add(getNo(disk)); cnt!=getNo(endDisk); cnt=add(cnt)) disp(prevDt, sprintf("disk%d", cnt), 0);
}
function add(cnt){ return ((++cnt>4)?(1):(cnt)); }
function getNo(disk){ sub(/disk/,"",disk); return disk; }

567:デフォルトの名無しさん
11/05/01 19:40:09.87 .net
BEGIN { reset() }
NF == 2 { $3 = $2; $2 = $1; $1 = last_t }
{ last_t = $1 }
{ if ($2 < last_disk) { p(); reset() } last_disk = $2 }
{ n[$2] = $3 }
{ for(i in n) { if (i >= $2) { t[i] = $1 } } }
END { p() }
function p() {
for (i = 1; i <= 4; i++) {
d = "disk" i
print t[d], d, n[d]
}
}
function reset() {
for (i = 1; i <= 4; i++) {
d = "disk" i
t[d] = t["disk4"]
n[d] = 0
}
}


568:デフォルトの名無しさん
11/05/03 14:58:05.53 .net
間違ってるよ
しかも長くて美しくないよ

569:デフォルトの名無しさん
11/05/03 15:13:19.32 .net
URLリンク(okwave.jp)
...こんな感じかねぇ?   awk -f sum.awk データ | sort
----- sum.awk -----
$1!~/商店名/{ tbl[$1 "," $2]+=$3; }
END{
 for(key in tbl){
  split(key, item, /,/);
  print item[1], item[2], tbl[key];
 }
}
-----

570:デフォルトの名無しさん
11/05/03 15:33:28.80 .net
>>566
NF==3 {
disp();
for(i=1;i<=4;i++) {
disk_time[i]=$1
disk_val[i]=0
}
disk_val[substr($2, 5, 1)]=$3
}
NF==2 {
disk_val[substr($1, 5, 1)]=$2
}
END{
disp()
}
function disp() {
for(i=1;i<=4;i++) {
if(i in disk_time) printf("%s disk%d %s\n", disk_time[i], i, disk_val[i])
}
}

571:デフォルトの名無しさん
11/05/03 16:12:56.67 .net
BEGIN {
    # 先頭がいきなり "disk2 15" のみで始まったりしなければ
    # この初期化は不要。
    a = "00:00:00";
}
NF == 3 {
    if (NR > 1) put();
    a = $1;
    b[$2] = $3;
}
NF == 2 {
    b[$1] = $2;
}
END {
    put();
}
function put(    i) {
    for (i = 1; i <= 4; i++) {
        print a, "disk" i, b["disk" i] + 0;
        b["disk" i] = 0;
    }
}

572:デフォルトの名無しさん
11/05/03 16:20:05.55 .net
>>569 awkの配列ってどれくらい確保可能なの?
先にsortしたらどうかな? sort データ | awk -f sum.awk
----- sum.awk -----
$1!~/商店名/{ if(store==$1 && item==$2) val+=$3; else{ disp(); store=$1; item=$2; val=$3; } }
END{ disp(); }
function disp(){ if(store!="" || item!="") print store, item, val; }
-----

573: 忍法帖【Lv=40,xxxPT】 【東電 76.6 %】 株価【E】
11/05/04 17:32:38.53 .net
ヘックション

574:デフォルトの名無しさん
11/05/06 00:54:22.24 .net
$ uname -sr
CYGWIN_NT-6.1 1.7.9(0.237/5/3)
$ awk --version
GNU Awk 3.1.8

この環境で、
awk 'BEGIN {for(i=j=1;i<50;++i) {print j; j*=10}}'
これ実行すると、jが23桁超えたあたりから、おかしくなるんだけど。

awkの整数って上限あるの?(ウチだけか?)

575:デフォルトの名無しさん
11/05/06 01:09:59.27 .net
long double辺りの精度しかないよ。

576:デフォルトの名無しさん
11/05/06 09:18:39.10 .net
>>574
おれのPCでは普通に 1 から 1e+048 まで表示されますが。。。

577: 忍法帖【Lv=25,xxxPT】
11/05/06 09:54:18.77 .net
URLリンク(ideone.com)

578:デフォルトの名無しさん
11/05/06 11:30:10.09 .net
>>576
本当ですか!よろしければ環境を教えてください。

>>577
ありがとう。ここawkも張れたんだ。結果が長すぎて困ってたのよ。
正にこんな結果になる。

POSIXで保障されてる精度は>>575ってこと?
てことは、awkは内部では、全ての数がdouble扱いなの?

579:デフォルトの名無しさん
11/05/06 14:20:04.87 .net
>>578
576です。WindowsXP + GNU Awk 3.0.6 + multi-byte extension 1.15 です。


580:デフォルトの名無しさん
11/05/06 18:58:28.81 .net
>>579
ありがとう。
あまり違いがないな。Win7は関係ないだろうし。
multi-byte extensionがその辺りも弄っているのか…

そういえば、1e+048みたいな指数で表示されるの?
出力のとき丸めるから、ちゃんと計算できてるように見えるのかな。

581:デフォルトの名無しさん
11/05/06 23:07:48.20 .net
awkでは数値はすべてdoubleで扱います。
ですからその精度である53bit分、大体15桁ちょっとを超えると正確な値を保持できません。

23桁あたりまで正しく表示できてるってのはよくわかりませんが、
3.0.6にしても出力時の書式指定が違うだけで内部的には同じように不正確な値に
なってしまってると思います。


582:デフォルトの名無しさん
11/05/07 01:38:55.53 .net
だから、実質long doubleの精度になっているんだってば。

583:デフォルトの名無しさん
11/05/07 11:11:15.94 .net
>>582
「実質」というのはどういう意味?

#define AWKNUM double

ってのがあるし、long double にしても仮数部は64bitだから23桁には足りないよ?
x87のレベルで拡張精度になってても、表示やらなんやらするところで倍精度に
丸められちゃうと思うんだけど。


584:デフォルトの名無しさん
11/05/07 13:09:06.68 .net
URLリンク(codepad.org)
完全に一致。どう見ても double です。本当にありがとうございました

585:デフォルトの名無しさん
11/05/07 21:19:09.46 .net
>>581
あう、そうなのかー。ありがとうございます。困ったなぁ。
10進で実数扱えとまでは言わないけど、整数は欲しい。
数をいろんな型で扱える処理系なんてないか。

586:デフォルトの名無しさん
11/05/07 23:01:38.63 .net
>>583
あー、long doubleと言ったのが拙かったね。10の冪の場合は実質doubleを大きく越えた精度になっていると言いたかった。

10は2と5の積だから、10倍を繰り返すときに仮数部は5倍ずつにしかならない。
IEEEのdoubleの精度だと5の22乗で53ビットを使い果たすので、そこまでは誤差が生じない。
言い換えれば、10の場合は53ビット+22ビット、即ち75ビット分精度があるように見える。

まぁ、>584を10倍じゃなくて5倍にして、doubleをlong longにして%.fを%llxにしてビット数を数えてみればわかるでしょ。

587:デフォルトの名無しさん
11/05/09 21:13:05.37 .net
gawkのユーザガイドに、他の処理系では、標準エラーを使うため、
 print "Serious error detected!" | "cat 1>&2"
という方法しかないとあります。
gawkは/dev/stderrを特別に扱うため、
 print "Serious error detected!" > "/dev/stderr"
と書くのが適切とあります。

これには、どのような違いがあるのでしょうか?
/dev/stderrがあるOSなら、catのプロセスが生成される他は、違いはないのでしょうか?
環境や処理系を問わず動作させたいなら、上の書き方の方がよいのか、気になっています。

よろしくお願いします。

588:デフォルトの名無しさん
11/05/10 00:17:11.81 .net
他の処理系って、他のawkって事だよ。

/dev/stderrがあるOSって事ぢゃなくて、
gawkは特殊なファイル名として/dev/stderrとか使えるよ、って事だよ。

なので他のOSでも gawk だったらprintとかの出力先ファイル名として /dev/stderr 使えるって話だね。
/dev/stderrとかをサポートしていないgawk以外のawkでも動作させるなら パイプと"cat 1>&2"を使う方法しかない。が、Win系はcatだと...

589:デフォルトの名無しさん
11/05/10 09:20:21.36 .net
そこまでのことをするならPerl/Ruby/Python等のちゃんとした
スクリプト言語で書いた方がいいんじゃないかな。こういう
どうでもいいところで悩まなくて済むよ。

awkはawkで手軽に書ける範囲なら他の追随を許さないと思うが
その枠をはみ出ようとすると途端に大変になる。そこが楽しいと
いうのなら無理には止めないけどw



590:デフォルトの名無しさん
11/05/10 14:35:51.09 .net
>>589
そう、それが楽しいんだ

591:デフォルトの名無しさん
11/05/11 00:36:20.77 .net
>>588
ありがとうございます。
catがない環境だと、どうしようもないですね…

>>589
コンマ区切りのデータを、シェルスクリプトで処理していたので、
それをawkに移植していました。一番手軽だったのです。

ちなみに、2時間半以上かかっていた処理が、1分以内に短縮されました。
ワラタ。   ワラタ…

592:デフォルトの名無しさん
11/05/11 10:19:43.16 .net
Cで書き直したら数秒で実行完了の予感w

593:デフォルトの名無しさん
11/05/11 12:14:45.46 .net
つーてもawkとかその他のスクリプトでサクッと書けるような文字列処理を
C言語とかではあんまり書きたくならんと思うぞw

594:デフォルトの名無しさん
11/05/24 10:19:27.54 .net
なりません

595:デフォルトの名無しさん
11/05/25 20:17:22.02 .net
あぁああぁぁぁ~~~無理だったか、、無理なのかー!a[0][0] = 1 → syntax error

596:デフォルトの名無しさん
11/05/25 21:58:46.38 .net
>>595
gawkの場合インデックスをSUBSEP(=\034がデフォルト)を挟んでシリアライズしたインデックスで多次元配列を表現する
a[0,0] = 1;
ならOKのはず。このときのインデックスは"0\0340"だから、a["0\0340"] == 1。

597:デフォルトの名無しさん
11/05/26 18:46:04.99 .net
>>596
ありがとう。始めからそれを意識して書いてたらよかったんだけどね。

god["name"] = "Kaname Madoka"
god["msg"] = "Mahoushoujo ha watashi dakede juubun dayo."
homerun["name"] = "Akemi Homura"
homerun["msg"] = "Madoka ha watashi no yome."
こんな風に書いていたのを、

puella_magi["god"] = god
puella_magi["homerun"] = homerun
みたいにまとめようとしたら、あばばばば

awkの配列って処理系によっては添え字が整数の場合、処理が最適化されて早くなったりするのかな?
構造体の代わりみたいに使いたかったのだが。

598:デフォルトの名無しさん
11/05/27 00:57:28.69 .net
name["god"] = "Kaname Madoka"
msg["god"] = "Mahoushoujo ha watashi dakede juubun dayo."
name["homerun"] = "Akemi Homura"
msg["homerun"] = "Madoka ha watashi no yome."

でよくね?

599:デフォルトの名無しさん
11/05/30 21:25:51.88 .net
awkって *どの実装でも* 一度も使ったことがない変数の内容って、スカラなら0か""になってるの?
変数が一度も代入されていないことを判定するために、(x==0 && x=="")って書いて何か問題ない?

600:デフォルトの名無しさん
11/05/30 21:31:52.21 .net
>>599
評価されるときに変数が存在しなければ作成される。はず
配列の要素なら in で調べられるけど
変数自体となるとどうだろうね

601:デフォルトの名無しさん
11/05/30 21:32:47.76 .net
>>599
何度も代入した後、最後に 0 or "" を代入した変数と区別できない。

602:デフォルトの名無しさん
11/05/30 23:19:06.92 .net
>>600-601
ありがとう。区別できないって、どういう状態になるの?0を代入したら0か"0"に評価される。
ああ、""を代入したら0か""に評価されて駄目ってことか!?

603:デフォルトの名無しさん
11/05/31 00:05:27.97 .net
あれ?試したらどっちを代入しても599の式は0に評価されたよ。区別できないケースってどういう場合?

604:デフォルトの名無しさん
11/05/31 06:28:27.99 .net
BEGIN {
    # 初期化直後 (未使用) の変数は数値 (0) と文字列 ("") の両方の型を持つ。
    print x == 0, x == ""; # 両方とも真

    x = 0;
    print x == 0, x == ""; # 前者のみ真。

    x = "";
    print x == 0, x == ""; # 後者のみ真。

    # 他の未使用の変数を代入すると "再初期化" できる。
    x = y;
    print x == 0, x == ""; # 両方とも真。
}

605:デフォルトの名無しさん
11/05/31 22:57:53.71 .net
> 初期化直後 (未使用) の変数は数値 (0) と文字列 ("") の両方の型を持つ。
IEEE Std 1003.1 の awk の EXTENDED DESCRIPTION の
Variables and Special Variables に書いてあるね。 uninitialized value というらしい。
POSIXに準拠してるawkならこうなるみたいだけど、オリジナルは知らん。

再初期化するなら$(NF+1)使うほうがいいかもね。未使用の変数を用意しなくていい。
だけど、それが必要な場面が思い浮かばないが。

関係ないけど、abs関数ってないんだね。別に良いけど、πや、
0より大きい最小の浮動小数点数は定義しててほしいなあ。

606:デフォルトの名無しさん
11/06/02 10:09:14.37 .net
>>605
> 再初期化するなら$(NF+1)使うほうがいいかもね。未使用の変数を用意しなくていい。
フィールド変数は常に文字列型で、 数値型は持たない。

607:デフォルトの名無しさん
11/06/02 22:47:31.10 .net
πはatan2(0,-1)でいいとして
「0より大きい最小の浮動小数点数」ってどう定義していつ使うの?

608:デフォルトの名無しさん
11/06/03 13:48:37.95 .net
「0より大きい最小の浮動小数点数」というのが何を希望しているかによる。
以下の3種類がある。

(1) 最小の正の非正規数
(2) 最小の正の正規数
(3) 1.0に足して丸めた結果が1.0より大きくなる最小の数

609:デフォルトの名無しさん
11/06/03 23:58:11.26 .net
>>606
あちゃ!そうでした。$で戻るのは文字列だった。
その仕様書読んでると、NFを拡張したとき、元々なかった所はuninitialized valueになるってあったので。

>>607
それでいいんだけど、PIとかで参照できたらもっといい、と思ったのです。
>>608
数値計算のために、CのDBL_EPSILONの代わりになる定数が欲しいなと。
任意の精度で丸められる関数もないですし。

610:デフォルトの名無しさん
11/06/04 09:41:48.63 .net
DBL_EPSILONが>>608の(1)~(3)のどれかわからない?
数値計算の基本なんだが。

611:デフォルトの名無しさん
11/06/10 21:49:33.34 .net
変数名など、自前であっても規則を意識している方いますか?
awkだと、C風が一般的なのでしょうか?
一番最初がVBAだったので、長い名前と省略が混ざってしまって
自分でイライラしています。
みなさんの、通常の変数はこう、配列はこう、定数はこう、文字型はこう・・・
というものを参考にしたいです。


612:デフォルトの名無しさん
11/06/10 22:10:28.97 .net
>>611
システムハンガリアンを採用するかどうか悩むほど大きなものをawkで書いたことが無い

613:かあた
11/06/13 18:37:34.88 .net
、5なわやあふぉt( ())

614:デフォルトの名無しさん
11/06/15 21:51:26.93 .net
>>611
遅レスだが、型_内容の説明_名前みたくしてる。名前が一文字だとそのままだけど。
グローバル変数とローカル変数のどっち弄ってるのか分かりやすいように、ローカル変数は必ずlで始めるようにしてる。
d_per_shouhizei = 5.0とかね。

615:デフォルトの名無しさん
11/06/20 18:37:26.17 .net
gawkでBINMODEを設定すればバイナリーの入出力ができるのはわかるのですが、
入力されたバイナリーを16進ダンプして表示するにはどうしたらよいでしょうか?
od等の外部コマンドを使う意外に方法があればお教えください。

616:デフォルトの名無しさん
11/06/20 19:17:07.50 .net
printf("%02x\n", $1);

617:天使 ◆uL5esZLBSE
11/07/05 00:15:13.83 .net
二度と話かけんなよ
お前らってどうみてもゴミだよな


618:デフォルトの名無しさん
11/07/06 14:04:55.24 .net
ゴミんなさい

619:デフォルトの名無しさん
11/07/14 23:55:15.84 .net
>>595
gawk4.0.0でa[0][0]=1も可能になったじゃないか

620:デフォルトの名無しさん
11/07/30 19:46:15.81 .net
超初心者の質問で申し訳ありません。以下のようなデータを
aaa 10
bbb 20
ccc 30
aaa 30
bbb 30
aaa 15
ccc 30
ddd 20
以下のようにまとめたいのですが、どうしたらいいでしょうか?
aaa 55
bbb 50
ccc 60
ddd 25

621:デフォルトの名無しさん
11/07/30 19:53:38.97 .net
ddd 20 ではないかと思うがこんな感じかな
awk '{a[$1]+=$2} END {for (b in a) {print b " " a[b]}}' | sort

622:デフォルトの名無しさん
11/07/30 23:15:27.52 .net
Gawk4ならPROCINFO["sorted_in"]の設定で最後のsortが要らなくなる

623:620
11/07/30 23:22:20.03 .net
>621
ありがとうございます!うまくいきました。

624:デフォルトの名無しさん
11/07/31 15:24:48.76 .net
gawkはもう別言語なイメージ。普段mawk使ってると

625:デフォルトの名無しさん
11/08/16 22:48:21.64 .net
ここって生きてますか?

626:デフォルトの名無しさん
11/08/18 01:56:26.63 .net
生きてますん

627:デフォルトの名無しさん
11/08/19 00:53:44.39 .net
生きていることを願って質問を。
WIN32のEXE一つで、下のTEST.AWKがマトモに動くAWKを探しています。
これら以外にありますか?

URLリンク(hinadori.atnifty.com)
URLリンク(my.vector.co.jp)
URLリンク(my.vector.co.jp)

Cygwin版も試したのですがダメでした。

TEST.AWK
{ gsub("[0-9]","x",$0) ; gsub("ソ","ソ",$0) ; gsub("T","T",$0) ; print }

TEST.DAT
アイウエオカキクケコサシスセソ
ココココサフサコココココ
ココココサフサココココ
ココココサフサコココココ
ココココサフサコココココ
サフサフサフサフサフサ
ココココサフサコココココ
ココココサフサココココ
ココココサフサコココココ
ココココサフサコココココ
サフサフサフサフサフサ

628:627
11/08/19 01:00:20.60 .net
TEST.DATは、空白が入っています。
専ブラのポップアップをコピペして下さい。

629:デフォルトの名無しさん
11/08/19 06:26:54.92 .net
ウチに帰ってから調べてみるよ

630:デフォルトの名無しさん
11/08/19 11:02:41.54 .net
>>627-628
cygwinのawk(GNU Awk 3.1.8)で動くけど、どうなるはずがどう動かないと言っている?
>627のtest.datなら、当然「ソ」だけが変換されるけど。

631:デフォルトの名無しさん
11/08/19 11:55:06.25 .net
(CygwinならUTF8じゃないとうまく動かないけど)Shift JISで動作させたいってことかな?
事前にTEST.DATをnkf -wに通したら駄目かな。

632:629
11/08/19 21:59:57.43 .net
>>627
スクリプトもDATもSJISで試したけど、上記3つのうち、gawk-mbcs-win32-20051223.zipはダメだったよ。
1行目がこんなんなる。

アxxエオカキクxコサxxxソ

手持ちの
GNU Awk 3.1.7(windows special Nov 24 2009)
で、--ctype=SJISやっても同じ結果になるね。

スクリプト、DATをUTF-8にして、--ctype=UTF8やってリダイレクトしたファイルは正常な結果が出るよ。
リダイレクトしないでコマンドプロンプトに表示させると化けるけど。

633:デフォルトの名無しさん
11/08/19 23:18:25.14 .net
EUCなら半角カナもうまくやってくれるんだが…

634:デフォルトの名無しさん
11/08/24 08:07:37.54 .net
gawkはガンガン機能を拡張してるけど、
そろそろOOP対応してくれないかな。
awk++とかあるけど、標準でOOPできれは便利。

635:デフォルトの名無しさん
11/08/24 22:44:37.24 .net
> OOP
...もはやawkでやる意味が無いw 他にいくらでもある別の言語でいいじゃん

636:デフォルトの名無しさん
11/08/25 01:14:17.45 .net
awkに在ると便利かもと思うのは参照値くらいかな

配列や関数への参照を値として取り出し格納したり
逆にその値から元の配列にアクセスしたり元の関数を呼んだり出来ると
相当に複雑なデータ構造が表現可能になる、それこそOOPっぽいことも可能だし

でもあんまりややこしいことやるならPerlでいいから必須ではないね

637:デフォルトの名無しさん
11/08/25 02:28:23.99 .net
> 関数を呼んだり

変数の値を関数名として
var = "sage";
@var();
ってできるけど、それとは違うのん?




638:デフォルトの名無しさん
11/08/25 04:07:56.67 .net
およ、もうあるのかw
最近のawkは分からねえ…ってことは、配列への参照を使って入れ子の配列とか既に作れちゃったりするのか?

639:デフォルトの名無しさん
11/08/25 10:56:54.36 .net
配列の配列は作れるよ。gawk4なら。

640:デフォルトの名無しさん
11/08/25 19:51:33.84 .net
(´_ゝ`)フーン

641:デフォルトの名無しさん
11/08/25 20:52:51.07 .net
class human {
  property name
  property sex
  property age
  method new(x, y, z) {
    name = x
    sex = y
    age = z
  }
  method say() {
    printf("私は%s。%d歳の%sです。\n",name, age, sex)
  }
}
class japanese : human {
  property name
  property sex
  property age
  method say() {
    printf("私は%s。%d歳の%sです。国籍は日本です。\n", name, age, sex)
  }
}
BEGIN {
  alice = human.new("アリス", "女", 11)
  taro = japanese.new("太郎", "男", 15)
  yuka = japanese.new("由佳", "女", 18)
  alice.say()
  taro.say()
  yuka.say()
}

642:641
11/08/25 20:58:10.41 .net
>>635
URLリンク(code.google.com)
これを使えばこの程度のOOPはどうにかできる。
本当にこの程度でいいからOOPに対応してほしい。
使う人はほとんどいないと思うが、全くできないのも困る。

643:デフォルトの名無しさん
11/08/25 22:07:53.46 .net
それは最早awkである必要が全く無い

644:デフォルトの名無しさん
11/08/26 06:00:04.19 .net
function Human(self,name,sex,age) {
self["property___name"] = name
self["property___sex"] = sex
self["property___age"] = age
self["method___say"] = "Human___say"
}
function Human___say(self) {
printf "私は%s。%d歳の%sです。\n", self["property___name"], self["property___age"], self["property___sex"]
}

function Japanese(self,name,sex,age) {
Human(self,name,sex,age)
self["method___say"] = "Japanese___say"
}
function Japanese___say(self) {
printf "私は%s。%d歳の%sです。国籍は日本です。\n", self["property___name"], self["property___age"], self["property___gender"]
}

function methodcall(obj,methodname, m) {
m = obj["method___" methodname]
@m(obj)
}

BEGIN {
Human(alice, "アリス", "女", 11)
Japanese(taro, "太郎", "男", 15)
Japanese(yuka, "由佳", "女", 18)
methodcall(alice,"say")
methodcall(taro,"say")
methodcall(yuka,"say")
}

645:デフォルトの名無しさん
11/08/26 06:01:35.02 .net
ごめん一部genderになってるからsexに直しといて

とりあえず、こんな感じでgawk4でもOOP自体は出来るよって話

646:デフォルトの名無しさん
11/08/27 15:07:17.61 .net
>>644
なるほどねー
とても勉強になります

でも、やっぱりOOP用の構文が使えればベストですね
そのほうがわかりやすいと思います

647:デフォルトの名無しさん
11/08/27 15:58:44.09 .net
やっぱ別言語使うべきだろ

648:デフォルトの名無しさん
11/08/27 16:10:36.72 .net
本当に欲しいんなら、gawkのMLにこうすればOOP実現できることを発見したんだけど、
これの糖衣構文を用意してくれって投稿するといいんじゃね
switchも実装されてるし、欲しい人が居ると分かれば付けてくれるかもよ

649:デフォルトの名無しさん
11/08/27 16:25:08.65 .net
#! /usr/bin/env python
# -*- coding: utf-8 -*-

class human:

  def __init__(self, name, sex, age):
    self.name = name
    self.sex = sex
    self.age = age

  def say(self):
    print("私は" + self.name + "。" + str(self.age) + "歳の" + self.sex + "です。")

class japanese(human):

  def __init(self):
    super(human, self).__init__(self)

  def say(self):
    print("私は" + self.name + "。" + str(self.age) + "歳の" + self.sex + "です。国籍は日本です。")

if __name__ == "__main__":

  alice = human("アリス", "女", 11)
  taro = japanese("太郎", "男", 15)
  yuka = japanese("由佳", "女", 18)
  alice.say()
  taro.say()
  yuka.say()

650:デフォルトの名無しさん
11/08/27 16:26:25.23 .net
pythonで書いてみると、
>>641と比べると特にわかりやすいわけでもないけど
>>644よりはわかりやすい

651:デフォルトの名無しさん
11/08/27 16:53:49.92 .net
そりゃawkはOOPLではないからな
あくまでシェルのお供でいいと思うんだ
そしてそこに高度なOOP機能は要るとは思えない
どちらかと言えばフィールド抽出とかをもっと便利にすべきだよ

652:デフォルトの名無しさん
11/09/17 15:34:39.29 .net
cygwin以外でgawk4.0をwindowsで使おうと思ったら、バイナリはどこで入手できもうすかね?

653:デフォルトの名無しさん
11/09/17 16:28:58.78 .net
cygwin で駄目な理由が分からないから教えられない。

654:デフォルトの名無しさん
11/09/18 08:02:36.95 .net
>>652
URLリンク(www.klabaster.com)

655:デフォルトの名無しさん
11/09/19 13:00:55.06 .net
>654 さんくすこ

>653 awkの実行形式だけ入手すれば良いようにしたいのさ。

656:デフォルトの名無しさん
11/09/19 14:01:43.39 .net
バイナリ互換のWindowsなのに、cygwinてexeをもってくだけじゃ使えないの?

657:デフォルトの名無しさん
11/09/19 16:07:37.39 .net
物によっては使えたような気がする。
cygwin1.dllだっけ?にパスが通ってれば大体使えたような気がする。

658:デフォルトの名無しさん
11/09/19 17:00:12.76 .net
結構沢山のdllが要るよ
コマンドによるけど

659:デフォルトの名無しさん
11/10/24 01:55:49.24 .net
教えてください。英語得意な人

URLリンク(www.gnu.org)
の asort(), asorti()で使うユーザー定義の比較関数について
3番目の引数とPROCINFO["sorted_in"]に設定するのと違うのか同じなのか?

それと
URLリンク(www.gnu.org)
に書いてある3番目の引数の説明("descending"とか)が両立してんの?

660:デフォルトの名無しさん
11/10/24 11:34:13.18 .net
URLリンク(www.gnu.org)
As with PROCINFO["sorted_in"], this argument may be the name of a user-defined function, ....

URLリンク(www.gnu.org)
The third argument can also be a user-defined function name ....
第三引数の値と同名の関数が定義済みならそれを利用するとか、
そういう方法で区別してるんじゃないの

661:デフォルトの名無しさん
11/10/24 13:33:04.59 .net
>>659
比較関数の与え方はPROCINFO["sorted_in"]の場合と同じってことだろ。

自分で定義した関数の名前でもいいし、11.2.1.2に書いてあるようにすでに用意
されている@~を使ってもいい。



662:デフォルトの名無しさん
11/11/14 21:59:05.28 .net
個人的には、GAWKにはあと、Cで書いた関数の呼び出しというか
GAWKで呼ぶ関数をCで書ける機能が欲しいと思ってるんだけど、
ここ見る限り世間的にはあんまり需要ないんかねぇ。

まぁ、それやるくらいならGAWK自体に変更を加えて再コンパイルしろってことかもしれないけど。

663:デフォルトの名無しさん
11/11/15 01:44:31.01 .net
PとかR使え言われると思う。

664:デフォルトの名無しさん
11/11/15 01:58:32.43 .net
>>662
URLリンク(www.gnu.org)
じゃダメ?将来的にさらに拡張される可能性はあるみたいだけど

665:デフォルトの名無しさん
11/12/09 00:35:09.18 .net
最近awkcardを知って座右に置いてるのだが、日本語版って存在するのだろうか。

666:デフォルトの名無しさん
11/12/22 16:57:35.32 .net
URLリンク(gauc.no-ip.org)
ここに書いてある通りにしても日本語に翻訳されません
どうしてですか?
環境は LinuxMint12 、 GNU Awk 3.1.8 です

667:デフォルトの名無しさん
11/12/22 18:01:49.60 .net
>>666
その通りにやったと言うのなら、何故poファイルを提示しないのかね、ダミアン君。

668:デフォルトの名無しさん
11/12/22 18:07:45.38 .net
>>667
poは作成しましたし、moも所定のディレクトリにあります。
poは自分で編集しても、そのサイトの内容をコピペしてもダメでした。

$ cat gettext.po
#: gettext.awk:10
msgid "********** Count Prime Number **********"
msgstr "========== 素数を数える =========="

#: gettext.awk:14
msgid "2 is a prime number."
msgstr "2 は素数です。"

#: gettext.awk:24
msgid "%d is a prime number.\n"
""
msgstr "%d は素数です。\n"

$ ls ja_JP/LC_MESSAGES/
gettext.mo

669:デフォルトの名無しさん
11/12/22 18:10:02.43 .net
結果はこの通りです。

$ LC_ALL=ja_JP gawk -f gettext.awk 10
********** Count Prime Number **********
2 is a prime number.
3 is a prime number.
5 is a prime number.
7 is a prime number.

670:デフォルトの名無しさん
12/01/12 13:56:36.33 .net
ずいぶんawkから離れていて久しぶりに使ったら
nawkに日本語のバグがあることにしばらく気づかなかった
substr()でutf-8のテキストを切り出すとおかしな値になる
gawkでは直っている

671:デフォルトの名無しさん
12/01/12 19:50:49.28 .net
そもそもUTF-8に対応してたっけ

672:デフォルトの名無しさん
12/01/13 00:28:07.37 .net
URLリンク(blog.livedoor.jp)
残念ながら、シフトJIS、UTF-8両方で正常に動作しそうなWindows版gawkは候補の中にありませんでした。

673:デフォルトの名無しさん
12/01/13 07:52:50.95 .net
Linuxでは普通に動くが…

674:デフォルトの名無しさん
12/04/29 21:07:39.93 .net
ファイル名が"*.txt"の一覧を取得するとき、"\.txt"でマッチさせると、任意の一文字.(ドット)と解釈されてしまうんですが、いい方法無いでしょうか?

675:デフォルトの名無しさん
12/04/29 22:04:14.36 .net
GNU Awk 3.1.7だとドットにマッチしたけどそもそもawkの話?
具体的にコマンドがほしいな

676:デフォルトの名無しさん
12/04/29 22:08:23.01 .net
昭和の頃覚えたアセンブラとC言語
これがあったから
いまだに自分が損な業界で飯を食ってる

677:デフォルトの名無しさん
12/04/29 22:36:10.83 .net
>>676
そこからjavaに行ってスマホアプリ開発ならもう一花咲いたかもしれませんねw

678:デフォルトの名無しさん
12/04/29 23:09:38.43 .net
馬鹿には無理

679:674
12/04/30 18:07:43.22 .net
>>675
ls | awk '{ if( match($0,"\.txt") > 0) print $0 }'
↑会社のサーバ上でこんな感じのことやろうとしてたんですが、
「gawk: 警告: エスケープシーケンス `\.' は `.' と同等に扱われます」
とメッセージが出力され、ドットが任意の一文字?と解釈されて困っていましたが、
自己解決しました。(自宅のLinuxPCで動作確認しました。GAWK3.1.7及び4.0.1)
"\.txt"では無くて、".txt"で良かったんですね。
お騒がせしました。

もしかしたら、会社のサーバ(RHEL)のGAWKが古くて解決できてないかもしれませんが。

680:デフォルトの名無しさん
12/04/30 20:27:16.48 .net
>>679
match() の第二引数に文字列を与えた場合は事前に正規表現への型変換が行われるが、
その際にエスケープが外れて /.txt/ と同等になってしまう、 ということかと。
つまり "\\.txt" とするか、 正規表現の /\.txt/ を与えればよい。

The GNU Awk User's Guide にもこの現象についての説明はあるが、
~ !~ 演算子についてしか触れられていない。
URLリンク(www.kt.rim.or.jp)

681:デフォルトの名無しさん
12/05/24 00:27:31.74 .net
gawk4.0.2付属の原版ではmatchの説明にもその辺触れられてるね。
URLリンク(www.gnu.org)
誰かこのバージョン日本語化してないかな。

682:デフォルトの名無しさん
12/07/12 02:26:40.35 .net
FIFOな感じの先入れ先出しのバッファには何使えばいい?
というか、
Arrayで、たとえばA[3] からA[8]までのデータをA[1]からA[6]に動かすには何が一番早い?
できれば配列は1つしか使いたくないのだが、無理だろうか…


683:デフォルトの名無しさん
12/07/12 09:23:22.92 .net
速さを求めるなら毎度全要素ずらすより、読み出し位置と書き込み位置の添字持って
管理した方がたいてい速い

684:デフォルトの名無しさん
12/07/12 10:14:32.78 .net
awkには連想配列しかないしな

685:デフォルトの名無しさん
12/07/14 14:35:06.22 .net
リングバッファで何とかなるならリングバッファかな

686:デフォルトの名無しさん
12/07/14 22:27:17.73 .net
>>682
BEGIN{
 QMAX=3
 QTopPos=0;QTailPos=0;QNum=0;
 deQ();
 enQ("1");deQ();
 enQ("a");enQ("b");enQ("c");enQ("x");deQ();deQ();deQ();deQ();
}
function enQ(PushVal){
 if (QNum+1 > QMAX){print "おなかいっぱい"; return;}
 nextPos = (QTopPos+1) % QMAX;
 queue[QTopPos] = PushVal;
 QTopPos=nextPosQNum++;
}
function deQ(){
 if (QNum < 1){print "からっぽ"; return}
 QNum--; TailVal=queue[QTailPos]
 QTailPos = (QTailPos +1) % QMAX;
 print TailVal;
 return TailVal;
}

687:686
12/07/14 22:54:06.64 .net
↑の結果はこんな感じ。
>からっぽ
>1
>おなかいっぱい
>a
>b
>c
>からっぽ

>>685の書いているリングバッファ実装です。
enqueue,dequeue回数が多いならリングバッファで良いと思う。
大抵の場合はQMAXに大きな値を設定すれば事足りるハズだけど
上限が決定できない等の事情があればdelete arrayを使った単純な配列管理かな。
ただ添え字が数値上限を超えない様な工夫は必要だね。

688:デフォルトの名無しさん
12/07/15 21:09:36.15 .net
リングでも上限を定めると入力ストリームの上限が不明な場合まずいことになるので、現在は
A=入力Array,C一時保管,i,k,n,p
  k=1;C[0]=0;
  for(i=1;i<=A[0];i++){n=0;while(k<i && A[k++]=C[n+=1]);if(n){
  delete C[C[0]+1];C[0]-=n;p=0;while(C[p+=1]=C[n+=1]);}p=1;
  while(match(substr(A[i],p),re)){p+=RSTART-1;n=substr(A[i],p,RLENGTH);
  if(k<i){A[k++]=n;}else{C[C[0]+=1]=n;};p+=RLENGTH;}};n=1;
  while(A[k++]=C[n]){delete C[n++];};A[0]+=C[0]-1;C[0]=0;
を使っている。
re=regexpとして、Array Aに一致するデータがあれぼそれを取得、結果をArray Aに出力、A[0]に合計が記載。

これ以上(コードサイズ、ある程度の速度、メモリの使用量を極力少なく)という条件で最適化できるだろうか…
だれか頼む。
入力と出力先が同じでも、別でも作動するコードなら尚のこと良いのだが…


689:デフォルトの名無しさん
12/07/17 00:02:18.87 .net
これはひどい
デバッグも拡張も無理じゃね

690:デフォルトの名無しさん
12/07/17 22:03:00.62 .net
基本的に一度作って後は必要に応じてコピペだがらな。他には
function grep( o, re, p, B, this, a ){
B[0]=0;if(o~"-v"){while((getline v < p)>0){if(!match(v,re))B[B[0]+=1]=v;}return B[0];};
if(o~"-o"){while((getline v < p)>0){a=v;while(match(a,re)){B[B[0]+=1]=substr(a,RSTART,RLENGTH);
a=substr(a,RSTART+RLENGTH);}};return B[0];};while((getline v < p)>0){if(match(v,re))B[B[0]+=1]=v;}return B[0];
}
なんかも良く使う。grep("-o","pattern","/var/log",data);みたいな感じで。前のはagrep("-v",pattern,B,C)の一部分。
日ごろのメンテでちょっとした手作業じゃめんどいの組むときに、ほぼ数分で組みあがるのが楽なんだよ。
サブプロセスとしてgrep呼び出すのがコストかかる時とか、perlが破損した状況でのリカバリースクリプトとして組んだのが元だけど。
カーネルさえ生きていれば後はawkバイナリ流し込めば使え、shが半分死んでいてもなんとか動くし。


691:686
12/07/21 23:12:03.74 .net
>>688
BEGIN{
 QMAX=9007199254740991
 QTopPos=QTailPos=QNum=0;
 hitTop=0;
 A[++z]="hoge";
 A[++z]="1 2 3 4 5";
 A[++z]="fuga";
 A[0]=z;
 for(i=1;i<=A[0];i++){
  p=1;
  while(match(substr(A[i],p),/[0-9]+/)){
   p+=RSTART-1;
   enQ(substr(A[i],p,RLENGTH));
   p+=RLENGTH;
  }
  if(QNum>0){
   while(QNum && hitTop<i)A[++hitTop]=deQ();
  }else{
   delete A[i];
  }
 };
 if(QNum>0) while(QNum)A[++A[0]]=deQ();
 for(z=1;z<=A[0];z++)print "A[" z "]:" A[z];
}


692:686
12/07/21 23:44:24.03 .net
691の続き
ちなみに、A[1]~A[A[0]]をgrepして結果はA[1]~A[?]に戻すスクリプトね。
複数件マッチする事があるので未処理行を上書きしないようにキュー使ってる。
function enQ(PushVal){
 if (QNum+1 > QMAX){print "Queue Overflow"; exit;}
 nextPos = (QTopPos+1) % QMAX;
 QBody[QTopPos]=PushVal;
 QTopPos=nextPos
 QNum++;
}
function deQ(){
 if (QNum<1){print "Illigal dequeue"; exit;}
 QNum--;
 TailVal=QBody[QTailPos];
 delete QBody[QTailPos];
 QTailPos=(QTailPos +1) % QMAX;
 return TailVal;
}
リングバッファの上限超えたら終了させてるけど>>688の実装も上限超えたらバグるし許して。
計ってないけどループがない分早い筈。コードサイズはお察し。
メモリはA[]にデータ抱えてる時点でアウトな感じだけどA[]を適宜消すようにしといた。
出力先を別にしたいならA[]にdeQ()せず別変数にすればおk。
これで良い?

693:688
12/07/22 09:36:17.43 .net
>QMAX=9007199254740991
ワロタwww
俺のも確かにwhile(C[p+=1]=C[n+=1]);の部分で保持してるのすべて消費分だけ上に移動させてるのが無駄なので
そのループが無い分は確かに早いはず。

あと、恥ずかしながら尋ねたいのですが、俺>>688の実装で上限超えたらバグるをkwsk
なんか見落としてたのか今更ながら心配になってきた。
昔作ったやつなんで、結構な頻度使ってきたのだが今までバグに気づかなかった

しかしデータをメモリ上に展開するからどうしても上限が出てくるな…
awkで10GBぐらいの扱う時はgetlineでなんとかなるけど、やはりメモリマップやポインタが使えたら便利だよなぁ
パッチ作ったら需要あるかな?

694:デフォルトの名無しさん
12/07/22 11:41:46.83 .net
>>693
691、ちょっと訂正。無駄にキュー使う分、元スクリプトから劣化してた。
>    p+=RSTART-1;
>-   enQ(substr(A[i],p,RLENGTH));
>+   if(hitTop+1<i){
>+    A[++hitTop]=substr(A[i],p,RLENGTH)
>+   }else{
>+    enQ(substr(A[i],p,RLENGTH));
>+   }
>    p+=RLENGTH;
あと、良く考えたら出力先を別にするなら、そもそもキュー不要。

バグってのは687で数値上限云々と書いたとおり、
”C[0]+=1”がawkの整数の精度誤差なし演算可能上限を考慮していないだけ。
どのawkも多分そうだと思うけど、手元の環境下での実行結果↓
C:\>gawk --version
GNU Awk 3.1.7(windows special Nov 24 2009)
C:\>gawk "BEGIN{print 9007199254740990+1}" nul
9007199254740991
C:\>gawk "BEGIN{print 9007199254740991+1}" nul
9007199254740992
C:\>gawk "BEGIN{print 9007199254740992+1}" nul
9007199254740992

実際は(hddやメモリが先に死ぬので)
一行でこれだけ正規表現がhitする事は事実上無いし、
仮に発生しても検索結果が潰れるだけで、気付かない筈。


695:688
12/07/22 13:39:49.16 .net
>9007199254740992
理論上、8192ペタバイトの同じデータ[aaa...]でregexp="."とすれば、発生するな…
IEEE 754の52bit制限だから、これ以上のでかい数字扱うならbig numbert対応のライブラリか,
"bc -q" |& で動かすか、xgawk、dnawkあたり使うべきだなぁ

昔誰かがbignumのawkスクリプト書いて放流していた覚えがあるのだが、
ググッても見つからん。手元にあるのはビット演算のやつだけだわ
いつかそれだけのデータをメモリ上に保持できるマシンを扱ってみたいものだ…

696:デフォルトの名無しさん
12/08/03 02:35:23.75 .net
awkってabsとかacosなどの基本的な算術関数が用意されてないんですね
今後も実装されることはないんでしょうか?

パイプでサクッとつないでワンラインで処理するのに重宝してたんですが・・・
代わりとなると、何使うのがよろしいですか?
できればperlは使いたくないです(どうしても好きになれない

697:デフォルトの名無しさん
12/08/03 06:48:38.25 .net
absは自分で書けばいいし、acos(x)はatan2(x, √(1.0 - x*x))と書けるから、
どちらも基本的ではないと判断して組み込みじゃないんだと思うけど。

PythonかRubyでいいんじゃない? ワンライナー向きではないけど。

698:デフォルトの名無しさん
12/08/03 07:37:24.41 .net
>>696
ライブラリ(?)を拾って来ては?

699:デフォルトの名無しさん
12/08/03 11:48:03.19 .net
>>696
必要な関数値を計算するだけのプログラムをCで作っておいたら?

700:デフォルトの名無しさん
12/08/03 20:21:59.43 .net
昔それでベクトル演算して遊んだな

701:デフォルトの名無しさん
12/08/04 09:23:47.83 .net
Rubyはそこそこワンライナーも書ける感じがする、awkやPerlほどじゃないけどね
Pythonは流石にコード起こさないと辛いことが多いが

702:デフォルトの名無しさん
12/08/04 10:27:49.07 .net
awkでmatlabみたいなベクトル演算できるようにしてほしい

703:デフォルトの名無しさん
12/08/04 16:48:36.10 .net
awkでクラスを使えるようにしてほしい

704:デフォルトの名無しさん
12/08/04 17:06:19.06 .net
awkで全ての魔法少女を救ってほしい

705:デフォルトの名無しさん
12/08/04 17:08:30.07 .net
awkさんは魔女

706:本田
12/08/05 07:21:28.03 .net
Awk++
URLリンク(awk.info)
OO in AWK++
The awk++ language provides object oriented programming for AWK that includes:
classes
class properties (persistent object variables)
methods
inheritance, including multiple inheritance

URLリンク(lawker.googlecode.com)


707:デフォルトの名無しさん
12/08/05 09:56:26.63 .net
デバッグ大変過ぎて死ぬる
$ cat witch.awkpp
class Witch {
var spell
method new() { spell = "mahalic mahalita" }
method perform() { print spell }
}
class Samantha : Witch {
method perform() { print "twitch" }
}
BEGIN {
# wife = Witch.new() エラー要因行
wife = Samantha.new()
wife.perform()
}
$ gawk -f awkpp -r witch.awkpp
gawk: -:10: () エラー要因行
gawk: -:10: ^ syntax error
gawk: -:10: () エラー要因行
gawk: -:10: ^ 表現の char '?' は不正です。

708:デフォルトの名無しさん
12/08/22 00:09:49.86 .net
size: 656 byte, supports -o -v option. Array A and B can be the same (NEW)
function xagrep( o, re, A, B, this, a, i,k ){
k=0;B[0]=A[0];if(o~"-v"){for(i=1;i<=A[0];i++){if(!match(A[i],re)) B[k+=1]=A[i];}B[0]=k;return k};
if(o~"-o"){B[B[0]+1]=0;for(i=1;i<=A[0];i++){a=A[i];if(i==k){i=i-B[B[0]+1]+1;B[B[0]+1]=k;k=B[0]+2;
while(i<=B[B[0]+1]){B[i++]=B[k];delete B[k++];}i=B[B[0]+1];k=i;B[B[0]+1]=0;}while(match(a,re)){
if(i>k){B[k+=1]=substr(a,RSTART,RLENGTH);}else{B[B[0]+1+(B[B[0]+1]+=1)]=substr(a,RSTART,RLENGTH);
k++}a=substr(a,RSTART+RLENGTH)}}if(i<k){i=k-i;k=B[0]+1;B[0]=i+B[B[0]+1];while(i<B[0])B[i+=1]=B[k+=1];
while(i<k)delete B[i+=1];}return B[0]}for(i=1;i<=A[0];i++){if(match(A[i],re))B[k+=1]=A[i];}B[0]=k;return k;
}
これ以上削れるところ無いかな? 
高速化+サイズ優先で、変数はできるだけ使う数を少なくとの条件で

709:デフォルトの名無しさん
12/08/22 09:51:11.01 .net
>>708
その3つの条件の優先度がわからんな。

結構同じ部分式があるので変数に入れた方が変数は増えるけど短くなるし
場合によっては速度も速いとかありそうだけどどうなん?

例えばB[0]は特別な用途っぽいけどxとか1文字変数にしてreturnの直前に
書き戻した方が文字数は稼げる。

あと細かいがhoge+=1より++hogeの方が1文字短いとか、いらない「;」が
残ってるとか詰めが甘いところがまだあるね。

710:デフォルトの名無しさん
12/09/30 22:45:00.64 .net
以下のようなデータの処理について質問いいでしょうか。
$1に経過時間(時刻)、$2に「速度」があれば$3の数値は速度を、$2$3に
「up a」「down a」などとあればその時刻での行動を示します。

このデータからup、downの場所を求めたいと思います。
つまり、下の例で移動開始からの距離3でup a、距離3.5でup b、という具合です。
経過時間と速度から場所を計算するだけですが。速度を変更するタイミング・
回数は不定、速度データと行動データはともに経過時間順に記録されています。
速度変更をどう扱えばいいのか、ちょっと頭が回りません。

---元データ例---
0 速度 10
50 速度 20
200 速度 25
30 up a
35 up b
40 down a
40 down b
50 up a
70 down a
200 up c
250 down c

---処理後---
3 up a
3.5 up b
4 down a
4 down b
5 up a
6 down a
12.5 up c
14.5 down c

711:デフォルトの名無しさん
12/10/01 11:28:30.42 .net
疑問を提示。
$1が常に時刻で$2が速度のときの$3が速度なら、
30 up aのときに30 * 10で300 up aになるんじゃないだろうか。
同じように、70 down aのときに50 * 10 + (70 - 50) * 20で900 down aになるんじゃないだろうか。

$3が速度(単位時間当たりの移動量)ではなく単位移動量当たりの所要時間なのであれば、
30 up aで30 / 10 = 3、70 down aで50 / 10 + (70 - 50) / 20 = 6になるんだけどね。

712:デフォルトの名無しさん
12/10/01 13:21:34.21 .net
実装してみた。速度が途中に出てきてもいいようにposを毎回計算するから効率悪いけど。
--
BEGIN {
sCount = 0;
}
$2 == "speed" {
sTime[sCount] = $1;
sSpeed[sCount] = $3;
++sCount;
next;
}
{
pos = 0;
for (ic = 1; ic < sCount; ++ic) {
if (sTime[ic] > $1) break;
pos += (sTime[ic] - sTime[ic - 1]) / sSpeed[ic - 1];
}
pos += ($1 - sTime[ic - 1]) / sSpeed[ic - 1];
print pos, $2, $3;
}

713:デフォルトの名無しさん
12/10/01 20:30:33.48 .net
>>711
すみません、前者ですね。なんだろう、恥ずかしい。

>>712
なので、アクション部の / を * に変えればよさそうです。

お二方、ありがとうございます。

714:デフォルトの名無しさん
12/12/13 11:40:43.98 .net
awkにかわる同等のものあります?

715:デフォルトの名無しさん
12/12/13 13:08:08.26 .net
python

716:デフォルトの名無しさん
12/12/13 13:13:55.85 .net
>>715
awkみたいに使い勝手いいのかな?

717:デフォルトの名無しさん
12/12/13 13:18:24.65 .net
良いですよ

718:デフォルトの名無しさん
12/12/13 13:24:31.23 .net
>>717
ありがとす。勉強してみます

719:デフォルトの名無しさん
12/12/13 14:45:25.45 .net
はい

720:デフォルトの名無しさん
13/02/06 03:49:18.86 .net
“任意の記号”を含んだシェル変数をawkに渡すことは可能ですか?たとえば

[user@localhost ~]$ var='hoge'
[user@localhost ~]$ echo "hoge" | awk -v var="$var" '
$0 ~ var {print var}
END {print var}
'
hoge
hoge

ここで、varに$を含ませると

[user@localhost ~]$ var='hoge$fuga'
[user@localhost ~]$ echo "hoge" | awk -v var="$var" '
$0 ~ var {print var}
END {print var}
'
hoge$fuga

とうまくマッチしませんでした。var自体は渡されているはずですが、何が原因でしょうか?

721:デフォルトの名無しさん
13/02/06 11:23:41.42 .net
>>720
いちぎょうめのひだりがわの var は、ひょうかのさいに
せいきひょうげんへのかたへんかんがおこなわれる。

$0 ~ /hoge$fuga/ {print "hoge$fuga"}
END {print "hoge$fuga"}

めたもじとなってしまうものは、じぜんあるいはこーどのなかで
えすけーぷするひつようがある。

722:デフォルトの名無しさん
13/02/06 11:29:22.31 .net
~(チルダ)の右辺は正規表現として解釈されるから、"hoge" ~ /hoge$fuga/ でマッチするわけがない。
逆に寧ろ、"hoge$fuga" ~ /hoge/ ならマッチする。

723:デフォルトの名無しさん
13/02/06 11:33:09.61 .net
>>720
>721も>722もどちらも原因。やりたいことをよく整理しよう。

724:720
13/02/06 15:09:21.72 .net
すいません、echo "hoge"ではなくecho "$var"でした。
ただ、結果は>>720と同じです。

要は入力ファイル内の「メタ文字込みの任意の文字列」を、別の「メタ文字と改行込みの任意の文字列」で置換する、
というのをメタ文字のエスケープ等の面倒な処理をせずにサクッとやりたいのですが、できますか?

725:デフォルトの名無しさん
13/02/07 05:01:43.19 .net
ムリ

予め「メタ文字と言っても $ しか出てこない」とか判ってるなら大したこと無いけど
一般化すればするほど面倒になる

726:720
13/02/07 22:14:56.21 .net
>>725
やはりそうですか。
今までこういった処理はsedでしこしこエスケープしてやってたんですが、いい加減面倒になったので、
たとえばfgrepみたいに正規表現をオフにして処理する方法はないかと探しているんですが、
awkでは無理ですか・・・。

727:デフォルトの名無しさん
13/02/08 11:20:14.98 .net
>>726
単に一致なら正規表現なんか使わずに比較すればいいじゃん。
fgrepで事が足りるのならawkからfgrepを起動すればいいじゃん。

728:デフォルトの名無しさん
13/02/08 19:27:47.04 .net
>>726
fgrepなら index()関数じゃないの?

729:720
13/02/09 15:32:27.55 .net
>>727
>単に一致なら正規表現なんか使わずに比較すればいいじゃん。
意味が分からないんですが、awk上の話ですよね?

>>728
index()の引数は文字列だから、これをうまく使えば目的の処理ができる・・・のかな?

でもなんかawkでごちょごちょやるより、メタ文字をエスケープする前処理をかますなり
何なりしたほうが素直な気がしてきた・・・。たとえばこんな感じで

$ var='hoge$fuga'
$ var2=$( echo "$var" | sed 's/\$/\\\\$/g' ) ←エスケープ処理
$ echo "$var" | awk -v var="$var2" '
$0 ~ var {print var}
END {print var}
'
hoge\$fuga
hoge\$fuga

730:デフォルトの名無しさん
13/02/09 17:49:52.25 .net
/bin/shでごちょごちょやるのが好みなら、awkもfgrepも使わず、case文でやりゃいいんじゃないの。

731:デフォルトの名無しさん
13/02/09 21:34:09.39 .net
>>729
文字列の比較は等号でできるって認識はないの?

732:デフォルトの名無しさん
13/02/10 14:31:49.57 .net
>729
いや、その方法でも結局 ' はエスケープが必要でしょ。
ダイレクトにシェル変数に入れる方法か、
ファイルなどに吐き出しておく方法の方が安定。
まぁそれでも改行とか制御文字入れられるともにょる場合があるけどな。

733:デフォルトの名無しさん
13/02/11 20:15:01.17 .net
そこまでめんどくさくなったらperlとかrubyとか使った方が楽だぞw

734:デフォルトの名無しさん
13/02/11 22:46:25.57 .net
何で gawk -f とか使わずワンライナーに拘るのかねぇ

735:デフォルトの名無しさん
13/02/12 22:00:38.07 .net
>>732
中韓ファイルを作るのは情弱の仕事(ドヤ顔
>>734
ワンライナーディスってんの?

736:デフォルトの名無しさん
13/03/11 10:05:12.56 .net
#
# text converter ( Mac to MS-DOS on Windos/MS-DOS machine)
# convert CR to CR+LF
#
BEGIN{ RS = "\r" }
{ print }

737:デフォルトの名無しさん
13/03/15 08:05:25.28 .net
#
# Line(行数)を数える
#

END { FNR }

738:デフォルトの名無しさん
13/03/20 19:07:17.00 .net
# text to html converter
# usage: awk -f txt2htm.awk infile1.txt > outfile2.html

BEGIN{
print("<html>"); print("<head>")
print("<titile> My favorite URLs </titile>")
print("</head>"); print("<h1> </h1>"); print("<body>");
}

/^[:space:]*http/ { print "<A HREF=\""$1"\">"$1"</A><BR>"}

END{
print("</body>")
print("</html>")
}

739:UNIX(LF) to DOS(CR+LF) conversion
13/03/21 21:15:00.86 .net
awk 1 infile1 > outfile2.txt

740:デフォルトの名無しさん
13/03/21 22:10:08.07 .net
# awk -f add.awk
BEGIN {
  s1 = "323524855"
  s2 = "4972560"

  reverse(a2, s2)
  size = reverse(a1, s1) # s1 > s2
  carry = 0

  for(k = 1; k <= size; k++) { # s1 > s2
    d = a1[k] + a2[k] + carry
    if(d >= 10) {
      e[k] = d - 10
      carry = 1
    } else {
      e[k] = d
      carry = 0
    }
  }

  if(carry == 1) {
    e[k] = 1
    size = k
  }

  g = produce_string(e, size)
  printf("%s + %s = %s\n", s1, s2, g)
  printf("%f\n", s1 + s2)
  exit
}

741:デフォルトの名無しさん
13/03/21 22:11:11.39 .net
# >>740のつづき
function reverse(a, s, k, i) {
  k = 1;
  size = length(s)
  for(i = size; i >= 1; i--) {
    a[k++] = substr(s, i, 1)
  }

  return size
}
function produce_string(a, size, i) {
  g = ""
  for(i = size; i >= 1; i--) {
    g = g a[i]
  }

  return g
}

742:デフォルトの名無しさん
13/03/21 22:12:57.08 .net
function produce_string(a, size, g, i) {

743:grepをawkで
13/03/22 13:32:02.74 .net
# usage: awk -f grep.awk char1 file1 file2

BEGIN{
pattern = ARGV[1]
ARGV[1] = ""
}
$0 ~ pattern {print($0" File name=" FILENAME)}

744:デフォルトの名無しさん
13/11/30 12:16:25.95 .net
$ echo 10 20 30 | awk '{for(i=0;i<4;)print _$++i}'
10
20
30

_$++iでも$++iでもどちらでもいけるのですが、アンダースコアが付いて何故大丈夫なのでしょうか?

745:デフォルトの名無しさん
13/11/30 16:04:55.55 .net
すいません、わかりました
空の変数_と$++iの結果が一緒になってただけなんですね

746:デフォルトの名無しさん
13/11/30 20:37:58.81 .net
単に式を並べると文字列連結になる、の罠か

747:デフォルトの名無しさん
14/04/02 00:10:13.15 T3/5Epfc.net
保守

てか半年近く書き込みが無かったか

748:デフォルトの名無しさん
14/04/19 13:45:38.45 Db2IzPol.net
とあるgawkスクリプトの先頭で
{last_hoge=hoge; hoge=$ 3}
ってやってるんだけど、
hoge=$ 3はhoge=$3の間違い? それともこういう記法がある?

749:デフォルトの名無しさん
14/04/19 14:56:08.53 A73fEYrr.net
>>748
$ は演算子だから、a=b+1をa = b + 1と書くようなものかな。

750:デフォルトの名無しさん
14/04/19 21:10:32.64 Db2IzPol.net
ええー 演算子だったのかあ。衝撃の事実

751:デフォルトの名無しさん
14/04/20 12:36:45.70 SQaIR8ej.net
演算子だから、変数でもいいよ。

752:デフォルトの名無しさん
14/04/20 14:34:12.09 YSeiuWKu.net
式が書けるね。
$ は一番優先順位が高いから、かっこで括らにゃいかんが。

753:デフォルトの名無しさん
14/04/20 15:12:13.25 k3tDznaJ.net
今はじめて知った。haskellの$は演算子だって知ってたけど、awkでも演算子だったんだね。

754:デフォルトの名無しさん
14/10/14 13:37:28.35 cBz5RbAX.net
そして半年近く書き込みが無かった

755:デフォルトの名無しさん
14/10/15 03:28:03.90 SS4U/DMU.net
いやawkスレなんて普段はそんなに話題ないだろ

756:デフォルトの名無しさん
14/10/21 15:46:10.36 TQsAGJgk.net
質問させてください

今ディレクトリ内のファイルの名称とサイズのリストを作りたいと思っています
コマンドとしてはls -lを実行していますがこれをさらにawkにパイプしています
ただしファイル名にスペースが含まれているため以下のような苦肉の策をとっておりますが

ls -l | awk '{print $5 "\t" $9$10$11$12$13$14$15$16$17$18$19}'

10個以上で区切られてる可能性もあるため根本的な対応をしたいと考えていますが
よい案はありますでしょうか

757:デフォルトの名無しさん
14/10/21 17:25:55.68 EsuQiv22.net
# ファイル名に「"」が含まれていたら知らね。
ls -Ql |awk '{split($0, foo, "\x22"); print $5 "\t" foo[2]}'

758:デフォルトの名無しさん
14/10/21 23:41:50.65 stXOK2Vv.net
Qオプションは勉強になった
ls -l|awk '{s=$5;for(i=1;i<9;i++)$i="";print s"\t"$0}'

759:名無しさん@そうだ選挙に行こう
14/12/13 17:07:55.12 8LbgKkKk.net
¥034  は ” (半角)
¥035  は # (半角)       でおkですか?

760:名無しさん@そうだ選挙に行こう
14/12/13 18:17:16.35 FQOeA8KF.net
>>759
いいえ違います。

761:デフォルトの名無しさん
14/12/14 00:00:31.34 7YfznIJB.net
どちらも非可読文字ですね。そしてそうなるとスレ違い。
awkと絡むのなら具体的にどうぞ。

762:デフォルトの名無しさん
15/02/03 10:36:52.13 Dvc0nyMp.net
Terastationのファイル・ホルダ名に使うとファイルレプリケーションでエラーが起こる文字があって、それを変換するバッチを生成する時にこのマイナー言語が大活躍した。
約80万件のファイルホルダ名から抽出するのに10分程度だった。


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