awk编程?let‘s go(三) ---- awk的基础操作(二)

本文介绍了如何使用awk语言的简洁语法进行数组操作,涵盖从计数行数到高级筛选和字段操作,如打印特定行、字段值过滤、字段计数等,帮助读者快速掌握awk在数据处理中的高效应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组

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 模式–动作 语句组成的序列。
本节的内容就到这里了,我们下节见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不务正业的攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值