目录
- 数组
- "一行" 实用技巧
- 1. 输入行的总行数
- 2. 打印第 5 行
- 3. 打印每一个输入行的最后一个字段
- 4. 打印最后一行的最后一个字段
- 5. 打印字段数多于 2 个的输入行
- 6. 打印最后一个字段值大于 4 的输入行
- 7. 打印所有输入行的字段数的总和
- 8. 打印包含 张三、王五 的行的数量
- 9. 打印具有最大值的第二个字段, 以及包含它的行 (假设 $2 总是 正的)
- 10. 打印至少包含一个字段的行
- 11. 打印长度超过 21 个字符的行
- 12. 在每一行的前面加上它的字段数
- 13. 打印每一行的第 1 与第 2 个字段
- 14. 交换每一行的第 1 与第 2 个字段的位置并打印
- 15. 将每一行的第一个字段用行号代替
- 16. 打印删除了第 2 个字段后的行
- 17. 将每一行的字段按逆序打印
- 18. 打印每一行的所有字段值之和
- 19. 将所有行的所有字段值累加起来
- 20. 将每一行的每一个字段用它的绝对值替换
数组
Awk 提供了数组, 用来存储一组相关的值。例如下面的程序,先把记录分别存入数组对应的位置,最后通过 while 循环倒叙打印出数组存储的数据:
awk '{line[NR] = $0}
END { i = NR;
while (i > 0) {
print line[i]; i = i - 1
}
}' employ.dat
王八 80.00 18
钱七 42.50 22
赵六 30.00 20
王五 19.00 10
李四 22.75 0
张三 25.00 0
同样的,使用 for 循环同样也能完成上面的效果
awk ' { line[NR] = $0 } END { for (i = NR;i > 0;i = i - 1) { print line[i]}}' employ.dat
“一行” 实用技巧
虽然 awk 可以写出非常复杂的程序,但是许多实用的程序并不比我们目前为止看到的复杂多少。下面的一些小程序集合,大多数是我们已经讨论过的程序的变形,这里我称之为 "一行" 实用技巧
。
1. 输入行的总行数
awk 'END {print NR}' employ.dat
2. 打印第 5 行
awk '{if (NR == 5) {print $0}}' employ.dat
3. 打印每一个输入行的最后一个字段
awk '{print $NF}' employ.dat
4. 打印最后一行的最后一个字段
awk '{record = $NF} END {print record}' employ.dat
5. 打印字段数多于 2 个的输入行
awk '{if (NF > 2) { print $0}}' employ.dat
6. 打印最后一个字段值大于 4 的输入行
awk '{ if ($NF > 4) { print $0}}' employ.dat
7. 打印所有输入行的字段数的总和
awk '{total = total + NF} END {print "总字段数是",total}' employ.dat
8. 打印包含 张三、王五 的行的数量
awk '/张三|王五/ {total = total + 1} END { print "总行数是",total}' employ.dat
上面的命令你个用到了正则匹配,对正则表达式不熟悉的小伙伴可以去看看我的 重学正则表达式
9. 打印具有最大值的第二个字段, 以及包含它的行 (假设 $2 总是 正的)
awk '$2 > max {max = $2;maxLine = $0} END {print "最大值是",max,"对应行的数据是", maxLine}' employ.dat
10. 打印至少包含一个字段的行
awk '{ if (NF > 0) { print $0} }' employ.dat
11. 打印长度超过 21 个字符的行
awk '{if (length($0) > 10) {print $0}}' employ.dat
上面的命令用之前数据可能不太好验证,感兴趣的可以尝试修改下数据就能看出效果了。
12. 在每一行的前面加上它的字段数
awk '{print NF,$0}' employ.dat
13. 打印每一行的第 1 与第 2 个字段
awk '{ print $1,$2}' employ.dat
14. 交换每一行的第 1 与第 2 个字段的位置并打印
awk '{tmp = $1;$1 = $2;$2 = tmp; print $0}' employ.dat
15. 将每一行的第一个字段用行号代替
awk '{$1 = NR; print $0}' employ.dat
16. 打印删除了第 2 个字段后的行
awk '{ $2 = ""; print $0}' employ.dat
17. 将每一行的字段按逆序打印
awk '{ for(i = NF; i > 0 ;i = i -1) {printf("%s ",$i) };printf("\n")}' employ.dat
18. 打印每一行的所有字段值之和
awk '{ sum = 0; for (i = 1; i <= NF; i = i + 1) sum = sum + $i; print sum}' employ.dat
通过结果可以看出,它把数值类型的值进行了相加
19. 将所有行的所有字段值累加起来
有了上面的例子,实现下面这个小需求只需要把上面的代码稍稍改动即可完成
awk '{for (i = 1; i <= NF; i = i + 1) sum = sum + $i} END {print sum}' employ.dat
20. 将每一行的每一个字段用它的绝对值替换
awk '{for (i = NF; i > 0; i = i - 1) { if ($i < 0) {$i = -$i} } print $0}' employ.dat
上面的例子都不难,相信大家通过上面的例子对于 awk
的基本操作都比较熟悉了,接下来我们将要学习 awk 模式–动作 语句组成的序列。
本节的内容就到这里了,我们下节见。