CodeGym /コース /Docker SELF /`awk`を使ったデータフォーマット

`awk`を使ったデータフォーマット

Docker SELF
レベル 8 , レッスン 2
使用可能

awkを使ったデータフォーマット

1. awk との出会い

awk はテキストデータ処理のための強力なユーティリティだよ。テキストファイルをテーブルとして想像するなら、行は「行」(当たり前だけど)、列はスペースで区切られたデータだよね。その場合、awk は最高の友達になるよ。列をすばやく選択したり、行をフィルターしたり、データをフォーマットしたり、さらには算術演算もできちゃう。

名前はその作成者である Alfred Aho、Peter Weinberger、そして Brian Kernighan(そう、C言語の開発にも関わった Kernighan ね)に由来しているよ。

awk の主なコンセプトは、テンプレートとアクションを使ってデータを処理することで、ちょっとしたプログラミング言語のようなものなんだ。

awk の構文

基本的なコマンドの構文は以下の通り:

awk 'テンプレート {アクション}' ファイル
  • テンプレート — ファイル内の各行に対してチェックされる条件。
  • アクション — テンプレートに一致する行に適用される操作。
  • テンプレートがない場合、アクションはすべての行に対して実行される。

例:

awk '{print $1}' data.txt

このコマンドはファイル data.txt の各行の最初の列 ($1) を表示するよ。


2. awkの基本機能

1. 列の選択

awkを使う最も簡単な方法は、ファイルから1つまたは複数の列を選択することだよ。フィールドは$nとして指定されてて、ここでnは列の番号(1から始まる)だよ。

例:

最初と3番目の列を表示する:

awk '{print $1, $3}' data.txt

例えば、ファイルdata.txtが以下のようになってるとする:

John 25 Engineer
Jane 30 Designer
Mike 28 Developer

結果:

John Engineer
Jane Designer
Mike Developer

2. 条件付き行処理

条件を使用して、特定の条件に一致する行のみを処理することができるよ。

例:

2番目の列の値が27より大きい行を表示:

awk '$2 > 27 {print $1, $2}' data.txt

結果:

Jane 30
Mike 28

3. 算術演算

awkは算術演算を実行できるよ。これにより、データをその場で計算することが可能だよ。

例:

2番目の列の値に10を追加:

awk '{print $1, $2+10}' data.txt

結果:

John 35
Jane 40
Mike 38

4. 行のカウント

awkは自動的に処理された行数を知っているよ。この情報はNR(Number of Records)変数に格納されているんだ。

例:

ファイル内の行数をカウント:

awk 'END {print NR}' data.txt

結果:

3

3. 拡張機能

1. 出力フォーマット化

awkは、printf関数を使った強力なフォーマット化出力をサポートしているよ。これはC言語のprintf関数と同じだよ。

例:

データを整列させて出力する:

awk '{printf "%-10s %-5s %-10s\n", $1, $2, $3}' data.txt

結果:

John       25    Engineer  
Jane       30    Designer  
Mike       28    Developer 

2. 変数

データを保存して作業を簡単にするために変数を使えるよ。

例:

2列目の合計を計算する:

awk '{sum += $2} END {print "合計年齢:", sum}' data.txt

結果:

合計年齢: 83

3. 正規表現

awkは、文字列を検索するための正規表現をサポートしているよ。

例:

最初の列に文字Jが含まれる行を出力する:

awk '/J/ {print $0}' data.txt

結果:

John 25 Engineer
Jane 30 Designer

4. 実践例

1. システムログの分析

例えば、システムログファイル/var/log/syslogがあって、どのプロセスが最も頻繁に言及されているかを知りたいとしよう。

コマンド:

cat /var/log/syslog | awk '{print $5}' | sort | uniq -c | sort -nr | head -10

このコマンドがすること:

  1. cat /var/log/syslog — ファイルの内容を読む。
  2. awk '{print $5}' — 5列目(プロセス名)を抽出する。
  3. sort — 行をアルファベット順にソートする。
  4. uniq -c — ユニークな行を数える。
  5. sort -nr — 数値の降順でソートする。
  6. head -10 — 上位10のプロセスを表示する。

2. 給与レポートの準備

以下のようなファイル salaries.txt があるとしよう:

John 25 4000
Jane 30 5000
Mike 28 4500

課題:

給与を10%増やして、最終レポートを表示する。

解決方法:

awk '{new_salary = $3 * 1.1; printf "%-10s %-5s %-10.2f\n", $1, $2, new_salary}' salaries.txt

結果:

John       25    4400.00
Jane       30    5500.00
Mike       28    4950.00

5. awk作業時の一般的なエラー

区切り文字に関する問題

デフォルトでは、awkはスペースまたはタブを区切り文字として使用するよ。データが別の区切り文字(例えば、カンマやコロンなど)で区切られている場合は、オプション-Fを使って指定する必要があるんだ。

例:

ファイルdata.csv:

John,25,Engineer
Jane,30,Designer
Mike,28,Developer

CSVでの作業コマンド:

awk -F',' '{print $1, $3}' data.csv

結果:

John Engineer
Jane Designer
Mike Developer

フォーマットのエラーでフィールドをスキップ

時々、行に予期しないスペースが含まれたり、列が欠けていたりすることがあるね。これがエラーを引き起こす原因になる。作業を始める前にデータを確認するのが大事だよ。

実践的な応用

今、awkを使ってシステムログを解析したり、給与データを処理したり、レポートを作成したりできるようになったよ。このスキルは、大規模なデータベース、CSVファイル、ログファイルを扱う際にとても役立つ。DevOpsで働いているなら、awkを使ったシステムログ分析が君のスーパーパワーになる。そして、もし開発者なら、端末上で素早くデータを操作する素晴らしい方法になるよ。

さらにawkを深く学びたいなら、公式のGNU Awkドキュメントをチェックしてみてね。これで君のデータも完全にコントロールできるはず!

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION