如何使用 awk 跨记录添加同一行中的项目?

如何使用 awk 跨记录添加同一行中的项目?

我正在努力变得更熟悉 awk。我制作了这个 .txt 文档,我将其命名为 food.txt,但令我恼火的是,我不知道如何将产品的价格加在一起。以这个txt文件为例:

Milk dairy 3.89
Cheese dairy 2.12
Eggs produce 1.28
Yogurt dairy 1.49
Chicken produce 2.19
Muffin pastries 0.49
Cookie pastries 0.99

第一行/字段是商品名称,第二行/字段是类别,最后一行/字段是价格。

我希望能够做两件事。

首先,我想将文件中的所有价格加在一起,然后求平均值。我的输出应该是 1.78(向上舍入)。

其次,我想添加所有乳制品的价格,并找到乳制品的平均价格。在这种情况下,我的输出应该是 2.50。

我对 awk 有点陌生,所以我不确定我的 txt 文档是否需要工作。我自己做的只是为了实验。

这是我尝试过的代码,我不确定为什么它不起作用。

BEGIN{ avg = 0 }

{
   total = 0
     for(i = 3; i <= NF; i++)
       if ($2 == "dairy")
       total = total +$i
   avg += total
}

END{
        print "Total Dairy Price Average =  $" avg/NR
}

我想,从第三个字段开始,如果第二个字段是乳制品,它将设置总计=总计+$i。那么平均值+=总计。但是当我运行这个程序时,它给我的结果是 1.07 之类的,这离我还很远。

答案1

Awk方法:

$ awk '{ cat=$(NF-1); a[cat] += $NF; sum += $NF; b[cat]++ }
       END{ for (cat in a) print cat, a[cat]/b[cat]; print "all avg", sum/NR }' file

输出:

dairy 2.5
produce 1.735
pastries 0.74
all avg 1.77857

答案2

首先,我想将文件中的所有价格加在一起,然后求平均值。我的输出应该是 1.78(向上舍入)。

请注意,NR在处理文件时包含当前行号,在END子句中它将告诉您总行数,例如:

awk '{ sum+=$3 } END { print sum, sum/NR }'

或者使用四舍五入的数字:

awk '{ sum+=$3 } END { print sum, sum/NR }' OFMT='%.2f'

其次,我想添加所有乳制品的价格,并找到乳制品的平均价格。在这种情况下,我的输出应该是 2.50。

您几乎没有使用 awk 附带的任何内置功能,例如每个语句都包含boolean_expression { actions }.因此,仅对以下行执行操作$2 == "dairy"

awk '$2 == "dairy" { sum+=$3; count++ } END { print sum, sum/count }'

答案3

由于OP要求一些解释,因此尝试这样做。答案基于 RomanPerekhrest 的答案,但略有不同。

#!/bin/awk -f

{ 
    products = $2 # Store the second field in products
    a[products] += $NF # Increment each item in the array. $NF denotes the last field. 
    total += $NF # This is the total count of the last field all together resulting in a total of:  12.45
    pr[products]++  #increment by 1 if item found in second field. For dairy this should be 3
} 
END { 
    for (products in a)  # for loop
      print products, a[products] / pr[products]  # print product name, total of products / products found
      printf("All avg: %.2f\n", total/NR); # Print average of all products. So 12.45 / 7 = 1.778571
}

调用脚本如下:

chmod u+x myawkscript.awk && ./myawkscript.awk inputfile 

答案4

产品总平均值

total_number_of_produts=`awk 'END{print NR}' filename`

awk -v t0="$total_number_of_produts" 'BEGIN{sum=0}{sum=sum+$NF}END{print sum/t0}' filename

output
1.777 (1.78)

乳制品平均值

da=`awk '/dairy/{print NR}' filename | wc -l`

awk -v t0="$total_number_of_produts" 'BEGIN{sum=0}{sum=sum+$NF}END{print sum/t0}' filename 


output
2.5

相关内容