awk算术运算

本文介绍了如何在awk中进行各种算术运算,包括加、减、乘、除、求余、开方等基本运算,以及调用数学函数如atan2、cos、exp等。还展示了awk处理数组进行复杂运算,如文件数据求和、平均数计算以及分组平均数的求解。此外,文章还提供了文件间数值相减的awk操作示例。

$ awk ‘BEGIN { print 13+3 }’ #加
16
$ awk ‘BEGIN { print 13-3 }’ #减
10
$ awk ‘BEGIN { print 13*3 }’ #乘
39
$ awk ‘BEGIN { print 12/3 }’ #除
4
$ awk ‘BEGIN { print 13/3 }’ #除
4.33333
$ awk ‘BEGIN { print 13%3 }’ #求余
1
$ awk ‘BEGIN { print 13%5 }’ #求余
3
$ awk ‘BEGIN { print 13^2 }’ #2次方
169
$ awk ‘BEGIN { print 13**2 }’ #2次方
169
$ awk ‘BEGIN { print -2 }’   #普通负数输出
-2

$ awk ‘BEGIN { print (2+10)/2+((3^2)/100) }’ #综合一点的运算
6.09
$ awk ‘BEGIN { x=”123″; print x-2 }’ #将字符串转换为数值来运算
121

2>. awk调用数学函数运算
函数名称            返回值
atan2(x,y)    y,x范围内的余切
cos(x)      余弦函数
exp(x)      求幂
int(x)      取整
log(x)      自然对数
rand()      随机数
sin(x)      正弦
sqrt(x)     平方根
srand(x)    x是rand()函数的种子

$ awk ‘BEGIN { print atan2(1,2) }’
0.463648
$ awk ‘BEGIN { print cos(3) }’
-0.989992
$ awk ‘BEGIN { print cos(0.9) }’
0.62161
$ awk ‘BEGIN { print int(1.9923) }’
1
$ awk ‘BEGIN { print int(4.9923) }’
4
$ awk ‘BEGIN { print exp(3) }’
20.0855
$ awk ‘BEGIN { print exp(4) }’
54.5982
$ awk ‘BEGIN { print log(4) }’
1.38629
$ awk ‘BEGIN { print rand() }’
0.237788
$ awk ‘BEGIN { print rand() }’
0.237788
$ awk ‘BEGIN { print rand(32) }’
awk: fatal: 1 is invalid as number of arguments for rand
$ awk ‘BEGIN { print sin(32) }’
0.551427
$ awk ‘BEGIN { print sqrt(4) }’
2
$ awk ‘BEGIN { print srand(4) }’
1
$ awk ‘BEGIN { print srand(10) }’
1
$ awk ‘BEGIN { srand(10); print rand()}’
0.255219
$ awk ‘BEGIN { srand(10); print rand() }’
0.255219
$ awk ‘BEGIN { srand(1000); print rand() }’
0.524085
$ awk ‘BEGIN { srand(10); print rand() }’
0.255219
$ awk ‘BEGIN { srand(10); print rand() }’
0.255219

3>. 利用数组做复杂的运算
将文件中的数据求和
$ cat file.txt
1
2
3
3
44
66
2
3
78
9900
235
$ awk ‘BEGIN {sum=0} {sum+=$0} END{print sum}’ file.txt
10337

求平均数:
$ awk ‘BEGIN {sum=0} {sum+=$0} END{print sum/FNR}’ file.txt
939.727

分组求平均:
$ cat gav.txt
1 100 10
1 200 20
1 300 30
1 500 20
2 100 3
2 300 5
$ awk -F” ” ‘{sum2[$1] += $2; sum3[$1] += $3; cnt[$1] += 1} END{for (i in sum2) print i, sum2[i]/cnt[i], sum3[i]/cnt[i]}’ gav.txt
1 275 20
2 200 4

数字的awk减法
我有两个文件,其记录值如下,现将此两文件地值做相减操作:
==> file1 <==
6
7
8
9
10

==> file2 <==
5
4
3
2
1
方法一)
$ awk ‘getline f1 < “file1″ { print $1 – f1 }’ file2
-1
-3
-5
-7
-9
方法二)
$ paste file1 file2 | awk ‘{ print $2 – $1 }’
-1
-3
-5
-7
-9
方法三)
$ paste -d- file2 file1|bc
-1
-3
-5
-7
-9

<think>好的,我现在需要回答用户关于awk命令中运算使用方法和示例的问题。首先,我得回顾一下用户提供的引用内容,虽然这些引用可能不完全相关,但需要从中提有用的信息。用户提到了三个引用,其中引用[2]和引用[3]涉及到awk的基本用法和模式匹配,但关于运算的部分可能没有详细说明。因此,我需要结合自己的知识来补充这部分内容。 首先,用户的问题集中在awk的运算功能上,包括算术运算、比较运算、逻辑运算、字符串运算等。我应该分门别类地讲解这些运算类型,并给出具体的示例,这样用户能够清晰地理解每个部分的应用场景。 接下来,我需要确保示例的正确性。比如,算术运算中的加减乘除、模等,可以通过处理文本中的数字字段来展示。例如,假设有一个包含数字的文本文件,计算第三列加第四列的和,或者计算某个字段的平方。同时,要注意使用$符号来引用字段,比如$3表示第三个字段。 然后是赋值运算,比如累加、自增等。这里可能需要用到变量,如total += $1来累加第一列的总和。在END块中输出结果,这样用户可以看到如何处理整个文件的数据。 比较运算方面,用户可能需要筛选满足条件的行,比如$3 > 50,这样会输出第三列大于50的行。逻辑运算则需要结合&&、||等操作符,例如同时满足两个条件的情况。这些示例需要具体,让用户能够直接应用到实际文本处理中。 字符串运算方面,连接字符串相对简单,用空格或逗号即可。但字符串长度可能需要使用length函数,比如length($2)获第二列的长度。此外,字符串匹配可以使用~操作符,比如$2 ~ /pattern/,这里需要确保用户理解正则表达式的应用。 数学函数部分,如sqrt、log、int等,需要举例说明如何在awk中调用这些函数。例如,计算第三列的平方根,或者对某个字段整。这些函数在处理数据时非常有用,特别是数据分析的场景。 三元运算符也是一个有用的功能,可以简化条件判断。例如,根据某个字段的值输出不同的结果,用条件表达式代替if-else语句,这样代码更简洁。 最后,用户可能需要一个综合示例来展示这些运算如何结合使用。例如,处理包含多个字段的数据文件,计算总分、平均分,并筛选符合条件的记录。这样的示例能够帮助用户整体理解awk的运算能力。 另外,用户要求生成相关问题,我需要思考与awk运算相关的常见问题,比如变量作用域、浮点数处理、自定义函数等。这些问题可以帮助用户进一步深入学习awk的高级功能。 在检查过程中,要确保所有的示例都符合LaTeX格式要求,行内公式用$...$,独立公式用$$...$$。同时,回答结构要清晰,分点说明,并确保每个示例的代码正确无误,避免语法错误。 最后,需要确认是否引用了提供的参考资料。虽然参考资料中关于运算的内容较少,但如果有相关部分,比如引用[3]中的基本用法,可以适当提及。不过,根据用户的问题,重点还是在于运算本身,因此可能引用较少,但需要确保引用标识正确添加。</think>### awk命令的运算使用详解 awk支持丰富的运算类型,包括算术运算、比较运算、逻辑运算、字符串运算等。以下通过具体示例说明其使用方法: --- #### 一、算术运算 1. **基本运算** ```bash # 计算第三列与第四列的和(假设数据列以空格分隔) awk '{sum = $3 + $4; print "Sum:", sum}' data.txt # 计算第二列的平方 awk '{square = $2^2; print "Square:", square}' data.txt ``` 2. **模运算** ```bash # 判断第五列是否为偶数 awk '{if ($5 % 2 == 0) print $0}' data.txt ``` 3. **赋值运算** ```bash # 累加第一列的总和并在结尾输出 awk '{total += $1} END {print "Total:", total}' data.txt # 自增计数器 awk '{count++; print "Line", count, ":", $0}' data.txt ``` --- #### 二、比较运算 1. **数值比较** ```bash # 筛选第三列大于50的行 awk '$3 > 50 {print "Valid:", $0}' data.txt ``` 2. **字符串匹配** ```bash # 匹配第二列以"error"开头的行 awk '$2 ~ /^error/ {print "Error found:", $0}' log.txt ``` --- #### 三、逻辑运算 ```bash # 组合条件:第一列>20且第三列<100 awk '$1 > 20 && $3 < 100 {print "Matched:", $0}' data.txt # 或条件:第二列为"warning"或"critical" awk '$2 == "warning" || $2 == "critical"' log.txt ``` --- #### 四、字符串运算 1. **字符串连接** ```bash # 合并第一列和第二列 awk '{combined = $1 "-" $2; print combined}' data.txt ``` 2. **字符串长度** ```bash # 获第二列的长度 awk '{len = length($2); print "Length:", len}' data.txt ``` --- #### 五、数学函数 ```bash # 计算第三列的平方根 awk '{sqrt_val = sqrt($3); print "Sqrt:", sqrt_val}' data.txt # 对第四列awk '{rounded = int($4); print "Rounded:", rounded}' data.txt ``` --- #### 六、三元运算符 ```bash # 根据分数判断等级(假设$3为分数) awk '{grade = ($3 >= 60) ? "Pass" : "Fail"; print $1, grade}' scores.txt ``` --- #### 综合示例 假设文件`scores.txt`内容如下: ``` Alice 85 90 Bob 72 68 Carol 95 88 ``` ```bash # 计算每人总分和平均分,并筛选总分>160的记录 awk '{ total = $2 + $3; avg = total / 2; if (total > 160) { print $1, "Total:", total, "Avg:", avg } }' scores.txt ``` **输出**: ``` Alice Total: 175 Avg: 87.5 Carol Total: 183 Avg: 91.5 ``` --- ### 注意事项 1. **变量作用域**:变量默认全局,使用`-v`定义局部变量,如`awk -v threshold=60 '$2 > threshold'`。 2. **浮点运算**:awk默认使用浮点运算,例如`3/2=1.5`。 3. **自定义函数**:可通过`function`关键字扩展功能[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值