awk 是一種腳本語言,用於處理或分析文本文件。或者我們可以説,awk 命令主要用於根據列或字段或一組列對數據進行分組,它主要用於以有用的方式報告數據,它還使用 Begin 和 End 塊來處理數據。
awk 名聲在外,但是很少有人知道它的願意是什麼,awk 代表 “Aho, Weinberger, and Kernighan”,又見伯格系列,如果有一天中國人的工具用人名來命名會是啥樣子?
基本語法
# awk ‘pattern {action}’ input-file > output-file
我們先創建一個包含以下數據的輸入文件
$ cat awk_file
Name,Marks,Max Marks
Ram,200,1000
Shyam,500,1000
Ghyansham,1000
Abharam,800,1000
Hari,600,1000
Ram,400,1000
(1) 打印所有行
默認情況下,awk 打印文件的所有行,示例如下
$ awk '{print;}' awk_file
Name,Marks,Max Marks
Ram,200,1000
Shyam,500,1000
Ghyansham,1000
Abharam,800,1000
Hari,600,1000
Ram,400,1000
備註: 在 awk 命令中 {print;} 用於打印所有字段及其值。
(2) 只打印特定的字段
在 awk 命令中,我們使用 $ (美元) 符號後跟字段號來打印字段值。
我們只打印字段 2 和字段 3,使用選項 -F,指定逗號為字段分隔符。
$ awk -F "," '{print $2, $3;}' awk_file
Marks Max Marks
200 1000
500 1000
1000
800 1000
600 1000
400 1000
(3) 打印與模式匹配的行
打印包含單詞 Hari 或 Ram 的行,示例如下
$ awk '/Hari|Ram/' awk_file
Ram,200,1000
Hari,600,1000
Ram,400,1000
(4) 查找第一列唯一值
要從第一列中打印唯一的值,運行如下 awk 命令
$ awk -F, '{a[$1];}END{for (i in a)print i;}' awk_file
Abharam
Hari
Name
Ghyansham
Ram
Shyam
(5) 特定列中數據項的和
在 awk 命令中,也可以根據搜索執行一些算術操作,語法如下所示
$ awk -F, ‘$1==”Item1″{x+=$2;}END{print x}’ awk_file
在下面的例子中,我們搜索 Ram,然後累加所對應的值。
$ awk -F, '$1=="Ram"{x+=$2;}END{print x}' awk_file
600
(6) 求一列中所有數字的總數
在 awk 命令中,我們還可以計算某一列中所有數字的和。在下面的例子中,我們正在計算第 2 列和第 3 列的所有數字的和。
$ awk -F"," '{x+=$2}END{print x}' awk_file
3500
$ awk -F"," '{x+=$3}END{print x}' awk_file
5000
(7) 分組求和
實現類似 SQL 中的按某個字段分組求和,示例如下:
$ awk -F, '{a[$1]+=$2;}END{for(i in a)print i", "a[i];}' awk_file
Abharam, 800
Hari, 600
Name, 0
Ghyansham, 1000
Ram, 600
Shyam, 500
(8) 計算特定列的總和,並將其附加到文件的末尾
awk 命令先對一個列求和,然後附加到文件末尾,示例如下
$ awk -F"," '{x+=$2;y+=$3;print}END{print "Total,"x,y}' awk_file
Name,Marks,Max Marks
Ram,200,1000
Shyam,500,1000
Ghyansham,1000
Abharam,800,1000
Hari,600,1000
Ram,400,1000
Total,3500 5000
(9) 分組計數
實現類似 SQL 中的按某個字段分組計數,示例如下:
$ awk -F, '{a[$1]++;}END{for (i in a)print i, a[i];}' awk_file
Abharam 1
Hari 1
Name 1
Ghyansham 1
Ram 2
Shyam 1
(10) 打印分組的第一個記錄
打印每個分組的第一個記錄,示例如下
$ awk -F, '!a[$1]++' awk_file
Name,Marks,Max Marks
Ram,200,1000
Shyam,500,1000
Ghyansham,1000
Abharam,800,1000
Hari,600,1000
AWK 塊結構
基本語法
$ awk 'BEGIN{awk initializing code}{actual AWK code}' File-Name
我們先創建一個具有以下內容的數據文件
(11) 自定義表頭打印
$ awk 'BEGIN{print "Names\ttotal\tPPT\tDoc\txls"}{printf "%-s\t%d\t%d\t%d\t%d\n", $1,$2,$3,$4,$5}' datafile
(12) 修改文件分隔符
示例文件中我們使用 SPACE 做分隔符,我們將 SPACE 修改為 “|”,示例如下
$ awk 'BEGIN{OFS="|"}{print $1,$2,$3,$4,$5}' datafile
我的開源項目
- course-tencent-cloud(酷瓜雲課堂 - gitee倉庫)
- course-tencent-cloud(酷瓜雲課堂 - github倉庫)