AWKコマンド基本

テキスト処理のコマンド 'AWK' の基本的使い方

Variable

mark mean
$0 行全部
${n} n 列目
NR 行数
NF 桁数
FNR 処理行
NR%{n}=={} スキップ

Option

option mean
-f ファイル指定
-F デリミタ ’,’ ’ ’
-v 変数 ‘key=val’

File を指定して実行

echo | awk -f <file_name>

File の中身表示

awk '{print $0}' <file_name>

File の 1 列目表示

awk '{print $1}' <file_name>

スキップ

# 3で割って1余る
awk 'NR%3で割って1余る==1' <file_name>

1 列目の合計と平均

awk '{sum+=$1} END {print sum,sum/NR}' <file_name>

1 列目が 2 の行を表示

awk '{if( $1 == 2 ){ print $0 }}' <file_name>

ls コマンドを整形

ls -l | awk '{ print $3, $4, $9 }'
# 絞り込み
ls -l | awk '$9=="<search_word>" { print $3, $4, $9 }'

引数

# hoge.awk
{ print $1 * k }
echo "1" | awk -f hoge.awk -v 'k=2'
# 2

空白とカンマの両方を区切り文字

printf "a,b c" | awk -F '[, ]' '{ print $1, $2, $3 }'
 # a b c

Match

# hoge.txt
a b c
d e f
awk -v 'str=e f' 'match( $0, str ){ print $0 }' huga.txt
# d e f

CSV 出力

# hoge.awk
BEGIN { OFS = "," }

{
  for (i=1; i<=NF; i++) {
    printf "\"%s\"", $i;
    if( i < NF ) printf "%s",OFS
  }
}

END { printf "\n" }
echo "a b,c d" | awk -f hoge.awk
# "a","b,c","d"

スクリプトで使用

BEGIN {
  while ( (getline var < ファイル名) > 0 ) {
    print var
  }
}
echo "abc" > abc.txt
$ echo "" | awk -f hoge.awk
# abc

合計・平均・分散・標準偏差を求める

hoge.awk
{
  sum += $1
  square_sum += $1 * $1
}

END {
  if ( NR == 0 ) exit

  average  = sum / NR
  variance = square_sum / NR - average * average
  std_dev  = sqrt( variance )

  print " 合計 :", sum
  print " 平均 :", average
  print " 分散 :", variance
  print "標準偏差:", std_dev
}
# fuga,txt
50
60
70
70
100
awk -f hoge.awk fuga.txt
#  合計 : 350
#  平均 : 70
#  分散 : 280
# 標準偏差: 16.7332

おっさんWEBエンジニア奮闘記©2007 WEBDIMENSION