The AWK Programming Language学习笔记(一)快速入门

一    开始

---  '练习文本'  ---

数据特点: 雇员'名字'、雇员'每小时工资' (以美元为单位)、'工作时长';每一行代表一个'雇员的记录'

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 -->'绝对值'

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值