awk 範例三

  1. 編輯 sdata.txt,第一行加上欄位抬頭。
    [dywang@dywmac zzz]$ vim sdata.txt 
    [dywang@dywmac zzz]$ cat sdata.txt
    no. name score1 score2 grade
    11 dywang 81 12 A
    152 linda 90 58 C
    33 peter 72 95 C
    4 rita 65 34 E
    58 cora 5 85 D
    
  2. 如果第一行不做特別處理,平均會多算一行,且第一行的後兩個欄位,抬頭都是 0。
    [dywang@dywmac zzz]$ gawk '{ sum += $3; \
    print NR "\t" $2 "\t" $3 "\t" sum "\t" sum/NR}' sdata.txt
    1	name	score1	0	0
    2	dywang	81	81	40.5
    3	linda	90	171	57
    4	peter	72	243	60.75
    5	rita	65	308	61.6
    6	cora	5	313	52.1667
    
  3. 大括號 { } 內動作加 if 條件,將一列個別處理。
    [dywang@dywmac zzz]$ gawk '{if(NR==1) print "count\tname\tscore1\tsum\tavg."} \
    {sum += $3; if(NR>=2) print NR-1 "\t" $2 "\t" $3 "\t" sum "\t" sum/(NR-1)}' sdata.txt
    count	name	score1	sum	avg.
    1	dywang	81	81	81
    2	linda	90	171	85.5
    3	peter	72	243	81
    4	rita	65	308	77
    5	cora	5	313	62.6
    
  4. 改成列印每個人的兩項成績,並計算其平均值。
    [dywang@dywmac zzz]$ gawk '{if(NR==1) print "count\tname\tscore1\tscore2\tavg."} \
    {sum = $3+$4; if(NR>=2) print NR-1 "\t" $2 "\t" $3 "\t" $4 "\t" sum/2}' sdata.txt
    count	name	score1	score2	avg.
    1	dywang	81	12	46.5
    2	linda	90	58	74
    3	peter	72	95	83.5
    4	rita	65	34	49.5
    5	cora	5	85	45
    
  5. NR==1, NR>=2 的判斷放在大括號 {} 動作外,則表示「條件」,不用再用 if 處理。
    [dywang@dywmac zzz]$ gawk 'NR==1 {print "count\tname\tscore1\tscore2\tavg."} \
    NR>=2 {sum = $3+$4; print NR-1 "\t" $2 "\t" $3 "\t" $4 "\t" sum/2}' sdata.txt
    count	name	score1	score2	avg.
    1	dywang	81	12	46.5
    2	linda	90	58	74
    3	peter	72	95	83.5
    4	rita	65	34	49.5
    5	cora	5	85	45