スポンサーリンク

awkで列の操作

組み込み変数 $0,$1,$2で列を操作

awkの$0は、1行全体の文字列が格納されていきます。

そして、$1は1列目、$2は2列目、$3は3列目が格納されていきます。

詳細:awkの$0,$1,$2,$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ブロック

参考:awkの基本構文

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の組み込み変数

詳細: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のOFMT変数でprint時の書式を設定

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[文字列]++ 

参考:awkの連想配列の使い方

スポンサーリンク