ラベル awk の投稿を表示しています。 すべての投稿を表示
ラベル awk の投稿を表示しています。 すべての投稿を表示

2015年1月15日木曜日

[awk]指定した行の値を加算する

test04-3.awk
BEGIN {
 # 変数の初期化
 FS=","
 dog_sum1 = 0
 dog_sum2 = 0
 cat_sum1 = 0
 cat_sum2 = 0
}

{
 if ($2 == "dog") {
  dog_sum1 += $3
  dog_sum2 += $4
 }
 else if ($2 == "cat") {
  cat_sum1 += $3
  cat_sum2 += $4
 }
}

END {
 # 結果を表示する
 print "category,sum1,sum2"
 print "dog,"dog_sum1","dog_sum2
 print "cat,"cat_sum1","cat_sum2
}
test.csv
This is test.

1,dog,10,20
2,cat,500,200
3,dog,40,20
4,cat,10,500
実行結果
> awk -f test04-3.awk test.csv
category,sum1,sum2
dog,50,40
cat,510,700

[awk]行の先頭に文字列を追加

正規表現で先頭が数字の行を取り出し、その行の先頭に文字列を追加する test04-2.awk
BEGIN {
}

# 先頭が数字の行に文字列を追加する
{
 if (match($1, /^[0-9]/)) {
  # 先頭が数字の行を取り出す
  print "hoge,"$0
 }
}

END {

}
test.csv
This is test.

1,dog,10,20
2,cat,500,200
3,dog,40,20
4,cat,10,500
実行
> awk -f test04-2.awk test.csv > out.csv
出力結果
hoge,1,dog,10,20
hoge,2,cat,500,200
hoge,3,dog,40,20
hoge,4,cat,10,500

[awk]正規表現

match() を使うことで正規表現を使用できる。 test04.awk
BEGIN {
}

# 先頭が数字の行だけを表示する
{
 # if ($1 ~ /^[0-9]/) {
 # これを使うと buffer: と表示される
 if (match($1, /^[0-9]/)) {
  print $0
 }
}

END {

}
test.csv
This is test.

1,dog,10,20
2,cat,500,200
3,dog,40,20
4,cat,10,500
実行結果
> awk -f test04.awk test.csv
1,dog,10,20
2,cat,500,200
3,dog,40,20
4,cat,10,500
match() ではなく ($1 ~ /^[0-9]) を使った場合、buffer と表示される。
> awk -f test04.awk test.csv
buffer: T
buffer: 1
1,dog,10,20
buffer: 2
2,cat,500,200
buffer: 3
3,dog,40,20
buffer: 4
4,cat,10,500

2014年12月9日火曜日

[awk]BEGINブロック, ENDブロック

BEGIN ブロック
初期化用のコードを定義する
END ブロック
入力ファイルのすべての行の処理が終了した後に実行される。一般的には最終的な計算や、出力ストリームの最後に合計を出力するために使用される。
入力ファイルの各行にある 1 つめの要素を表示する。
test02.awk
BEGIN {

}
{
 print $1
}
END {

}
a.txt
500 1000 1000
500 1001 1001
500 1002 1002
550 1500 1500
550 1500 1500
645 1800 1800
720 2000 2000
実行結果
> awk -f test02.awk a.txt
500
500
500
550
550
645
720
入力ファイルがコロン ":" で区切られている場合。
d.txt
500:1000:1000
500:1001:1001
500:1002:1002
550:1500:1500
550:1500:1500
645:1800:1800
720:2000:2000
実行結果
> awk -f .\test02.awk .\d.txt
500:1000:1000
500:1001:1001
500:1002:1002
550:1500:1500
550:1500:1500
645:1800:1800
720:2000:2000
BEGIN ブロックで FS (Field Separator) を使って区切り文字を指定する。
test03.awk
BEGIN {
 FS=":"
}
{
 print $1
}
END {

}
実行結果
> awk -f .\test03.awk .\d.txt
500
500
500
550
550
645
720

[awk]スクリプトを指定

-f で awk スクリプトを指定する。 test01.awk に記載されたスクリプトに a.txt を入力し、結果を a_new.txt に出力する。
awk -f test01.awk a.txt > a_new.txt

[awk]基本文法

printコマンドがa.txtの各行に対し順次実行される。
awk "{ print }" a.txt
a.txt
1 Hello
2 Good morning
3 Good night
実行結果
> awk "{ print }" a.txt
1 Hello
2 Good morning
3 Good night