我正在努力变得更熟悉 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