awkで行数表示

2016年8月1日

行番号・行数

前回はawkを使って、1文字単位で文字列を加工する方法を紹介しました。

今回はawkを使ってテキストファイルに行番号を振ったり、行数を調べたりできる簡単なプログラムを作ってみましょう。

各行に行番号を付ける

awkの特殊な変数 NR

NR とは Number of Record(レコードの数)の略です。現在処理しているレコード(行)が何番目のものかがこの変数に記憶されています。

以前紹介した NF は「レコードに含まれるフィールドの数」でしたが、NR は「ファイルに含まれるレコードの数」という意味ではなく、「現在処理しているレコードが何番目か」という意味なので NF のときとは意味が異なります。ご注意ください。

さて、この変数 NR を使ってテキストファイルに行番号をつけることが出来ます。以下のテキストファイル(test6.txt)を例に、行番号をつけてみます。

test6.txt

    こんにちは
    今日はawkを勉強するのにぴったりな
    とてもいい天気ですね!

    おしまい

以下のコマンドで行番号を振ることが出来ます。

    awk '{print NR, $0}' test6.txt

実行結果

1 こんにちは
2 今日はawkを勉強するのにぴったりな
3 とてもいい天気ですね!
4
5 おしまい

ファイルの全行数を調べる

NFをつかって行番号だけ表示する場合は次のようにすればいいですね。

    awk '{print NR}' test6.txt

実行結果

1
2
3
4
5

行数の少ないファイルならこれでもファイルの行数が調べられますが、ちょっと無理やりです。

欲しいのは最後の 5 だけなので、これだけ表示するようにできれば、何万行とあるファイルの行数も調べることが出来ます。

END{ } を使う

awk には END{アクション} という特殊パターンがあり、これはファイルの最終行を処理し終わったら実行したいコマンドを設定できるものです。

使い方は、いつも書いている { 〜 } の直前に END と書くだけです。これで、最後の行の処理が終わった時だけ括弧内のコマンドが実行されます。

  awk 'END{print NR}' text6.txt

実行結果

5

先ほどの例では、すべてのレコード処理ごとに「print NR」が実行されていましたが、ENDを指定したことにより、最後の行の処理終了時だけ NR に記録された値を表示するようになりました。

これで、テキストファイルの行数を簡単に調べることができるようになりました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です