コピペコードで快適生活

明日使えるソースを自分のために

{print $1}しか知らない自分のためのAWKメモ

awkのことをきちんと知っておこうと思って、下記を読ませていただいたときのメモ書きです。
http://antibayesian.hateblo.jp/entry/2014/09/15/162605

条件マッチする行を抽出

# 10にマッチする行を抽出する。
awk /10/ trees.txt

# 両方の条件を満たす行を抽出する。
awk "/10/ && /16/" trees.txt

# 片方どちらかでも条件を満たした行を抽出
awk "/10/ || /16/" trees.txt

# 10を含まない行を抽出
awk !/10/ trees.txt

# 1列目に10が含まれる行を抽出
# ※$0には行全体が入っている
awk $1~/10/ trees.txt

# 1行目が10未満の行を抽出
awk "$1<10" trees.txt

# 12~14間の数値が含まれる行を抽出
awk /12/,/14/ trees.txt

組み込み変数を使って抽出

組み込み変数

NR # 現在読み込んでいる行数
NF # 現在読み込んでいる行の列数
-F # ファイルセパレータ指定。デフォルトは半角スペースかタブ。,を指定することでCSVファイルに対応
length # 現在読み込んでいる行の文字数

# CSVファイルから取り出す
awk -F , $1~/10/ trees.txt

# 1~3行目を取り出す
awk "NR<=3" trees.txt

# 列数が2未満の行を取り出す
awk "NF<2 {print NR, $0}" trees.txt

# 空行以外を取り出す
awk "length>0" trees.txt

printを使ったデータ加工

# 1列目だけ
awk "{print $1}" trees.txt

# 1列目*2列目の計算結果を出力
# ※文字列での計算は0になる
awk "{print $0,$1*$2}" trees.txt

# 行数付与
awk "{print NR, $0}" trees.txt

# $0に含まれる8をxxxに置換して出力
awk "{gsub(8,\"xxx\",$0);print $0}" trees.txt