一 开始
--- '练习文本' ---
数据特点: 雇员'名字'、雇员'每小时工资' (以美元为单位)、'工作时长';每一行代表一个'雇员的记录'
Beth 4.00 0
Dane 3.75 0
Kathy 4.00 10
Mark 5.00 20
Mary 5.50 22
Susie 4.25 18
--- '目的:有一个粗略的认识' ---
说明1;这里'以条件作为'模式匹配'是否匹配'的条件
说明2:输出的时候可以是'表达式'
补充:通过"\t"的方式改变'输出的格式' -->'双引号和单引号'
涉及:'将文本放入输出中(\t)' -->在 print 语句中, 被'双引号包围'的文本会和字段, 以及运算结果一起输出
二 awk程序的结构
细节:因为模式'Pattern'与动作都是'可选的(options)', 所以用'花括号'将'动作(action)包围'起来, 以便'区分'两者
补充:awk'命令行中的程序'被'单引号包围'. 这个规定可以'防止程序中的字符($等)'被 'shell 解释', 也可以让'程序的长度'多于一行
说明:将awk相应的指令'写到文件中'
三 语法检查
注意:'运行前'和'运行时'语法错误
四 简单输出
(1)打印每一行
(2)打印部分字段
(3)字段数量
(4)输出行号
五 更精美的输出
printf 几乎可以'产生任何种类'的输出
(1)字段排序
第n个'格式说明符'说明 'valuen' 的输出格式
案例1
使用 printf '打印每位雇员的报酬'
{ printf("total pay for %s is $%.2f\n", $1, $2 * $3) }
'%s --> $1' ------分割线------ '%.2f --> $2'
重点:使用 printf '不会自动产生'空格符或换行符; 用户'必须自己创建'它们, 不要忘了 \n
解释
f: float -->表示'浮点数'
细节: printf'要加()',而print不需要
(2)其它的输出格式
字段之间也可以'加个空格',输出不会加上的,除非放到""里面
(3) 输出排序
六 模式类型
'感兴趣的行' --> '模式匹配的行'
(1)通过比较进行选择
(2)通过计算进行选择
说明:实质还是'比较'
(3)通过文本内容选择
(4)模式的组合
(5) 数据验证
核心: '比较判断'
(6)BEGIN 与 END
七 awk计算
(1)计数
(2)计算总和与平均数
'潜在的错误': 一种不常见的情况是 NR 的值为0, 程序会尝试'将 0 作除数', 此时 awk 就会产生一条'错误消息'
(3)操作文本
引申: '比大小'
(4)字符串拼接
(5)打印最后一行
(6)内建函数
简单应用
由于单词默认是'通过空格'分开,所以可以用'字段的个数'来作为'单词的个数'
$0的输出'不包含'换行符,'print'的原因'加上换行符'
八 流程控制语句
(1)if-else语句
(2)while语句
(3)for循环
'循环体'只有'一条语句', 也就'不再需要'花括号
九 数组
'细细体会' -->下标是行号、值是'每行的记录'
{ line[NR] = $0 }
'空格'
END {
for (i = NR; i > 0; i = i - 1)
print line[i]
}
十 常用的知识
5. 打印'字段数多于4个'的'输入行'
NF > 4
6. 打印'最后一个字段值'大于4的输入行
$NF > 4
7. 打印'所有输入行'的字段数的总和
{ nf = nf + NF }
END { print nf }
8. 打印'包含 Beth 的行'的数量
/Beth/ { nlines = nlines + 1 }
END { print nlines }
9. 打印'具有最大值'的第'一个'字段, 以及'包含它的行' (假设 $1 总是 正的)
$1 > max { max = $1; maxline = $0 }
END { print max, maxline }
10. 打印至少'包含一个字段的行'
NF > 0
11. 打印长度'超过 80 个字符'的行
length($0) > 80
12. 在每一行的前面'加上它的字段数'
{ print NF, $0 }
13. 打印每一行的第 1 与第 2 个字段, 但'顺序相反'
{ print $2, $1 }
14. '交换'每一行的第 1 与第 2 个字段, 并'打印该行' -->'改变输出'
{ temp = $1; $1 = $2; $2 = temp; print }
15. 将每一行的第一个字段'用行号代替' -->'改变输出'
{ $1 = NR; print }
16. 打印'删除了第 2 个字段后'的行
{ $2 = ""; print }
17. 将每一行的字段'按逆序打印'
{
for (i = NF; i > 0; i = i - 1)
printf("%s ", $i)
printf("\n")
}
18. 打印每一行的所有字段值之和
{
sum = 0
for (i = 1; i <= NF; i = i + 1) sum = sum + $i
print sum
}
19. 将'所有行的所有字'段值累加起来
{
for (i = 1; i <= NF; i = i + 1) sum = sum + $i }
END { print sum }
20. 将每一行的每一个字段用它的'绝对值'替换
{ for (i = 1; i <= NF; i = i + 1) if ($i < 0) $i = -$i
print
}
不懂:-$i -->'绝对值'