这是一个文本文件的示例,可以作为输入
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
我得到空值作为结果。
答案 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
$