awkコマンドの使い方

awkコマンドの使い方

組込変数 意味 デフォルト値
$0,$1,$2… パイプで渡された値
FS 区切り文字(field separator) 半角スペース
OFS 出力時の区切り文字(output field separator) 半角スペース
RS (record separator) 改行
ORS (output record separator) 改行
$NF 最終フィールド
NR 現在行 1
FNR 現在行 1
FPAT フィールドパターン(fireld pattern)
ENVIRON 環境変数の連想配列

awkコマンドの基本構文

awk '
  BEGIN{
    # 変数初期化など行うBEGINブロック
  }
  {
    # メインブロック
  }
  END{
    # 最後に処理するENDブロック
  }
'

#以降は1行コメントになります。

各ブロックは不要なら省略可能です。

半角スペース区切りの数値をechoして、各々の数値をsummaryした結果を出力します。

sum変数をBEGIN句で初期化し、メインブロックで計算し、ENDブロックで出力します。

$ echo 111,222,333 | awk 'BEGIN{FS=",";sum=0} \
> {sum=$1+$2+$3} \
> END{print sum}'
666

$0,$1,$2…変数

,,…変数

$0,$1,$2…と変数が用意されています。以下のようなイメージです。

awkコマンドの使い方

半角スペース区切りの数値をechoして、その結果をawkで受け取ります。

$ echo 1 2 3 | awk '{print $1}'
1
$ echo 1 2 3 | awk '{print $2}'
2
$ echo 1 2 3 | awk '{print $3}'
3
$ echo 1 2 3 | awk '{print $0}'
1 2 3

FS変数

BEGIN句でFS変数を初期化し、$1,$2などで標準出力します。区切り文字をカンマにして$1を出力します。

$ echo 111,222,333 | awk 'BEGIN{FS=","} {print $1}'
111

OFS変数

OFS変数はアウトプット時のセパレータです。以下では/にしています。

$ echo 111,222,333 | awk 'BEGIN{FS=",";OFS="/"} {print $0,$1,$2,$3}'
111,222,333/111/222/333

RS変数

区切り文字をRS変数で指定します。FS変数と似ていますが、RS変数で区切り文字を指定した場合は、出力は改行で区切られて出力されます。

$ echo 111,222,333 | awk 'BEGIN{FS=","} {print $1}'
111
$ echo 111,222,333 | awk 'BEGIN{RS=","} {print $1}'
111
222
333

ORS変数

出力時の区切り文字をORS変数で指定します。ORS=””にしてみます。

$ echo 111,222,333 | awk 'BEGIN{RS=",";ORS=""} {print $1}'
111222333$

ORS=” “にしてみます。

$ echo 111,222,333 | awk 'BEGIN{RS=",";ORS=" "} {print $1}'
111 222 333 $

NF変数

NF変数は最終フィールドを表す変数です。

$ echo 111,222,333 | awk 'BEGIN{FS=","} {print $1}'
333

NR変数

NR変数は複数行のファイルなどに対してawkコマンドを使用する際の現在行を表します。

以下の3行のCSVファイルがあります。

$ cat sample.csv
111,222,333
100,200,300
10,10,50

このファイルに対して先頭に行数を付けてみます。

$ cat sample.csv | awk '{print NR"行目",$0}'
1行目 111,222,333
2行目 100,200,300
3行目 10,10,50

FPAT変数

CSVを扱う際に、カンマを含む値がある場合にFS=”,”とした場合にうまく処理ができません。

"100","200","300" 
"100","2,200","300" ←この行がうまく処理できない
"100","200","300"

フィールド値にカンマを含む可能性があるCSVを処理する場合はFPAT変数を使用します。

$ echo '111,"222,333",444' \
> | awk 'BEGIN{FPAT="([^,]+)|(\"[^\"]+\")"} {print $2}'
"222,333"

ENVIRON変数

ENVIRON変数は連想配列です。

環境変数(一部)
ENVIRON[“PWD”] /home/ec2-user
ENVIRON[“SHELL”] /bin/bash
$ echo | awk '{print ENVIRON["SHELL"]}'
/bin/bash
$ echo | awk '{print ENVIRON["PWD"]}'
/home/ec2-user

ENVIRON変数の連想配列のキーをすべて出力します。

asorti関数で第一引数の配列のインデックスを第二引数の配列にプットしてソートします。

$ echo | awk '{asorti(ENVIRON,env); for(i in env) {print env[i]; }}'
SSH_TTY
HOME
TERM
HOSTNAME
USER
LANG
LESSOPEN
LOGNAME
LS_COLORS
MAIL
XDG_RUNTIME_DIR
PATH
XDG_SESSION_ID
PWD
_
SHELL
SHLVL
AWKPATH
SSH_CLIENT
HISTCONTROL
SSH_CONNECTION
HISTSIZE

今度は逆に、ENVIRON変数の連想配列の値をすべて出力します。

asort関数で第一引数の配列の要素を第二引数の配列にプットしてソートします。

$ echo | awk '{asort(ENVIRON,env); for(i in env) {print env[i]; }}'
en_US.UTF-8
.:/usr/share/awk
ignoredups
/bin/bash
ip-172-31-47-49.ap-northeast-1.compute.internal
/dev/pts/0
/home/ec2-user
/home/ec2-user
/run/user/1000
/usr/bin/awk
rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:~~~~省略
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ec2-user/.local/bin:/home/ec2-user/bin
xterm-256color
/var/spool/mail/ec2-user
||/usr/bin/lesspipe.sh %s
218.219.193.161 62309 172.31.47.49 23
218.219.193.161 62309 22
1
ec2-user
166
ec2-user
1000

コメント

タイトルとURLをコピーしました