超有用的 Linux / Unix awk 命令示例

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

我们先创建一个具有以下内容的数据文件

超有用的 Linux / Unix awk 命令示例_第1张图片

(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

awk-begin

(12) 修改文件分隔符

示例文件中我们使用 SPACE 做分隔符,我们将 SPACE 修改为 “|”,示例如下

$ awk 'BEGIN{OFS="|"}{print $1,$2,$3,$4,$5}' datafile

超有用的 Linux / Unix awk 命令示例_第2张图片

我的开源项目

酷瓜云课堂-在线教育解决方案

你可能感兴趣的:(awk)