將下列內容存成 awk_test.txt
Mike Harrington:(510) 548-1278:250:100:175
Christian Dobbins:(408) 538-2358:155:90:201
Susan Dalsass:(206) 654-6279:250:60:50
Archie McNichol:(206) 548-1348:250:100:175
Jody Savage:(206) 548-1278:15:188:150
Guy Quigley:(916) 343-6410:250:100:175
Dan Savage:(406) 298-7744:450:300:275
Nancy McNeil:(206) 548-1278:250:80:75
John Goldenrod:(916) 348-4278:250:100:175
Chet Main:(510) 548-5258:50:95:135
Tom Savage:(408) 926-3456:250:168:200
Elizabeth Stachelin:(916) 440-1763:175:75:300
執行: awk -F: 'NR==1{max-=min=$3} NF>=3{sum=$3+$4+$5;printf "%20s %15s %8s %8s %8s %8.1f\n" ,$1,$2,$3,$4,$5,sum;if($3>max)max=$3;if($3<min)min=$3;total+=$3;sum_total+=sum}END {printf "SumToal:%8.2f, Total: %8.2f ,Max:%2s , Mix:%2s \n",sum_total,total,max,min}' awk_test.txt
結果:
Mike Harrington (510) 548-1278 250 100 175 525.0
Christian Dobbins (408) 538-2358 155 90 201 446.0
Susan Dalsass (206) 654-6279 250 60 50 360.0
Archie McNichol (206) 548-1348 250 100 175 525.0
Jody Savage (206) 548-1278 15 188 150 353.0
Guy Quigley (916) 343-6410 250 100 175 525.0
Dan Savage (406) 298-7744 450 300 275 1025.0
Nancy McNeil (206) 548-1278 250 80 75 405.0
John Goldenrod (916) 348-4278 250 100 175 525.0
Chet Main (510) 548-5258 50 95 135 280.0
Tom Savage (408) 926-3456 250 168 200 618.0
Elizabeth Stachelin (916) 440-1763 175 75 300 550.0
SumToal: 6137.00, Total: 2595.00 ,Max:450 , Mix:15
範例二:
將下列內容存成 awk_test2.txt
Name 1st 2nd 3th
VBird 23000 24000 25000
DMTsai 21000 20000 23000
Bird2 43000 42000 41000
執行:
cat awk_test2.txt | awk 'NR==1 {printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"}NR >1&& NF>=3 {total= $2+$3+$4;printf "%10s %10s %10s %10s %10.2f\n",$1,$2,$3,$4,total}'
結果:
name 1st 2nd 3th Total
VBird 23000 24000 25000 72000.00
DMTsai 21000 20000 23000 64000.00
Bird2 43000 42000 41000 126000.00
範例三:
將下列內容存成 awk_test3.txt
1
2
3
4
5
6
7
8
9
10
執行:
fmt -1 awk_test3.txt | awk "BEGIN { sum = 0 } { sum += \$1 } END { print sum; print sum / NR }"
結果:
55
5.5
fmt 是一個用來將段落格式化的命令。
"fmt -1" 與 "fmt -w 1" 的意義相同 -- "儘可能" 將段落格式化成每行的長度為一個字元。但如果一個 "單字" 的長度超出一個字元,fmt 並不會將超出的部分強行切割到下一行。所以一個檔案不管它一行有幾筆資料,在經過 "fmt -1" 之後,就可以確保每一行都只有一筆資料。當然啦!這個前題是: 不可以有空白行在檔案中。但果有的話,可以事先用
sed '/^[ \t]*$/d'
來將空白行給刪除。
接下來 awk 的 "program text" 中:
BEGIN 代表其後的 {...},是在讀取資料之前要先做
END 代表其後的 {...},是在讀取資料結束後才要做
至於 NR 這個 keyword,是 number of records 的縮寫,代表目前所讀取的資料筆數。
所以 "sum / NR",代表總和除以資料筆數,也就是平均值。
另外 NF 這個 keyword,是 number of fields 的縮寫,代表一筆資料中共有個欄位。
因此 $NF 就是最後一個欄位的值。
鳥哥
臥龍三小
藍森林
awk入門
沒有留言:
張貼留言