この記事は?
awkコマンドを使っている時、条件にファイルの行数を使いたい 場面がありました。しかし、awkコマンドにはファイル行数を表す予約語などありません。その時調べた解決方法を備忘録として残しておきます。awkコマンドの使い方については割愛します。
awkとは?
テキスト処理のためのプログラミング言語およびコマンドラインユーティリティです。テキストデータの「パターンマッチング」と「データ加工」を行うことができます。
LinuxやMacのほとんどで追加インストールなしに使うことができます。
サンプル
aaa
bbb
ccc
ddd
eee
sample.txtファイルの中身は5行
awk -v line_count="$(wc -l < sample.txt)" '{
print $0 line_count;
}' sample.txt
aaa 5
bbb 5
ccc 5
ddd 5
eee 5
実行結果の「5」がsample.txtの行数
サンプルコマンド説明
wcコマンドを使って行数を取得し、それをawkの変数に代入しています。
-v line_count="$(wc -l < sample.txt)"
END ではダメなの?
awkの “END” ブロックを使うと最終行だけ特別な処理を書くことができます。
しかし、通常の行ではある処理を行って、最終行だけはその処理を抑制したいといったケースがあります。そういった場合は”END” ブロックだけでは実現できません。
どうしてawkの標準機能にないんだろ?
awkコマンドそのものにファイルの行数を表す予約語などがあれば嬉しいのですが、そうするとファイルを二度読みしなくてはならないので、そういった機能は組み込まれていないのかなと思いました。
(パイプ処理などでも二度読みは都合が悪そう)
今回紹介した方法以外にもawkのファイルの行数を取得する方法があると思いますので教えていただけると幸いです。