awkの区切り文字を指定するFオプション|複数の区切り文字指定も解説

シェル/bash プログラミング

こんにちは。

普段はIT業界についてのブログを執筆してるエンジニアです。
» 参考:プログラマーの年収は200万円以下です【IT業界の残酷な成功法則】

今回は、linuxについての解説記事です。

awkコマンドで区切り文字を指定したい人

awkコマンドで区切り文字を指定したい人
「csvやjsonなど様々なフォーマットのデータの処理にawkコマンドを使いたいです。そのため、awkコマンドで区切り位置を指定する方法を教えてください。」

こんな悩みを解決します。

この記事を書いている私はIT業界歴12年、うちサーバエンジニア歴6年、年収1,000万円ちょっとの金融系エンジニアです。IRIXやSolarisなどのUnixやmac、Linuxなど様々なUNIX系環境を扱ってきました。

これまでの経験を踏まえ、コマンドの解説に留まらず実務視点で利用方法を記事にしました。お役にたちましたら幸いです。

本記事の内容

1.-Fオプションでawkの区切り文字を指定する

本記事では次のような様々な区切り文字を識別し、カラムごとに処理を行う方法を解説します。

  • スペース区切り・・・A B C D E
  • TAB区切り・・・A B C D E
  • カンマ区切り・・・A,B,C,D,E
  • スラッシュ区切り・・・A/B/C/D/E
  • 文字列での区切り・・・A or B or C or D or E
  • シングルクォートとカンマでの区切り・・・’A’, ‘B’, ‘C’, ‘D’, ‘E’

区切り文字を指定してawkを使用する場合の構文は以下の通りです。

awk -F《区切り文字》 《スクリプト》

2.-F未指定の場合、デフォルトの区切り文字は?

-Fで区切り文字を指定していない場合、スペースとTABを区切り文字として識別します。

スペース区切り

以下の例では、スペースの前後(前:abc,後:def)を区切って$1,$2に値を格納してからprint関数で結果を出力します。

echo 'A B C D E' | awk '{print $1,$2,$3,$4,$5}'                                                                   

実行結果は以下の通りです。

A B C D E

TAB区切り

区切り文字をTABに変えても同様の結果となります。

echo 'A	B	C	D	E' | awk '{print $1,$2,$3,$4,$5}'                                                                   

A B C D E

スペースとTABが混在

スペースとTABが混在していても結果は同様です。デフォルトでは、連続したスペースとTABは一つの区切り文字と見なされます。

echo 'A      	B C	  D  	   E' | awk '{print $1,$2,$3,$4,$5}'                                                                   

A B C D E

3.-Fで任意の1文字を区切り文字として指定する

任意の1文字を区切り文字として指定してみます。

カンマ区切り

echo 'abc,def' | awk -F, '{print $1,$2}'

区切り文字がカンマに変わっただけで、先ほどと同じ結果を得られました。

abc def

スラッシュ区切り

echo 'abc/def' | awk -F/ '{print $1,$2}'

これについても同様の結果となります。

abc def

4.-Fで複数の文字を区切り文字として指定する

複数の文字を区切り文字として指定してみます。

構文

awk -F《区切り文字1|区切り文字2》 《スクリプト》

なお、区切り文字は幾つでも指定が可能です。

シングルクォート(‘)またはカンマ(,)で区切る

区切り指定したうえで2カラム目と5カラム目を抽出して出力します。

echo "'dog','cat'" | awk -F"'|," '{print $2,$5}'

実行結果は以下の通りです。

dog cat

複数の文字列で区切る

文字列( or )を区切り文字として指定します

echo "A or B or C or D or E" | awk -F" or " '{print $1,$2,$3,$4,$5}'

実行結果は以下の通りです。

A B C D E

5.【業務視点の悩み】awkで処理するか?EXCELで処理するか?

あるデータを処理する際、awkで処理するかEXCELで処理するか悩むことがあります。

EXCELは視覚的に処理が可能ですが、awkと比べて処理が重く、大量データの処理に向いていません。また扱えるデータ量にも上限があります。

一方でawkは処理が早く大量データの処理に向いていますが、EXCELと異なり視覚的に処理することができないため、サンプリングして検算するなどの配慮が必要です。

どちらが正解ということはありませんので、慣れて使いやすい方を使えば良いと思います。ただしawkでも手が追えないレベルの大量データの場合は、データベースを活用しましょう。

6.【付録】そもそもawkとは

AWK(オーク)は、プログラミング言語の一つで、テキストファイル、特に空白類(スペースの他、タブなど)やカンマなどで区切られたデータファイルの処理を念頭に置いたテキスト処理に用いられますが、一般的なプログラミングに用いることも可能です(Wikipediaより)。
awkやテキストを行単位で処理し、結果を出力するための汎用性の高いコマンドです。

参考

awkについてより詳しく知りたい方は以下のサイトを参考にしていただくと詳しく理解することができます。
初心者用awk講座(外部サイト)

今回は以上です。awkはテキスト処理に向いており、エクセルに近い処理を行うことができます。awkのメリットはエクセルに比べて自動化しやすく、大量に処理を行う際やちょっとした処理をサクッと行いたい場合、慣れている方ならばエクセルよりも非常に早く仕事を完遂することができると思います。参考になりましたら幸いです。

Blog TOP  Linuxコマンドを勉強したい人向け|Linuxの使い方 記事まとめ

Linux&Linuxコマンドを勉強したい人向けの記事もくじ

用語解説・技術一般

  "UNIXとLINUX"の違いについて解説します
  CUIとGUIの違い・特徴について解説します

サーバリソースを確認するコマンドの使い方

  【Linux】CPU使用率を確認する3つの方法を解説します
  【Linux】topコマンドで,CPU消費の原因を特定する方法
  【Linux】ps実行時に-efオプションを付ける理由について
  【Linux】メモリ使用率を確認する|容量・空きの確認も
  【Linux】ディスク容量を確認する|ディスク容量監視も

ファイル操作に関するコマンドの使い方

  【Linux】ファイルの行数をカウントする方法を解説
  【Linux】文字コード変換ならiconvコマンド1択です
  【Linux】/dev/nullを、エンジニアが使う2つの目的
  【Linux】findのexecオプションの使い方とその注意点
  【Linux】findの結果から圧縮ファイルを作るコマンド
  【Linux】hostsの場所はどこ?→/etc/hostsにあります
  【Linux】touchコマンドで,時刻更新&空ファイル作成

Linux管理者用コマンドの使い方

  【Linux】再起動コマンド(shutdown)の使い方と注意点

よく使う便利なコマンドの使い方

  【Linux】改行なしでechoコマンドを使う時の -nオプション
  【Linux】sleepコマンドの使用例と注意点について解説する
  【Linux】rmコマンドでディレクトリを削除する方法を解説
  【Linux】ファイルを削除するコマンド2選【rm以外もあり】
  【Linux】awkの区切り文字を指定する,-Fオプションを解説
  【Linux】sedで文字列の置換をするeオプションを解説する
  【Linux】dateコマンドのフォーマットとその便利な使い方
  【Linux】大文字から小文字に変換する方法【小文字から大文字も】

シェルの便利機能

  【Linux】コマンド履歴を検索する【Ctrl+r】