Regex Awk:在文件中对数字和字符串进行平均
这是我的问题(不确定我的标题是否清晰),我必须在一个文件中显示数字的平均值。但是,文件中也有字符串。Regex Awk:在文件中对数字和字符串进行平均,regex,awk,Regex,Awk,这是我的问题(不确定我的标题是否清晰),我必须在一个文件中显示数字的平均值。但是,文件中也有字符串。 file: test Richie;jack;27 Yo;07Richiej@gmail.com Cash;tom;29 Yo;Ctom01@gmail.com Megane;susan;37 Yo;meganeSusan@gmail.com … 它必须显示我文件中的人的平均年龄,我不应该知道有多少人 我曾想过使用正则表达式只获取第三个字段中的数字,但每次都会出错。 awk
file: test
Richie;jack;27 Yo;07Richiej@gmail.com
Cash;tom;29 Yo;Ctom01@gmail.com
Megane;susan;37 Yo;meganeSusan@gmail.com
…它必须显示我文件中的人的平均年龄,我不应该知道有多少人 我曾想过使用正则表达式只获取第三个字段中的数字,但每次都会出错。
awk'BEGIN{FS=“;”}/计算第三列中数字的平均值:
$ awk -F\; '{s+=$3} END{print s/NR}' test
31
工作原理
-F\代码> 这告诉awk使用
代码>作为字段分隔符。因为
是一个shell活动字符,我们要么转义它(如上所示),要么引用它
对于读取的每一行,这会将第三列中的数字添加到s+=$3
。因为s
是一种算术运算,所以awk将第三个字段转换为数字 此代码还演示了awk将字段自动转换为数字:+=
当我们打印$ awk -F\; '{printf "field=\"%s\" number=%s\n", $3, $3+0}' test field="27 Yo" number=27 field="29 Yo" number=29 field="37 Yo" number=37
时,我们会得到完整的字符串,包括$3
。当我们打印Yo
时,将强制转换为一个数字,如上所示,我们只获得该数字$3+0
到达文件末尾后,这将打印第三列的总数,保存在END{print s/NR}
中,除以读取的行数,s
NR
print(NR?s/NR:0)
或类似工具来防止这种情况。另外,number=%s..3+0
可以写成number=%d...3
@EdMorton Good points。另一方面,被零除会导致awk返回非零退出代码,这可能是对空输入文件的适当响应,具体取决于代码的使用方式。