Table of Contents

Awk

Tips

割算は1ではなく1.0の様に小数点を付けないと不正確になるので注意

Sample

awk '{print $1 $3}'						: 続けて表示
awk '{print $1, $3}'						: 出力フィールドセパレータで区切って表示
awk '{printf "%4d %s\n", $1, $3}'				: 指定フォーマットで表示
awk '(NR==2){print $2}'						: 2行目の2列目だけ表示
awk '(NR%5==0){print}'						: 5行おきに出力
awk '{print $1*3.0, $3}'					: 列ごとの計算
awk '{s+=$1}END{print "sum:", s, "average:", s/NR}'		: すべての行の足し算
awk 'BEGIN{a=0}{a=a+$1}END{print a}'				: すべての行の足し算
awk '($1>=20)&&($1<=100)'					: 1列目が20以上かつ100以下の行だけ表示
awk '{printf "%f\n", ($3*'${hoge}')*2.5}'			: シェル変数を使用する場合は''で囲む
echo "1 2" | awk '{print $1+$2}'				: パイプによる計算
awk 'BEGIN{OFS=","}{print $1, $2}'				: 区切りをカンマで出力
awk '{print substr($0, 9, 4)}'					: 9文字目から4文字取り出す
echo "abcdef" | awk '{print substr($1, 3, 2)}'			: 3文字目から2文字分を表示
awk '{print length(), $0}'					: 文字列の長さ
awk '{$1=""; print $0}'						: 最初のフィールドを除外する
awk '{$NF=""; print $0}'					: 最後のフィールドを除外する
awk '($3>0){print $1, $2*3, hoge}' hoge=${HOME}			: フィールド差し替え
awk -F, -f input.awk input.txt					: ファイル処理
awk '/exp/ {print $0}'						: exp式に適合する部分文字列があるか
awk '/^#/'							: #で始まる行を表示
awk '/^#/ {print}'						: #で始まる行を表示
awk '$2~/exp/ {print $0}'					: exp式が正規表現に適合するか
awk '$2~!/exp/ {print $0}'					: exp式が正規表現に適合しないか
awk '$2==""'							: 2フィールド目が空文字列
awk '$2 ~ /^$/'							: 2フィールド目が空文字列 (正規表現を利用)
awk '$2 !~ /./'							: 2フィールド目が空文字列 (正規表現を利用)
awk 'length($2) == 0'						: 2フィールド目が空文字列 (関数を利用)
awk 'NF % 2 !=0'						: フィールド数が奇数のみ表示
awk 'length($0) > 72'						: 1行が72文字以下のみ表示
awk '{if(/_x/){print $1, $2, $3-1}else{print}}'			: conditional if
awk '{if($2<=$3+1){print $1, $2, $3-1}else{print}}'		: conditional if
echo "" | awk '{for(i=0; i<5; i=i+1){print i}}'			: for loop
echo "" | awk '{i=1; while(i<=10){print i; i++}}'		: while loop
awk '{if(NR%3==2){sub(/$/,""); printf("%s", $0)}else{print}}'	: ある条件で連結
awk '{printf("%s ", $0)}'					: 横に連結
awk '{print "hoge" > "/dev/tty"}'				: ターミナルへの打ち出し
awk '{nc+=length($0)+1; nw+=NF}END{print NR, nw, nc}'		: wc emulator

## 3行名以降だけ表示
awk '{for(i=3; i<NF; i++){printf("%s ", $i)}; {printf("%s\n"), $NF}}'

## 1列目と2列目だけ変更して3行名以降はそのまま表示 (列の数が不明な場合に使用)
awk '{printf("%s", $0); printf("%s", $1); for(i=3; i<=NF; i++){printf("%s ", $i)}; printf("\n");}

Operator

>		: GREATER
<		: LESS
>=		: GREATER or EQUAL
<=		: LESS or EQUAL
==		: EQUAL
&&		: AND
||		: OR
!=		: NOT EQUAL

Special

ARGC		: コマンド行にある引数の数
ARGV		: コマンド行にある引数の配列
FILENAME	: 現在の入力ファイル名
FNR		: 現在のファイルの入力レコード数
FS		: 入力フィールドセパレータ (Default = Space)
OFS		: 出力フィールドセパレータ (Default = Space)
NF		: 現在の入力レコードのフィールド数
NR		: 現在までの入力レコード数 = 行番号
RS		: 入力レコードセパレータ (Default = \n)
ORS		: 出力レコードセパレータ (Default = \n)
OFMT		: 数値の出力形式 (Default = %.6g)
NF(ARGC)	: フィールドの数
NR		: 処理中の行の順番
$NF		: 最後のフィールド
$NR		: 最初のフィールド
$0		: 1行全部

I/O

close				: 
getline				: 次のレコードを読む ($0に現入力ファイルの次のレコードを設定する)
getline < input.txt		: ファイルから1レコード読む
getline var			: 次のレコードを読んで変数に代入
getline var < input.txt		: ファイルから1レコード読んで変数に代入
system(command)			: シェルコマンドを実行

Action

break
continue
delete
exit
next

Function

gsub(r, s, t)
index(s, t)
length(s)
match(s, r)
split(s, a, fs)
substr(s, i, n)
sprintf(fmt, expr)
cos(x)
sin(x)
exp(x)
log(x)
sqrt(x)
int(x)

Format

%s		: 文字列として出力
%c		: 1文字として出力
%d		: 10進法
%x		: 16進法
%o		: 8進法
%f		: 浮動小数点
%e		: 指数
%5d		: 5桁分のスペースをあけて表示
%.3d		: 強制的に小数点以下3桁で表示