UNIX средняя по конкретному сотруднику по назначению

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

  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

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

1
задан 07.03.2019, 04:47

5 ответов

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

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

35125.00
0
ответ дан 14.05.2019, 01:30
  • 1
    It' s не очищаются мне точно, почему пример (4) является значительным, это не кажущийся обоснованно связываться с любыми из других. Но я добавил некоторый комментарий об этом. – John Bollinger 21.03.2019, 10:01

Не могли бы вы попробовать выполнить следующее (поскольку 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"

Теперь запустите скрипт следующим образом.

./script.ksh Input_file Analyst
50000
0
ответ дан 14.05.2019, 01:30
  • 1
    Самка @John, Хорошая, что Вы выбрали любой ответ как корректный. Хотел бы спросить Вас здесь причина de-selcting ответа шахты, так как я записал код согласно Вашему спрашивать (хотя anubhava sir' s код не является большим никакие проблемы с ним), упомяните здесь. – RavinderSingh13 08.03.2019, 00:53
  • 2
    Примером (4) я хочу смоделировать ситуацию с " формальное нарушение strict-aliasing" в " недостижимый оператор location" я предполагаю, что оба примера эквивалентны по модулю это свойство. – Павел 21.03.2019, 11:07

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

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

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

0
ответ дан 14.05.2019, 01:30
  • 1
    Таким образом, если пример (4) допустим, чем пример (3) допустим также. – Павел 21.03.2019, 11:19

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

#!/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
ответ дан 14.05.2019, 01:30
  • 1
    Я изменил пример (3) для использования функции longLongAssign. – Павел 21.03.2019, 11:35

Использование 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
ответ дан 14.05.2019, 01:30
  • 1
    Я уже установил тип контента как UTF-8 в почтовом шаблоне и также попробовал передачу тела электронного письма в функцию utf8_encoding, но it' s не работают на меня – Zedd Index 21.03.2019, 07:33

Теги

Похожие вопросы