茨城県つくばみらい市から来ました

プログラマーになるために生きています

補則説明

みなさんちょうやさしい

Blog/2007-4-2 - Rocco の日記
こんなタコの悩みにみなさんありがとうございます。
せめてタコらしく、ちゃんと書いておこうと思いました。

やりたかったこと

A.xmlとB.xmlのデータを結合させたい。
ふたつのファイルにあるデータをテーブルと見立てた場合に、

select
    A.a,
    A.b,
    A.c,
    B.d,
    B.e
from
    A left join B on A.c = B.c

と同等のファイルを吐き出させたい。具体的には、fedoracoreリポジトリの/repodata/comps.xmlにprimary.xmlから拾ったグループ/パッケージの一覧にprimary.xml.gzから取得したサマリを付加した一覧を作っていました。

やったこと

primary.xmlの内容を連想配列に出力するスクリプトcreate_hashtabele.awkを作成し、連想配列のみを作成し、この連想配列とcomps.xmlの内容を突合するcreate_packagelist.awkを作成し、reate_packagelist.awkのBEGIN句に連想配列をコピペして実行していました。

愚痴った

そこで、わざわざ連想配列作成->コピペ->実行という操作が大変カッタルかったものですから

include文とかないのー?チンチン

となったわけです(笑

で。

昨日ご助言をいただいたのでigawkで実行してみたのですがうまくいかず、xargsでも上記のような要求を満たそうとするとスクリプトを書き換えなければならない、というかxargsだと毎回どの行を出力するのか判定させなければならないんじゃないかなぁとか昨夜からうつらうつら考えていて*1、あとで時間が空いてるときに書き直せばいいかと思っていました。が、さきほど

Re:igawk - さいとう (2007年04月02日 18時12分56秒)

motchang さんの「8000行超の連想配列を全部引数にされちゃった」という部分が気になって、ファイルをたくさん読んでいるとか・・・と思ったのですが、単に配列に格納しすぎとかなら、良いのですけど。(良くないって
@include ではなく、gawk -f foo.awk -f bar.awk のように -f で連結するとか、foo.awk と bar.awk をひとつのファイルに連結してみるとか、そのあたりでどう挙動が変化するか気になります。

この書き込みを発見しまして、さすがawkさんできる子です。連想配列が書いてある中間ファイルをBEGIN句にして

gawk -f hashtable.txt -f create_packagelist.awk < comps.xml

と実行してみたら僕の欲しかった出力が得られました!
Roccoさん、ならびにさいとうさん、ありがとうございましたっ!

*1:コメントは携帯のメールに転送されていたんですが、昨夜はさっさと寝てしまったのです