【问题标题】:Write a shell script to calculate the number of employees编写一个shell脚本来计算员工人数
【发布时间】:2021-02-24 17:11:50
【问题描述】:

我需要找出工资低于所有员工平均工资的员工数量。

当您的脚本运行时,包含员工详细信息的文件将作为命令行参数提供 例子->

输入:文件:

empid;empname;salary
100;A;30000
102;B;45000
103;C;15000
104;D;40000

输出: 2

我的解决方案->

f=`awk -v s=0 'BEGIN{FS=":"}{if(NR>1){s+=$3;row++}}END{print s/row}' $file`;

awk -v a="$f" 'BEGIN{FS=":"}{if(NR!=1 && $3<a)c++}END{print c}' $file;

这是我迄今为止尝试过的 但输出结果是 0

【问题讨论】:

    标签: bash shell


    【解决方案1】:

    这一行应该可以解决问题:

    awk -F';' 'NR>1{e[$1]=$3;s+=$3}
          END{avg=s/(NR-1);for(x in e)if(e[x]<avg)c++;print c}' file
    

    如果您使用示例文件运行它,它将打印:

    2
    

    解释:

    • NR&gt;1跳过标题
    • e[$1]=$3;s+=$3 : 建立一个哈希表,并对薪水求和
    • END{avg=s/(NR-1);:计算平均值
    • for(x in e)if(e[x]&lt;avg)c++;print c :遍历哈希表,计算元素的值,&lt; avg 的值并输出。

    【讨论】:

    • 解决方案完美!我的解决方案中有一个问题,即使我将“:”替换为“;”仍然输出为 0 感觉就像第二行代码 {if(NR!=1 && $3
    • @chirag 当您在两行中将: 替换为; 时,请在第一个命令之后尝试echo "f=$f"
    • @chirag 你没有使用你在第一张照片中创建的$f。顺便说一句,一般来说,如果我们可以在单个进程中解决问题,我们应该使用一个进程。
    • @WalterA 输出结果为 f=32500
    • @Kent 能否请您参考一些课程或网站或书籍,从中我可以了解更多关于 awk 脚本的知识。
    【解决方案2】:

    请您尝试关注一下。

    awk '
    BEGIN{
      FS=";"
    }
    FNR==NR{
      if(FNR>1)
      {
        total+=$NF
        count++
      }
      next
    }
    FNR==1{
      avg=total/count
    }
    avg>$NF
    '  Input_file  Input_file
    

    【讨论】:

      【解决方案3】:

      除了设置FS=":",你的脚本很好;它应该设置FS=";",因为这是在输入中分隔您的字段的原因。

      【讨论】:

      • 即使将“:”替换为“;”仍然输出为 0 感觉就像第二行代码 {if(NR!=1 && $3
      • ¯_(ツ)_/¯ 我剪切并粘贴了您的代码和您的输入,并在两个地方更新了FS=,我得到了正确的结果。
      【解决方案4】:
      avg=$(awk -F";" 'NR>1 { s+=$3;i++} END { print s/i }' f)
      awk -v avg=$avg -F";" 'NR>1 && $3<avg'  f
      

      1) 忽略标头并计算平均值,avg

      2) 忽略标题,如果薪水低于平均打印率

      【讨论】:

        【解决方案5】:
        file=$1
        salary=`sed "s/;/ /" $file | sed "s/;/ /" | awk '{print $3}' | tail -n+2`
        sum=0
        n=0
        
        for line in $salary
        do
            ((sum+=line))
            ((n++))
        done
        
        avg=$((sum / n))
        count=0
        
        for line in $salary
        do
            if [ $line -lt $avg ]
            then
                 ((count++))
            fi
        done
        
        echo "No. of Emp : $count"
        

        【讨论】:

          猜你喜欢
          • 2021-08-07
          • 2012-02-23
          • 2018-09-22
          • 1970-01-01
          • 2023-03-14
          • 2020-07-22
          • 1970-01-01
          • 2012-08-22
          • 1970-01-01
          相关资源
          最近更新 更多