Unix(bash) Файл состоит из нескольких столбцов. Найти среднее значение и ошибку в каждом столбце файла. Имя файла должно передаваться в качестве параметра командной строки. В случае направильного вызова должна выводиться справка об использовании скрипта.
Я целый день убил и так и несмог заставить скрипт делать это, я так понимаю это ерундовый скрипт и если кто знает помогите разобраться.
> Unix(bash) Файл состоит из нескольких столбцов. Найти среднее значение и ошибку в
> каждом столбце файла. Имя файла должно передаваться в качестве параметра командной
> строки. В случае направильного вызова должна выводиться справка об использовании скрипта.
> Я целый день убил и так и несмог заставить скрипт делать
> это, я так понимаю это ерундовый скрипт и если кто знает
> помогите разобраться.AWK?
>> Unix(bash)
> AWK?Нет уж, умерла, так умерла. Давайте плавучку на чистом баше делать!
Потрудильсь хотябы указать пример входного файла, а то непонятно какие ошибки обрабатывать, и счтать ли среднеарифметическое если возникла ошибка.#!/bin/sh
usage () {
echo "./shell.sh -f имя_файла"
exit 0
}if [ $# -lt 2 ]
then
usage
fiwhile getopts "f:" opt
do
case $opt in
f)
file_name=$OPTARG
if [ ! -f "$file_name" ]
then
echo "$file_name не найден!"
exit 0
fi
;;
*)
usage
;;
esac
done
shift $(($OPTIND -1))while read line
do
echo $line|awk '{\
count=NF;
for(i=1; i <= NF; i++){\
if($i ~ /^[0-9]*$/){\
sum=sum+$i\
}else{\
print("Ошибка: "$i" не число!");\
error=1\
}\
}\
}\
END{\
if(error != 1){\
print(sum/count)\
}\
}'
done < $file_nameВходной файл
---------
11 22 33
22 2a 11
a1 11 43
56 4 111
---------
Выходные данные
--------------------
22
Ошибка: 2a не число!
Ошибка: a1 не число!
57
--------------------
>while read line
>do
> echo $line|awk '[...]
> --------------------
> 22
> Ошибка: 2a не число!
> Ошибка: a1 не число!
> 57
> --------------------""среднее значение и ошибку в каждом столбце файла""
Во-первых, "среднее" _по _столбцам.
Во-вторых, "ошибка" -- уж не статюотклонение ли??
В-третьих, "среднее" -- арифметическое, геометрическое??... ...медиана?!---**Почём** нынче __постановка задачи__ для студентос обыкновенус??
Эх, столбцы и строки перепутал, но если считать столбцы, еще проще получается через массивы awk
Извините, а какая команда читает файл? и что делает usage? я чего-то не могу понять заранее извиняюсь за неграмотность, впервые сталкиваюсь с bash, и что за файл это shell.sh?
> Извините, а какая команда читает файл? и что делает usage? я чего-то
> не могу понять заранее извиняюсь за неграмотность, впервые сталкиваюсь с bash,
> и что за файл это shell.sh?Господин Митрофанов, Вам не кажется, что Вы сделали товарищу то, что принято называть "медвежьей услугой"? :)))) Тут же совсем запущенный случай. ;)
> Господин Митрофанов, Вам не кажется, что Вы сделали товарищу то, чтоМопед не мой. Не я, в смысле. Я %>>уверен, я всё правильно сделал.
я вот набрал код в linux, сделал файл исполняемым и запустил он выполнил команду echo и нарисовал точто под ковычками, а дальше не выполняется, я что-то неправильно делаю?)
Nu podskajite pojaluista kak sdelat' chtobi zarabotalo?
Вот это файл shell.sh, чтобы его запустить нужно набрать в коммандной строке ./shell.sh -f ИМЯ_ВХОДНОГО_ФАЙЛА, в любом случае я ниправильно понял смысл задания и скрипт считает среднее значение СТРОК а не столбцов, для того чтобы скрипт работал корректно нужно переписать часть с awk, ищи информацию по awk и массивам в нем.
> Вот это файл shell.sh, чтобы его запустить нужно набрать в коммандной строке
> ./shell.sh -f ИМЯ_ВХОДНОГО_ФАЙЛА, в любом случае я ниправильно понял смысл задания
> и скрипт считает среднее значение СТРОК а не столбцов, для того
> чтобы скрипт работал корректно нужно переписать часть с awk, ищи информацию
> по awk и массивам в нем.
> Вот это файл shell.sh, чтобы его запустить нужно набрать в коммандной строке
> ./shell.sh -f ИМЯ_ВХОДНОГО_ФАЙЛА, в любом случае я ниправильно понял смысл задания
> и скрипт считает среднее значение СТРОК а не столбцов, для того
> чтобы скрипт работал корректно нужно переписать часть с awk, ищи информацию
> по awk и массивам в нем.Я создал файл с расширением sh запустил его в терминале сначала chmod +x файл потом запустил его и он выполняет только echo, я вот недопонял надо-ли сам файл назвать shell b входной текстовый файл еще вот менять в коде прямо?
Vse ponial, spasibo ogromnoe, kak stolbec iz faila v massiv zapisat'?
Izvinite mrRadio vot u vas tut opredeliaetsia summa po strochke a dal'she delitsia na count chtob on stolbec schital chto vmesto NF doljno bit NF eto esli ia pravil'no ponial konec faila?
echo $line|awk '{\
count=NF;
for(i=1; i <= NF; i++){\
if($i ~ /^[0-9]*$/){\
sum=sum+$i\
}else{\
print("oshibka: "$i" ne chislo!");\
Вот со столбцами:)#!/bin/sh
usage () {
echo "./shell.sh -f имя_файла"
exit 0
}if [ $# -lt 2 ]
then
usage
fiwhile getopts "f:" opt
do
case $opt in
f)
file_name=$OPTARG
if [ ! -f "$file_name" ]
then
echo "$file_name не найден!"
exit 0
fi
;;
*)
usage
;;
esac
doneawk '\
BEGIN{\
line = 0;\
nf_count = 0\
}{\
line++;\
if(nf_count < NF){\
nf_count = NF\
}\
for(i = 1; i <= NF; i++){\
if($i ~ /^[0-9]*$/){\
arr[i] = arr[i] + $i\
}else{\
print("Ошибка: "$i" не число!")\
}\
}\
}\
END{\
for(count = 1; count <= nf_count; count++){\
print(arr[count]/line)\
}\
}' < $file_nameна вод:
1 2 3
3 a 5
6 7 8
на выходе:
Ошибка: a не число!
3,33333
3
5,33333
Blin a ia pitalsia vot etot for(i = 1; i <= NF; i++) vinesti pered awk chtob on pervii simvol linii smotrel a potom perehodil na sleduushuu strochku chtob stolbec poluchilsia