0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

初学者でもawkの使い方が知りたい!

Posted at

はじめに

LinuxやC言語を中心に学習中の42tokyoの生徒です。
Linuxコマンドを学習している際にawkの使い方がいまいち理解できなかったので、改めて調べてみました。

前提

awkについて、網羅的に理解できる内容にはなっていないこと最初にお断りをしておきます。私のような初学者が、少しでもawkについて理解を深めるための参考になればと思い調べたことを記載しております。

awkの基本形

<説明>
コマンドラインもしくは入力のファイルパスからテキストを受け取り、行ごとに処理される。パターンにマッチした行はアクションに記載の処理が実行される。

awk 'パターン { アクション }' [入力のファイルパス]

よく上記のように書かれていますが、これをみてもよく分かりませんよね。(私がそうでした。)以下に例を載せて記載しておりますので、徐々に分かるようになると思います。

パターン

awkの”パターン”には4種類あります。それぞれの使い方例について以下に記載いたします。
①評価式
②正規表現
③BEGIN
④END

事前準備① sample.txtを用意

以下、説明しやすいように、「sample.txt」を用意しました。
sample.txt

apple 1
banana 2
grape 3

事前準備② $1、$2、$0

$1は各行の1列目、$2は各行の2列目、$0は全ての列を表します。

例1

awk '{print $1}
-出力結果- 
apple
banana
grape

例2

awk '{print $2}
-出力結果- 
1
2
3

例3

awk '{print $0}
-出力結果- 
apple 1
banana 2
grape 3

パターン①:評価式

条件に合致した行が処理されます。

awk '$1 == "apple" {print $2}' sample.txt
-出力結果- 
1

パターン②:正規表現

正規表現に合致した行が処理されます。

awk '$1 ~ /apple/ {print $0}' sample.txt
-出力結果- 
apple 1

<補足>
~: 正規表現でマッチするかどうかを判定する演算子
/正規表現/: 正規表現をスラッシュで囲む

パターン③:BEGIN

awkの処理が開始される前に一度だけ実行されます。

awk 'BEGIN { count = 0 } { count++ } END { print "行数:", count }' sample.txt
-出力結果- 
4

パターン④:END

awkの処理が終わる際に一度だけ実行されます。

awk '{print $0} END { print "完了" }' sample.txt
-出力結果-
apple 1
banana 2
grape 3
完了

awkの組み込み変数

awkと一緒に利用できる変数が用意されています。

レコード関連の変数

変数 意味
NR 処理中の現在のレコード番号(行番号)。1から始まる
FNR ファイルごとのレコード番号。複数のファイルを処理する際に、各ファイルの先頭からカウントが再開される。
NF 現在のレコードのフィールド数(列数)

ファイル関連の変数

変数 意味
FILENAME 現在処理しているファイルの名前
ARGC コマンドライン引数の個数
ARGV コマンドライン引数の配列

区切り文字関連の変数

変数 意味
FS フィールドの区切り文字(デフォルトはスペースやタブ)
OFS 出力時のフィールド区切り文字
RS レコードの区切り文字(デフォルトは改行)
ORS 出力時のレコード区切り文字

その他変数

変数 意味
CONVFMT 数値を文字列に変換する際のフォーマット(デフォルトは %.6g)
ENVIRON 環境変数を配列として格納したもの。ENVIRON["PATH"] のようにアクセス可能
OFMT 数値を出力する際のフォーマット(デフォルトは %.6g)
IGNORECASE 大文字小文字を区別しない場合は1を設定する(デフォルトは0で、区別あり)

awkのオプション

-F '文字列'

フィールド区切り文字を指定するオプション。デフォルトはスペースやタブだが、カンマやコロンなど任意の文字列に変更可能。

使用例

awk -F ',' '{print $1, $2}' file.txt  # カンマ区切りのCSVファイルを読み取る

-v 変数名=値

スクリプト内で使う変数を外部から設定するオプション。awk のスクリプト内で使用する変数を直接渡せます。

使用例

awk -v threshold=10 '{if ($1 > threshold) print $1}' file.txt

-f ファイル名

実行する awk のスクリプトを別ファイルに保存して、ファイルを指定して実行するオプション。長いスクリプトや再利用可能なスクリプトを書く際に便利です!

使用例

awk -f script.awk sample.txt

※通常 .awk 拡張子を付けるのが一般的。拡張子自体は必須ではないので、script.txt でも動作はしますが、.awk を使うことが推奨とのことです。

終わりに

少しでも参考になれば嬉しいです。今後もLinux、C言語の学習に邁進いたします。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?