The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"скрипт на Bash"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Языки программирования)
Изначальное сообщение [ Отслеживать ]

"скрипт на Bash"  +/
Сообщение от Seelf email(ok) on 05-Май-12, 10:13 
Unix(bash) Файл состоит из нескольких столбцов. Найти среднее значение и ошибку в каждом столбце файла. Имя файла должно передаваться в качестве параметра командной строки. В случае направильного вызова должна выводиться справка об использовании скрипта.
Я целый день убил и так и несмог заставить скрипт делать это, я так понимаю это ерундовый скрипт и если кто знает помогите разобраться.
Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "скрипт на Bash"  +/
Сообщение от Zl0 (ok) on 05-Май-12, 11:32 
> Unix(bash) Файл состоит из нескольких столбцов. Найти среднее значение и ошибку в
> каждом столбце файла. Имя файла должно передаваться в качестве параметра командной
> строки. В случае направильного вызова должна выводиться справка об использовании скрипта.
>  Я целый день убил и так и несмог заставить скрипт делать
> это, я так понимаю это ерундовый скрипт и если кто знает
> помогите разобраться.

AWK?

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "скрипт на Bash"  +/
Сообщение от Andrey Mitrofanov on 05-Май-12, 12:01 
>> Unix(bash)
> AWK?

Нет уж, умерла, так умерла. Давайте плавучку на чистом баше делать!

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "скрипт на Bash"  +/
Сообщение от mrRadio on 05-Май-12, 12:39 
Потрудильсь хотябы указать пример входного файла, а то непонятно какие ошибки обрабатывать, и счтать ли среднеарифметическое если возникла ошибка.

#!/bin/sh

usage () {
        echo "./shell.sh -f имя_файла"
        exit 0
}

if [ $# -lt 2 ]
then
        usage
fi

while 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
--------------------

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

4. "скрипт на Bash"  +/
Сообщение от Andrey Mitrofanov on 05-Май-12, 12:45 
>while read line
>do
>        echo $line|awk '

[...]
> --------------------
> 22
> Ошибка: 2a не число!
> Ошибка: a1 не число!
> 57
> --------------------

""среднее значение и ошибку в каждом столбце файла""

Во-первых, "среднее" _по _столбцам.
Во-вторых, "ошибка" -- уж не статюотклонение ли??
В-третьих, "среднее" -- арифметическое, геометрическое??... ...медиана?!

---**Почём** нынче __постановка задачи__ для студентос обыкновенус??

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "скрипт на Bash"  +/
Сообщение от mrRadio on 05-Май-12, 13:24 
Эх, столбцы и строки перепутал, но если считать столбцы, еще проще получается через массивы awk


Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "скрипт на Bash"  –1 +/
Сообщение от Seelf email(ok) on 05-Май-12, 14:32 
Извините, а какая команда читает файл? и что делает usage? я чего-то не могу понять заранее извиняюсь за неграмотность, впервые сталкиваюсь с bash, и что за файл это shell.sh?
Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

7. "скрипт на Bash"  +/
Сообщение от Дядя_Федор on 05-Май-12, 15:02 
> Извините, а какая команда читает файл? и что делает usage? я чего-то
> не могу понять заранее извиняюсь за неграмотность, впервые сталкиваюсь с bash,
> и что за файл это shell.sh?

Господин Митрофанов, Вам не кажется, что Вы сделали товарищу то, что принято называть "медвежьей услугой"? :)))) Тут же совсем запущенный случай. ;)


Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. "скрипт на Bash"  +/
Сообщение от Andrey Mitrofanov on 05-Май-12, 15:04 
>  Господин Митрофанов, Вам не кажется, что Вы сделали товарищу то, что

Мопед не мой. Не я, в смысле. Я %>>уверен, я всё правильно сделал.

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

9. "скрипт на Bash"  –1 +/
Сообщение от Seelf email(ok) on 05-Май-12, 15:06 
я вот набрал код в linux, сделал файл исполняемым и запустил он выполнил команду echo и нарисовал точто под ковычками, а дальше не выполняется, я что-то неправильно делаю?)


Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

10. "скрипт на Bash"  +/
Сообщение от Seelf (ok) on 05-Май-12, 19:38 
Nu podskajite pojaluista kak sdelat' chtobi zarabotalo?
Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

11. "скрипт на Bash"  +/
Сообщение от mrRadio (ok) on 05-Май-12, 20:21 
Вот это файл shell.sh, чтобы его запустить нужно набрать в коммандной строке ./shell.sh -f ИМЯ_ВХОДНОГО_ФАЙЛА, в любом случае я ниправильно понял смысл задания и скрипт считает среднее значение СТРОК а не столбцов, для того чтобы скрипт работал корректно нужно переписать часть с awk, ищи информацию по awk и массивам в нем.
Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

12. "скрипт на Bash"  +/
Сообщение от seelf on 05-Май-12, 20:54 
> Вот это файл shell.sh, чтобы его запустить нужно набрать в коммандной строке
> ./shell.sh -f ИМЯ_ВХОДНОГО_ФАЙЛА, в любом случае я ниправильно понял смысл задания
> и скрипт считает среднее значение СТРОК а не столбцов, для того
> чтобы скрипт работал корректно нужно переписать часть с awk, ищи информацию
> по awk и массивам в нем.
Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

13. "скрипт на Bash"  +/
Сообщение от Seelf email(ok) on 05-Май-12, 21:17 
> Вот это файл shell.sh, чтобы его запустить нужно набрать в коммандной строке
> ./shell.sh -f ИМЯ_ВХОДНОГО_ФАЙЛА, в любом случае я ниправильно понял смысл задания
> и скрипт считает среднее значение СТРОК а не столбцов, для того
> чтобы скрипт работал корректно нужно переписать часть с awk, ищи информацию
> по awk и массивам в нем.

Я создал файл с расширением sh запустил его в терминале сначала chmod +x файл потом запустил его и он выполняет только echo, я вот недопонял надо-ли сам файл назвать shell b входной текстовый файл еще вот менять в коде прямо?

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

14. "скрипт на Bash"  +/
Сообщение от Seelf (ok) on 05-Май-12, 21:29 
Vse ponial, spasibo ogromnoe, kak stolbec iz faila v massiv zapisat'?
Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

15. "скрипт на Bash"  +/
Сообщение от Seelf (ok) on 06-Май-12, 00:43 
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!");\
Ответить | Правка | ^ к родителю #14 | Наверх | Cообщить модератору

16. "скрипт на Bash"  +/
Сообщение от mrRadio (ok) on 06-Май-12, 14:38 
Вот со столбцами:)

#!/bin/sh

usage () {
        echo "./shell.sh -f имя_файла"
        exit 0
}

if [ $# -lt 2 ]
then
        usage
fi

while 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

awk '\
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


Ответить | Правка | ^ к родителю #15 | Наверх | Cообщить модератору

17. "скрипт на Bash"  +/
Сообщение от Seelf (ok) on 06-Май-12, 17:47 
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
Ответить | Правка | ^ к родителю #16 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру