新刊ピックアップ

Excel vs. AWK!? 基礎の知識は長く役に立つ!

この記事を読むのに必要な時間:およそ 1 分

シェル上でちょっと気の利いたことができる気軽なツール

ネットワーク上のリソース活用がサービスにとってもはや当然のものとなり,開発・運用を問わず,エンジニアはこれまで以上にサーバに対する作業が必要になります。今あらためて,Unix/Linuxの基礎知識が求められているのです。AWKをご存じでない方には,シェルコマンドに習熟したサーバ管理現場でログ解析によく使われるこのツールを,ぜひとも身につけて業務に役立てていただきたいと思います。

と,いきなり大上段に構えましたが,AWK自体はそんな仰々しいものではなく,日常のちょっとした作業で役立つ,気軽なシェルコマンド&スクリプト言語です。ここではそういった簡単な例をご紹介しましょう。

プログラムリストの先頭に行番号をふる作業

たとえば,次のようなプログラムを書いたファイル「samplecode」があったとします。

リスト1 samplecode

{
  for (i=1; i<=n; i++) {
    printf("%s-" $i)
  }
  printf ""
}

このプログラムリストの行頭に,3桁の行番号をふりたい場合を考えてみます(たとえば1行目なら「001: {⁠⁠。やり方はいろいろあるでしょうが,ここではExcelでやってみましょう。

Excelでの手順

  • (1)samplecodeのテキストをコピーして,ExcelのB列にペースト
  • (2)ExcelのA1に「1⁠⁠,A2に「2」を入力。この2つのセルを選択し,オートフィル機能を使って連番を入力図1
  • (3)C1に「=CONCATENATE(TEXT(A1, "[<=999]000: "), B1)」を入力して,A1とB1を書式付きで結合
  • (4)C1をC2以降にコピペ
  • (5)C列をテキストファイルにコピペして保存図2

図1 オートフィル機能で連番をふる

図1 オートフィル機能で連番をふる

図2 目的のテキスト完成

図2 目的のテキスト完成

筆者が考え得る限りの最短手順です。行数が多い場合は,⁠2)の手順でExcelの「連続データの作成」機能を使うとよいでしょう(このへんのExcelのコツは弊社刊『たった1日で即戦力になるExcelの教科書』に載っています⁠⁠。

さてそれでは,AWKを使った場合はどうでしょう。シェル上で次のように実行するだけです。

AWKでの手順

(1)gawk '{printf("%03d: %s\n", NR, $0)}' samplecode

結果の出力は次のとおりです。

001: {
002:   for (i=1; i<=n; i++) {
003:     printf("%s-" $i)
004:   }
005:   printf ""
006: }

テキストファイルに保存,というところまでやるにしても,先の1行にファイルへのリダイレクトを付けてあげるだけなので,やはり一発です。

printfの中身が多少呪文めいて見えますが,やっていることは単純です。

第1引数の「"%03d: %s\n"」が出力書式の設定で,%03dで「第2引数のNR(入力レコード番号)を10進数3桁・先頭0付き表示」し,そのあとに「: 」が表示されて,%s\nで「第3引数の$0(入力レコード全体)を文字列として表示して改行」するという指示になります。

サンプルを使って,変えて,気軽にプログラミング

このあたりの詳細は,弊社刊AWK実践入門を読めばすぐに理解できます。昔AWKを使ったことがある方でも,今ではExcelでの作業に慣れてしまって,なんでもExcelでやろうとしていませんか? 今やっているテキスト一括処理の中には,AWKでもっと簡単に行えるものがあるかもしれませんよ?

サンプルスクリプトが豊富に載っている本書で,AWKを楽しみながら自分の手になじんだツールにしてください。