LoginSignup
1
2

More than 3 years have passed since last update.

awkについてメモ

Posted at

たまーにawkを使うことがあります。
ただ、数ヶ月にすこしというペースなので使うたびに「あれ?どうやって使うんだっけ」となって
ネットで調べる、ということをやってしまっているので自分がよく使うものを記載。

これだけ知っとくだけでも結構使える

  • print
  • 変数\$1~\$...
  • 変数NR
  • 変数NF
  • 変数FS
  • 変数FPAT
  • STAR, END

各項目の詳細は以下

超基本

以下のようなファイルがあるとします。

sample.txt
No data1 data2 data3
1  101   102   103
2  201   202   203
3  301   302   303
4  401   402   403

以下のようにawkスクリプトを用意

sample.awk
{
  print $1 " " $3
}

ターミナルから -f オプションでスクリプトを指定したあとにsample.txtを指定。

$ awk -f sample.awk sample.txt

以下のように出力される。

No data2
1  102  
2  202  
3  302  
4  402  

解説

print

出力

変数 $1~$...

一行の各要素が入る。

sample.txt
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

各列の合計を出す

以下のようなファイルがあるとします。

sample.txt
No data1 data2 data3
1  101   102   103
2  201   202   203
3  301   302   303
4  401   402   403

以下のようにawkスクリプトを用意

sample.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

終了処理。ここでは合計値を出力。

行ごとに合計を出したい。

以下のようなファイルがあるとします。

sample.txt
No data1 data2 data3
1  101   102   103    <----- 101 + 102 + 103 を求めたい。
2  201   202   203
3  301   302   303
4  401   402   403

以下のようにawkスクリプトを用意

sample.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

各行の要素数が入る。

ファイルの区切りがスペースじゃなくてカンマ

以下のようなファイルがあるとします。

sample.txt
No,data1,data2,data3
1,101,102,103
2,201,202,203
3,301,302,303
4,401,402,403

以下のようにawkスクリプトを用意

sample.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

開始処理を書ける。

ファイルの区切りがスペースじゃなくてカンマ。あと、各要素にカンマが含まれている。

sample.txt
No,data1,data2,data3
1,101,"102,101",103
2,201,202,203
3,301,"302,101",303
4,401,402,403

以下のようにawkスクリプトを用意

sample.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

各要素を正規表現で記載できる。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2