awk:如何循环遍历文件以获取每一行?

awk:如何循环遍历文件以获取每一行?

我有一个包含信息的文件:

Name   Rate   Hours



Clark  8.5    42
Sarah  18.5   19 
Joe    10     25
Paul   12     5

我想计算总工资每个员工。

但我无法让我的循环工作,因为我不确定文件开头的标题 ( , , )i <=应该导致什么。NameRateHours

到目前为止我有这个:

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 在大部分脚本周围放置了一个隐式循环:除了BEGINandEND块(和函数定义)之外,脚本按顺序运行每一行。因此,像 awk 脚本中那样有一个循环会很奇怪for (i = 1; i<= NR; i++):当 awk 执行第一行时,执行循环体 for i=1,然后 awk 执行第二行,执行循环体 fori=1i=2,然后 awk 执行第二行和循环体针对i=1andi=2i=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 }

相关内容