2009年5月27日 星期三

[linux] awk 指令 範例

範例一:
將下列內容存成 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入門

【下列文章您可能也有興趣】

沒有留言: