Это пример текстового файла, который должен быть введен в качестве ввода
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 -F, -v dgn='Engineer' '$2 == dgn{s += $3; ++c} END{printf "%.2f\n", s/c}' file.csv
35125.00
Не могли бы вы попробовать выполнить следующее (поскольку 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
GNU datamash - полезный инструмент для расчета такого рода вещей:
$ datamash -sHt, groupby 2 mean 3 < employees.txt
Объедините с grep
, чтобы ограничить его только названием, которое вас интересует. [ 114]
Если вы хотите сделать это в оболочке:
#!/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
$