Bash 指定的特定员工的UNIX平均值
这是一个作为输入的文本文件示例Bash 指定的特定员工的UNIX平均值,bash,shell,unix,awk,grep,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
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
我目前的代码只是查找所有员工的平均值,但不起作用。我对壳牌公司不熟悉。这是我当前的代码
count="$(tail -n 1 salary.txt | grep -o '^[^\s]\+')"
echo "$count"
salary="$(grep -o '[^ ]\+$' salary.txt | paste -sd+)"
echo "$salary"
echo "($salary)/$count" | bc
我得到的结果是空值。这最好在awk中完成:
这最好在awk中完成:
由于OP请求脚本方式,所以请尝试以下操作,以脚本方式添加它,其中第一个参数作为输入文件名传递,第二个参数作为需要平均值的字符串传递
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"
现在按以下方式运行脚本
./script.ksh Input_file Analyst
50000
由于OP请求脚本方式,所以请尝试以下操作,以脚本方式添加它,其中第一个参数作为输入文件名传递,第二个参数作为需要平均值的字符串传递
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"
现在按以下方式运行脚本
./script.ksh Input_file Analyst
50000
是计算此类事件的有用工具:
$ datamash -sHt, groupby 2 mean 3 < employees.txt
与grep结合使用,将其限制为您感兴趣的标题。是计算此类内容的有用工具:
$ datamash -sHt, groupby 2 mean 3 < employees.txt
与grep结合使用,将其限制为您感兴趣的标题。如果您想在shell中执行此操作:
#!/bin/bash
file=$1
designation=$2
# code to validate user input here ...
sum=0
count=0
while IFS=, read -r n d s; do
if [[ ${designation,,} == "${d,,}" ]]; then
(( sum += s ))
(( count++ ))
fi
done < "$file"
if (( count == 0 )); then
echo "No $designation found in $file"
else
echo $((sum / count))
fi
如果要在shell中执行此操作:
#!/bin/bash
file=$1
designation=$2
# code to validate user input here ...
sum=0
count=0
while IFS=, read -r n d s; do
if [[ ${designation,,} == "${d,,}" ]]; then
(( sum += s ))
(( count++ ))
fi
done < "$file"
if (( count == 0 )); then
echo "No $designation found in $file"
else
echo $((sum / count))
fi
使用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
$
使用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
$
你可以在BASH中这样做,但是也许你应该考虑使用一种更通用的语言,比如AWK、Python或Ruby。将它们一个接一个地分开,然后运行shell中的每个子命令以查看它的功能。然后修改,直到它做正确的事情。你可以在BASH中这样做,但是也许你应该考虑使用一种更通用的语言,比如AWK、Python或Ruby。将它们一个接一个地分开,然后运行shell中的每个子命令以查看它的功能。然后修改,直到它做正确的事情。@John Doe,很好,你选择了正确的答案。我想在这里问您选择我的答案的原因,因为我已经按照您的要求编写了代码,尽管anubhava先生的代码很好,没有问题,请在这里提及。@John Doe,很好,您选择了正确的答案。我想在这里问你选择我的答案的原因,因为我已经按照你的要求编写了代码,尽管anubhava先生的代码很棒,没有问题,请在这里提及。