UNIX средняя по конкретному сотруднику по назначению - PullRequest
1 голос
/ 06 марта 2019

Это пример текстового файла, который должен быть введен в качестве ввода

  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 

В результате я получаю пустые значения.

Ответы [ 5 ]

3 голосов
/ 06 марта 2019

Это лучше сделать в awk:

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

35125.00
1 голос
/ 06 марта 2019

Не могли бы вы попытаться выполнить следующее (поскольку OP запрашивает путь сценария, поэтому добавьте его способом сценария, в котором 1-й аргумент передается как имя файла Input_file, а 2-й аргумент - как строка, для которой требуется 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
0 голосов
/ 06 марта 2019

Использование 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

$
0 голосов
/ 06 марта 2019

Если вы хотите сделать это в оболочке:

#!/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
0 голосов
/ 06 марта 2019

GNU datamash - это полезный инструмент для расчета такого рода вещей:

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

Объедините с grep, чтобы ограничить его только названием, которое вас интересует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...