我有一个包含信息的文件:
Name Rate Hours
Clark 8.5 42
Sarah 18.5 19
Joe 10 25
Paul 12 5
我想计算总工资每个员工。
但我无法让我的循环工作,因为我不确定文件开头的标题 ( , , )i <=
应该导致什么。Name
Rate
Hours
到目前为止我有这个:
awk 'BEGIN{
total = 0;
}
{
rate = $2;
hours = $3;
for (i = 1; i<= NR; i++)
{
total = rate * hours;
}
}
END {
print "Total = $" total;
}' testfile.dat
先谢谢您的帮助!
答案1
作为替代方案,类似这样的方法可以正常工作并且有很好的输出:
awk -v OFS="\t" 'NR==1{$4="total"}NR>1{$4=$2*$3}1' testfile.dat
#Output:
Name Rate Hours total
Clark 8.5 42 357
Sarah 18.5 19 351.5
Joe 10 25 250
Paul 12 5 60
答案2
awk 在大部分脚本周围放置了一个隐式循环:除了BEGIN
andEND
块(和函数定义)之外,脚本按顺序运行每一行。因此,像 awk 脚本中那样有一个循环会很奇怪for (i = 1; i<= NR; i++)
:当 awk 执行第一行时,执行循环体 for i=1
,然后 awk 执行第二行,执行循环体 fori=1
和i=2
,然后 awk 执行第二行和循环体针对i=1
andi=2
和i=3
等执行。
假设员工姓名不重复,那么每个员工的总工资就是$2 * $3
。如果需要,您可以打印出来:
NR == 1 { print $1, $2, $3, "total" }
NR != 1 { print $1, $2, $3, $2 * $3 }
(条件NR == 1
标识标题行。)
所有员工的总工资是除标题行之外的每一行的该表达式的总和。要计算所有员工的总工资,请将当前员工的工资添加到运行总计中。
NR != 1 { total += $2 * $3 }