UNIX按指定的特定员工的平均值

时间:2019-03-06 15:36:36

标签: bash shell unix awk grep

这是一个文本文件的示例,可以作为输入

  Name,Designation,Salary
  Hari,Engineer,35000
  Suresh,Consultant,80000
  Umesh,Engineer,45500
  Maya,Analyst,50000
  Guru,Consultant,100000
  Sushma,Engineer,30000
  Mohan,Engineer,30000

我的代码应该能够找到特定雇员的平均工资。例如,

bash script.sh employees.txt Analyst

然后我的输出应该是

50000

我当前的仅查找所有员工平均值的代码不起作用。我是Shell的新手。这是我当前的代码

count="$(tail -n 1 salary.txt | grep -o '^[^\s]\+')"

echo "$count"
salary="$(grep -o '[^ ]\+$' salary.txt | paste -sd+)"

echo "$salary"

echo "($salary)/$count" | bc 

我得到空值作为结果。

5 个答案:

答案 0 :(得分:3)

最好在awk中完成

awk -F, -v dgn='Engineer' '$2 == dgn{s += $3; ++c} END{printf "%.2f\n", s/c}' file.csv

35125.00

答案 1 :(得分:1)

您能否请尝试以下操作(由于以脚本方式请求了OP,因此请以脚本方式添加它,其中将第一个参数作为Input_file名称,第二个参数作为需要avg的字符串)。

cat script.ksh
file="$1"
name="$2"

awk -F, -v field="$name" '{a[$2]+=$3;b[$2]++} END{for(i in a){if(i == field){print a[i]/b[i]}}}'  "$file"

现在以follwos身份运行脚本。

./script.ksh Input_file Analyst
50000

答案 2 :(得分:0)

GNU datamash是用于计算这种事情的有用工具:

$ datamash -sHt, groupby 2 mean 3 < employees.txt

grep组合以将其限制为仅您感兴趣的标题。

答案 3 :(得分:0)

如果要在外壳中执行此操作:

a := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
partition.ToFunc(len(a), 5, func(l int, h int) {
    fmt.Printf("Part: %v\n", a[l:h])
})
// Output:
// Part: [1 2 3 4 5]
// Part: [6 7 8 9]

答案 4 :(得分:0)

使用Perl

 perl -F, -lane ' if(/Engineer/) { $dsg+=$F[2];$c++ } END { print $dsg/$c } ' file

使用您给定的输入

$ cat john.txt
  Name,Designation,Salary
  Hari,Engineer,35000
  Suresh,Consultant,80000
  Umesh,Engineer,45500
  Maya,Analyst,50000
  Guru,Consultant,100000
  Sushma,Engineer,30000
  Mohan,Engineer,30000

$ perl -F, -lane ' if(/Engineer/) { $dsg+=$F[2];$c++ } END { print $dsg/$c } ' john.txt
35125

$