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先生的代码很棒,没有问题,请在这里提及。