AWK (Aho, Weinberger, Kernighan) 是強大的文字處理腳本語言,擅長欄位切分、條件過濾、統計彙總與格式化報表。本文系統介紹語法與豐富範例。
awk 'pattern {action}' input-file > output-file
awk -F',' 'pattern {action}' file.csv # 指定欄位分隔符
Name,Marks,Max Marks Ram,200,1000 Shyam,500,1000 Ghyansham,1000 Abharam,800,1000 Hari,600,1000 Ram,400,1000
| 需求 | 指令 | 說明 |
|---|---|---|
| 列印所有行 | awk '{print}' awk_file | 預設動作 |
| 列印第 2、3 欄 | awk -F',' '{print $2, $3}' awk_file | -F',' 設定逗號分隔 |
| 模式匹配 (含 Ram 或 Hari) | awk '/Ram|Hari/' awk_file | 正則表達式過濾 |
| 第一欄去重 | awk -F',' '{a[$1]} END {for(i in a) print i}' awk_file | 關聯陣列去重 |
| 特定名稱分數加總 (Ram) | awk -F',' '$1=="Ram"{sum+=$2} END {print sum}' awk_file | 條件累加 |
| 第二欄總和 | awk -F',' '{sum+=$2} END {print sum}' awk_file | 全欄累加 |
| 分組加總 (每人總分) | awk -F',' '{a[$1]+=$2} END {for(i in a) print i ", " a[i]}' awk_file | 關聯陣列分組統計 |
| 每組筆數統計 | awk -F',' '{a[$1]++} END {for(i in a) print i, a[i]}' awk_file | 計數器 |
| 每組第一筆記錄 | awk -F',' '!a[$1]++' awk_file | 去重保留首筆 |
| 加總並附加至檔案末尾 | awk -F',' '{x+=$2;y+=$3;print} END {print "Total," x "," y}' awk_file | 彙總報表 |
# BEGIN:處理前執行 (初始化、列印標題)
# END:處理後執行 (彙總、輸出統計)
awk 'BEGIN {print "Name\tTotal\tPPT\tDoc\txls"} {printf "%s\t%d\t%d\t%d\t%d\n", $1,$2,$3,$4,$5}' datafile
# 修改輸出欄位分隔符 (OFS)
awk 'BEGIN {OFS="|"} {print $1,$2,$3,$4,$5}' datafile
awk 'FNR==1 {print "====" FILENAME "===="} {print}' file1 file2awk '{cmd="echo " $1; system(cmd)}' fileawk 'END {n=asorti(a, b); for(i=1;i<=n;i++) print b[i], a[b[i]]}' file (gawk 4.1+)awk 'match($0, /(error|warn): (.*)/, m) {print m[1], m[2]}' logfile (gawk)# 顯示每行長度
awk '{print length, $0}' file
# 統計單字頻率
awk '{for(i=1;i<=NF;i++) freq[$i]++} END {for(w in freq) print w, freq[w]}' file
# 印出超過 80 字元的行
awk 'length > 80' file
# 移除重複行 (保留首次)
awk '!seen[$0]++' file
AWK 雖非通用程式語言,但在文字資料清洗、日誌分析、CSV 統計領域無可取代。熟練關聯陣列與 BEGIN/END 模式,即可寫出簡潔高效的資料處理腳本。