AWKの組込変数NRとNF

AWKによって分割された行のデータをそれぞれをフィールドと言 います。またこのフィールドのひと固まりである各行をレコードと 呼びます。この文庫のデータの場合、一冊の文庫全体のデータで一つのレコー ドをつくり、書名などの項目がフィールドになります。

AWKにはいくつか組込変数があって、そのうちのNRは幾つめのレ コードを処理しているか、NFは処理中のレコードにいくつのフィールドがある かを記憶してます。このNRを使って行番号を追加できます。

    % gawk '{print NR, $1, $3;}' miyabe.new
    1 書名 発行
    2 火車 98/02/01
    3 かまいたち 96/09/01
    4 蒲生邸事件 96/10/10
         (省略)

$0はレコード全体、つまり元のデータ行そのものとなりますから、次のよ うにすることで行番号を振ることもできます(cat -n miyabe.newと同じ)。

    % gawk '{print NR, $0;}' miyabe.new
    1 書名  本体価格  発行  発行社  文庫  備考
    2 火車  743  98/02/01  新潮社  新潮文庫 み-22-8  
    3 かまいたち  505  96/09/01  新潮社  新潮文庫 み-22-6  短編集
    4 蒲生邸事件  1650  96/10/10  毎日新聞社  
         (省略)

NRを使って特定の行だけを取出すこともできます。次の例ではNRが3に等しい ところ、つまり3行目だけを取出しています。 {  } で囲まれたプログラム の前に条件式を書いてやればいいのです。

    % gawk 'NR == 3 {print NR, $0;}' miyabe.new
    3 かまいたち  505  96/09/01  新潮社  新潮文庫 み-22-6  短編集
    %

次の例では1行目から3行目を取出します。

    % gawk 'NR <= 3 {print NR, $0;}' miyabe.new
    1 書名  本体価格  発行  発行社  文庫  備考
    2 火車  743  98/02/01  新潮社  新潮文庫 み-22-8  
    3 かまいたち  505  96/09/01  新潮社  新潮文庫 み-22-6  短編集
    %

この条件は、&&や||!を使って、論理和や論理積、否定を 取ることができます。

    % gawk 'NR >4 && NR < 7 {print NR, $0}' miyabe.new
    5 堪忍箱  1456  96/10/30  新人物往来社  
    6 クロスファイア [上・下]  819  98/10/30  光文社  カッパ・ノベルス  
    %

    % gawk 'NR == 2 || NR == 4 {print NR, $0}' miyabe.new
    2 火車  743  98/02/01  新潮社  新潮文庫 み-22-8  
    4 蒲生邸事件  1650  96/10/10  毎日新聞社  
    %

次の例は NR != 1 としても同じになります。

    % gawk '!(NR == 1) {print NR, $0}' miyabe.new|head
    2 火車  743  98/02/01  新潮社  新潮文庫 み-22-8  
    3 かまいたち  505  96/09/01  新潮社  新潮文庫 み-22-6  短編集
    4 蒲生邸事件  1650  96/10/10  毎日新聞社  
    5 堪忍箱  1456  96/10/30  新人物往来社  
         (省略)

NFの使用例はのちほど見ましょう。

OGURISU Osamu
2004-01-15