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


哇,没想到会这样!我认为它忽略了$3.nitpick中的not number元素——当在空文件上运行时,这将产生一个零除错误。您应该使用
print(NR?s/NR:0)
或类似工具来防止这种情况。另外,
number=%s..3+0
可以写成
number=%d...3
@EdMorton Good points。另一方面,被零除会导致awk返回非零退出代码,这可能是对空输入文件的适当响应,具体取决于代码的使用方式。