スポンサーリンク
awkで列の操作
組み込み変数 $0,$1,$2で列を操作
awkの$0は、1行全体の文字列が格納されていきます。
そして、$1は1列目、$2は2列目、$3は3列目が格納されていきます。
スポンサーリンク
列の抽出
awkの変数を使って、特定の列を抽出します。
例えば、カンマ区切りのファイルの2列目を抽出する場合です。
$ cat in.txt | awk -F"," '{print $2}'
詳細:awkで特定の列を抽出する
列の削除
削除したい列を除外して、print出力すればできます。
例えば、2列目を削除する場合には、
print出力時に、$1と$3のみprint出力するだけです($2はprint出力しない)。
$ cat in.txt | awk -F"," '{print $1 "," $3}'
詳細:awkで列を削除する方法
列の入れ替え
print出力する順番を指定すれば、入れ替えも簡単です。
例えば、1列目と3列目を入れ替える場合は、
print出力の際に、1列目と3列目を入れ替えればできます。
$ cat in.txt | awk -F"," '{print $3 "," $2 "," $1}'
詳細:awkで列を入れ替える方法
列を追加・插入
print出力時に、列の変数と追加・挿入したい文字列を組み合わせることで、列の追加・挿入もできます。
1列目と2列目の間に、"add"という文字列の列を挿入します。
print出力時に、$1と$2の間に"add"を挿入します。
$ cat in.txt | awk '{print $1 " " "add" " " $2}'
詳細:awkで列を追加・挿入する方法
スポンサーリンク
awkの型(構文)
awkは、下記の型(基本構文)に合わせて書いて、用途に合わせてカスタマイズすると良いと思います。
cat in.txt | awk ' #BEGINブロック BEGIN{ #初期化処理を書く } #メインブロック { #メイン処理を書く } #ENDブロック END{ #最終処理を書く } '
awkのブロック処理の順番は下記になります
1. BEGINブロック
2. メインブロック
3. ENDブロック
BEGINブロックの使い方
基本的にはBEGINブロックで変数を初期化するのが、わかりやすいと思います。
参考:awkで変数の初期化はBEGINブロック内が基本
ENDブロックの使い方
ENDブロックは最終処理に使います
参考:awkのENDブロックをうまく使おう
awkで文字列を連結する方法
awkで文字列を連結させるには、文字列を連結したい順に列挙することで、簡単に連結した文字列作り出すことができます。
下記のように、"awk" "find" "ls"を連結するには、str = "awk" "find" "ls"のように列挙して、変数strに代入してあげます。
str = "awk" "find" "ls"
詳細:awkで文字列を連結させる方法
awkで文字列の置換
gsub()の使い方
gsub()で文字列の置換ができます。
gsub()は、入力文字列に対して、全ての置換対象文字列を置換します。
gsub(置換対象文字列, 置換文字列, 入力文字列)
例えば、1フィールド(列)目の文字列"-"を"/"に置換したい場合は、下記のように書きます。
gsub( "-", "/", $1 )
詳細:awkの文字列置換関数gsub()の使い方
sub()の使い方
sub()は、入力文字列に対して、最初の置換対象文字列のみを置換します。
sub(置換対象文字列, 置換後文字列, 入力文字列)
例えば、$0(1行全体)を、下記のようにsub()を使って、"line"を"after"に置換します。
$ cat in.txt | awk '{sub("line", "after", $0);print $0}'
詳細:awkのsub()で文字列置換する
gsub()とsub()の違い
gsub():置換対象文字列があった場合は全て置換する
sub():最初の置換対象文字列のみ1回置換
詳細:awkのgsub()とsub()の違いは置換回数の回数制約
awkで文字列を切り出し
awkのsubstr()の使い方
substr()は、文字列StrのN文字目からL文字切り出して、戻り値として返します。
substr(Str:対象文字列, N:切り出し開始位置, L:切り出す文字列の長さ)
awkは0オリジンではなく、先頭の開始文字は1文字目となることに注意が必要です。
例えば、1フィールド(列)目の3文字目から3文字切り出したいときには、下記のように書きます。
変数numに、切り出した結果が格納されます。
num = substr( $1, 3, 3)
詳細:awkでsubstr()を使って文字列を切り出す方法
awkのsubstr()とindex()の使い方
awkのindex()は、対象文字列を先頭から検索し、検索文字列が検出された最初の位置を戻り値として返します。
index(対象文字列, 検索文字列)
substr()とindex()を組み合わせると便利です。
例えば、"0"の文字列を検出した最初の位置から3文字分だけ切り出したい場合は、下記のように書くことができます。
num = substr( $1, index( $1, "0" ), 3)
詳細:awkでsubstr()の切り出し開始位置をindex()で指定する方法
awkの大文字/小文字の変換はtolower()/toupper()
小文字への変換は、tolower()を使います。
str = tolower( $1 )
大文字への変換は、toupper()を使います。
str = toupper( $1 )
引数に変換対象文字列、strに変換後の文字列が格納されます。
詳細:awkの大文字/小文字の変換はtolower()/toupper()を使えばOK
awkの組み込み変数
FS変数で区切り文字を設定
FS変数で区切り文字を設定できます。
例えば、区切り文字をカンマにする場合には、下記のようにFS = "," と設定します。
$ cat sample.awk #!/bin/sh cat in.txt | awk ' BEGIN{ FS = "," } { print $1 } '
詳細:awkのFS変数で区切り文字を設定
OFS変数で出力の区切り文字を設定
OFS変数で出力の区切り文字を設定できます。
例えば、awkの出力区切り文字をスペースにする場合は、下記のようにOFS = " " を設定します。
$ cat sample01.awk #!/bin/sh cat in.txt | awk ' BEGIN{ OFS = " " } { print $1 , $2 } '
NR変数で処理中の行数を取得
NR変数で処理中の行数を取得できます。
例えば、下記は2行目と4行目の行をprint出力していて、NR == 2 || NR == 4 のときにprint出力しています。
$ cat sample.awk #!/bin/sh cat in.txt | awk ' { if(NR == 2 || NR == 4){ print NR ,$0 } } '
詳細:awkのNR変数で行数に応じた処理をする
NF変数で処理中の列数が取得
NF変数で、処理中の列数が取得できます。
例えば、列の欠損チェックに使えて、下記は3列で構成されていない行数をprint出力します。
$ cat sample.awk #!/bin/sh cat in.txt | awk ' BEGIN{ FS = "," } { if(NF != 3){ print NR "行目が3列になっていません" } } '
詳細:awkのNF変数で列数に応じた処理をする
OFMT変数でprint時の書式を設定
awkのOFMT変数でprint時の書式を設定できます。
下記は、OFMT = "% .2f" と設定しています。
$ cat sample.awk #!/bin/sh cat in.txt | awk ' BEGIN{ OFMT = "% .2f" } { print $2 / 3 } '
awkのmatch()関数の使い方
awkのmatch()は、対象文字列を先頭から検索し、検索対象が検出された最初の位置を戻り値として返します。
match(対象文字列, 検索対象)
例えば、下記は、検索対象には正規表現で/[1-9]/ と指定し、1~9の数字が検出された最初の位置をprint出力します。
$ cat sample.awk #!/bin/sh cat in.txt | awk ' { num = match($0, /[1-9]/) print $0 "は," num "文字目に数字が登場します." } '
詳細:awkのmatch()関数の使い方
awkでcsvファイルを処理する
下記のように、-Fオプションで","を指定して処理します。
$ cat in.txt | awk -F"," '{print $1 "年" $2}'
BEGINブロックでFS変数に","を指定する方法もあります。
$ cat sample.awk #!/bin/sh cat in.txt | awk ' BEGIN{ FS = "," } { print $1 "年" $2 } '
詳細:awkでcsvファイルを処理する
awkのif分
awkもif文が使えます。
if~else if ~ else、&条件、or条件等、使いこなせるようになっておきたいです。
$ cat sample4.awk #!/bin/sh cat in.txt | awk ' { if($1 == 2015 && $3 == 4){ print "1列目が2015にマッチ" print $0 }else if($1 == 2014 || $5 != 3){ print "1列目が2014にマッチ" print $0 }else{ print "Else文" } } '
詳細:awkのif文のサンプルコード
awkのwhile文
awkでは、while文も使えます。
下記は、whileでループ処理させて、breakでwhile文の処理から抜け出します。
$ cat sample.awk #!/bin/sh cat in.txt | awk ' { i = 1 p = 1 while(1){ p = p * $1 i++ if(i > 3){ break } } print $1 "の3乗は" p } '
詳細:awkのwhile文のサンプルコード
awkのオプション
-Fオプションで区切り文字を設定
-Fオプションで区切り文字を設定できます。
例えば、タブ区切りにしたい場合には、下記のように設定します。
$ cat in2.txt | awk -F "\t" '{print $2}'
詳細:awkの-Fオプションで区切り文字を指定する方法
-vオプションでawk内部で使う変数に値を設定
-vオプションでawk内部で使う変数に値を設定できます。
例えば、下記は、strYear="年"、strMonth="月"、strDay="日"を設定しています。
$ cat sample.awk #!/bin/sh cat in.txt | awk -v strYear="年" -v strMonth="月" -v strDay="日" ' BEGIN{ print strYear , strMonth , strDay , "を引数で設定" } { print $1 strYear $2 strMonth $3 strDay } '
詳細:引数でawkに値を渡す方法:-vオプションを使う
awkのlength()で文字列の長さを取得
length(文字列)の形式で文字列の長さを戻り値として返します。
下記は、1行ずつ行全体($0)の文字列の長さを返しています。
$ cat sample.awk #!/bin/sh cat in.txt | awk ' { print $0 "は" length($0) "文字です" } '
詳細:awkのlength()で文字列の長さを取得
awkのprintfの使い方
awkのprintfの書式を下記の形式で書くことができます。
%[フラグ][出力幅][.精度]型
例えば、下記のように書けます。
・整数の出力
printf "%06d\n", x #右詰め、6桁で整数を出力(数値出力以外の桁は0埋め)
・小数点の出力
printf "%+6.2f\n", x #右詰め、6桁、少数第2位までを、符号を付けて浮動小数点数として出力
その他の例は下記に書いています。
詳細:awkでよく使うprintfの書式のサンプルコード
awkのrand()関数の使い方
awkのrand()で乱数を発生させることができます。
srand()でseedを設定できます。
下記は、srand()でseedを3に設定しています。
$ cat in.txt | awk 'BEGIN{srand(3)}{print $1, rand()}'
詳細:awkのrand()で乱数を発生させる
awkの連想配列の使い方
awkの連想配列では、下記の形式で、keyで指定した配列arrの要素にvalueを格納できます。
arr[key] = value
下記の形式で、文字列の出現数をカウントするのに使えます。
arr[文字列]++
スポンサーリンク