作者: davi
日時: 2008/2/29(08:23)
みなさん  <  こん??は でび です

ええと、awkネタはabcで良いんでしたっけ?

いつのまにかgawk3.16がっ!と、awk再入門してみましたら、
gawkのバージョンは上がっても、私の頭の方のバージョンは
ちっとも上がっていませんでした。

どなたか、ちと教えてください。

以下のようなリストがあって、

----- book_list.txt -----
ビアドのローマの女たち,著者,A.バージェス
ビアドのローマの女たち,出版社,サンリオSF
ビアドのローマの女たち,出版年,1980
永遠へのパスポート,著者,J.G.バラード
永遠へのパスポート,訳者,永井淳 訳
永遠へのパスポート,出版社,創元推理文庫
永遠へのパスポート,出版年,1970
火星の黄金仮面,著者,O.A.クライン
火星の黄金仮面,出版社,創元推理文庫
火星の黄金仮面,出版年,1978
虚空の眼,著者,フィリップ・K・ディック
虚空の眼,訳者,大瀧啓裕 訳
虚空の眼,出版社,サンリオSF
夢みる宝石,著者,シオドア・スタージョン
夢みる宝石,出版社,ハヤカワ文庫
夢みる宝石,出版年,1979
創世記機械,訳者,山高昭 訳
創世記機械,出版社,創元推理文庫
創世記機械,出版年,1981
--------------------------

※フィールドによっては、1バイトスペースがある場合アリ、とします。

リストの全体を眺めた感じだと、どうも、最大項目数は
「題名,著者,訳者,出版社,出版年」の5つらしい・・・と。

で、出力を、本当は

----- out_list.txt -----
ビアドのローマの女たち,A.バージェス,,サンリオSF,1980
永遠へのパスポート,J.G.バラード,永井淳 訳,創元推理文庫,1970
火星の黄金仮面,O.A.クライン,,創元推理文庫,1978
虚空の眼,フィリップ・K・ディック,大瀧啓裕 訳,サンリオSF,
夢みる宝石,シオドア・スタージョン,,ハヤカワ文庫,1979
創世記機械,,山高昭 訳,創元推理文庫,1981
--------------------------

としたいのです。
そこで、以下のようにしたんですが、

------ book2csv.awk ------

BEGIN {
    FS = ",";
}

{
 # 上書きして初期化
    author = "";
    translator = "";
    publisher = "";
    year  = "";

    title = $1;

    while ( $1 == title ) {
        if ( $2 == "著者" ) { author = $3; }
        if ( $2 == "訳者" ) { translator = $3; }
        if ( $2 == "出版社" ) { publisher = $3; }
        if ( $2 == "出版年" ) { year = $3; }

        if( getline == 0 ) { break } else { getline }
    }
    printf( "%s,%s,%s,%s,%s,\n", title,author,translator,publisher,year );
}
------------------------

これだと、入るべきフィールドが正しくないレコードに紛れ込んだり、
ずれたりするようです。

なんか根本的に間違っているような気がするんですが、頭ワヤワヤに
なったので、どなたか、添削おながいします。

 # getlineのところは、なんかwhileを上手く抜けられないので
 # 苦し紛れに付加したものです。
 # スコープってものの捉え方がだめなんだろうな、という予感は
 # しているのですが…。

でび  http://davi.txt-nifty.com/1984/