awk(nawk)

[機能]

  ファイルの中の特定のパターンを探して処理します.以下の説明においては,nawk について説明します

[形式]
	nawk [-F re] -f program-file [file-list]
	nawk [-F re] program [file-list]
		-F re           : 入力区切り文字を正規表現 re とします
		-f program-file : program-file で指定されたファイルを nawk に対するプ
		                  ログラムとして実行します
		file-list       : nawk が対象とするファイルのリスト
		program         : nawk の命令からなるプログラム(文字列.「 ' 」で囲
		                  む必要があります)

	nawk のプログラムはパターンとそれに対応する動作が書かれた以下の様な行
	で成り立っています.

		パターン {動作}

	1)パターン

		パターンとしては,正規表現をスラッシュ( / )で囲んだものが使用さ
		れます.この場合,入力された行の中に適合する文字列が存在すれば,
		その行に対して指定された動作が実行されます.また,特定のフィール
		ドやプログラムで使用している変数と,正規表現との関係を調べる関係
		演算子を使用できます.関係演算しとしては以下のものを使用できます.
			~,<,<=,==,!=,>=,>
		なお,それらを論理演算子 ( ||, && ) で結合することも可能です.入力処理
		開始時と終了時の処理を記述するために,BEGIN と END という特別なパタ
		ーンが用意されています.

	2)動作

		パターンの適合が起こった時に行われる動作を記述します.この処理を
		記述するために,以下の様な nawk 独自の組み込み変数や関数を使用でき
		ます.

			変数  NR       : 現在処理しているレコード(行)番号
			      $0       : 現在処理しているレコード全体
			      NF       : レコードに含まれているフィールドの数
			      $1~#n   : 各フィールドの内容
			      FS       : 入力フィールドの区切り記号(通常,ブランク)
			      OFS      : 出力フィールドの区切り記号(通常,ブランク)
			      RS       : 入力レコードの区切り記号(通常,改行)
			      ORS      : 出力レコードの区切り記号(通常,改行)
			      FILENAME : ファイル名
			      ARGC     : コマンド行の引き数の数
			      ARGV     : コマンド行の引き数配列

			関数  cos(expr)        : 余弦
			      exp(expr)        : 指数関数
			      getline          : 次の入力行を読み,$0 にセットします
			      getline x        : 次の入力行を変数 x に読み込みます
			      index(s1,s2)     : s1 の中の s2 の位置(存在しなければ 0 )
			      int(expr)        : 整数部(切り捨て)
			      length(s)        : 文字列の長さ
			      log(expr)        : 自然対数
			      sin(expr)        : 正弦
			      split(s,a,c)     : s を文字 c によって,a[1]...a[n] に分割し
			                         n を返す
			      sprintf(fmt,...) : fmt に従って ... をフォーマットする
			      substr(s,m,n)    : s の m 番目から n 文字文取り出す

		さらに,以下の様な制御文も使用できます(複数 statement を使用する
		時は,「 { 」と「 } 」を使用).

			if (condition)
				statement1
			else
				statement2

			for (expresion1; condition; expresion2)
				statement

			while (condition)
				statement
		
[使用例]

  1. 行番号と各行の内容を出力します
    	nawk '{print NR,$0}' test.c
    			
  2. 1 と同じですが,行番号を 4 桁で出力します.
    	nawk '{printf"%4d %s\n",NR,$0}' test.c
    			
  3. 文字列「 include 」を含んだ行を出力します
    	nawk '/include/{print}' test.c
    			
  4. 20 文字より長い行を出力します
    	nawk 'length($0) > 20 {print}' test.c
    			
  5. いずれも,入力区切り記号を「 / 」に変更し,パス名を除いたファイル名だけを出力します.
    	find . -name "*.c" -print | nawk 'BEGIN {FS="/"} {print $NF}'
    	find . -name "*.c" -print | nawk -F / '{print $NF}'
    			
  6. ファイルをすべて読み込んだ後,逆順に出力します.
    	nawk ' {line[NR] = $0}\
    		END {for (i=NR; i>0; i--) print line[i]}' test.c
    			
  7. 1 行の平均文字数を出力します.
    	nawk 'BEGIN {s = 0}\
    			{s = s + length($0)}\
    		END	 {print s/NR}' test.c
    			
    このように長いプログラムの場合は,以下の内容
    	BEGIN {s = 0}
    			{s = s + length($0)}
    		END	 {print s/NR}
    			
    をもつファイル temp を作成した後,
    	nawk -f temp test.c
    			
    を実行しても同じ結果が得られます.

  8. シェルとのやり取り.例えば,「 field n m 」という n 番目と m 番目のフィールドを逆順に出力するプログラムを書きたい時は,
    	nawk '{print $'$2', $'$1'}'
    			
    のようにして,1 番目および 2 番目の引き数を引き渡します.

[参照]

sed

菅沼ホーム 本文目次 演習問題解答例 付録目次 索引