たまーにawkを使うことがあります。
ただ、数ヶ月にすこしというペースなので使うたびに「あれ?どうやって使うんだっけ」となって
ネットで調べる、ということをやってしまっているので自分がよく使うものを記載。
これだけ知っとくだけでも結構使える
- 変数$1~$...
- 変数NR
- 変数NF
- 変数FS
- 変数FPAT
- STAR, END
各項目の詳細は以下
超基本
以下のようなファイルがあるとします。
No data1 data2 data3
1 101 102 103
2 201 202 203
3 301 302 303
4 401 402 403
以下のようにawkスクリプトを用意
{
print $1 " " $3
}
ターミナルから -f オプションでスクリプトを指定したあとにsample.txtを指定。
$ awk -f sample.awk sample.txt
以下のように出力される。
No data2
1 102
2 202
3 302
4 402
解説
出力
変数 $1~$...
一行の各要素が入る。
No data1 data2 data3 <----- $1 = "No", $2 = "data1", $3 = "data2", $4 = "data3"
1 101 102 103
2 201 202 203
3 301 302 303
4 401 402 403
各列の合計を出す
以下のようなファイルがあるとします。
No data1 data2 data3
1 101 102 103
2 201 202 203
3 301 302 303
4 401 402 403
以下のようにawkスクリプトを用意
{
if(NR > 1){
sum1 += $2;
sum2 += $3;
sum3 += $4;
}
}
END {
print sum1 " " sum2 " " sum3;
}
ターミナルから -f オプションでスクリプトを指定したあとにsample.txtを指定。
$ awk -f sample.awk sample.txt
以下のように出力される。
1004 1008 1012
解説
変数NR
現在の行数。この例では一行目はタイトルなので無視している。
END
終了処理。ここでは合計値を出力。
行ごとに合計を出したい。
以下のようなファイルがあるとします。
No data1 data2 data3
1 101 102 103 <----- 101 + 102 + 103 を求めたい。
2 201 202 203
3 301 302 303
4 401 402 403
以下のようにawkスクリプトを用意
{
sum = 0;
for(i=2; i<=NF; i++) {
sum += $i;
}
print sum;
}
ターミナルから -f オプションでスクリプトを指定したあとにsample.txtを指定。
$ awk -f sample.awk sample.txt
以下のように出力される。
0
306
606
906
1206
解説
変数NF
各行の要素数が入る。
ファイルの区切りがスペースじゃなくてカンマ
以下のようなファイルがあるとします。
No,data1,data2,data3
1,101,102,103
2,201,202,203
3,301,302,303
4,401,402,403
以下のようにawkスクリプトを用意
BEGIN {
FS = ",";
}
{
print $1 " " $3
}
ターミナルから -f オプションでスクリプトを指定したあとにsample.txtを指定。
$ awk -f sample.awk sample.txt
以下のように出力される。
No data2
1 102
2 202
3 302
4 402
解説
変数FS
各要素の区切り位置。デフォルトは空白。
START
開始処理を書ける。
ファイルの区切りがスペースじゃなくてカンマ。あと、各要素にカンマが含まれている。
No,data1,data2,data3
1,101,"102,101",103
2,201,202,203
3,301,"302,101",303
4,401,402,403
以下のようにawkスクリプトを用意
BEGIN {
FPAT = "([^,]+)|(\"[^\"]+\")"
}
{
print $1 " " $3
}
ターミナルから -f オプションでスクリプトを指定したあとにsample.txtを指定。
$ awk -f sample.awk sample.txt
以下のように出力される。
No data2
1 "102,101"
2 202
3 "302,101"
4 402
解説
変数FPAT
各要素を正規表現で記載できる。