LinuxForum.Fans
Тема

помогите с awk

Автор: sergey21 19 сообщений 5117 просмотров
#295378

здравствуйте. может кто-то знает, как решить данные задания. Очень срочно надо
1. В файле query4 определить среднюю сумму заказа для 1990 г.
2. В файле query4 определить количество пяродаж для каждого продавца
пример файла указан ниже
[url]s100.fotosklad.org.ua/20130110/84c4c67a48e5eeadca90b53239db9d5b1357817231.jpg[/url]

#295389
sergey21 написал:
здравствуйте. может кто-то знает, как решить данные задания. Очень срочно надо
1. В файле query4 определить среднюю сумму заказа для 1990 г.
2. В файле query4 определить количество пяродаж для каждого продавца
пример файла указан ниже
[url]s100.fotosklad.org.ua/20130110/84c4c67a48e5eeadca90b53239db9d5b1357817231.jpg[/url]

Есть учебник по awk. Там да же подобный пример есть.

#295392
CyberDaemon написал:

Есть учебник по awk. Там да же подобный пример есть.

как называется?

#295420
"sergey21" написал:
как называется?

Самый популярный - этот.

#295577

пример списка в файле:

Показать
612 ALLEN 104 15-JAN-91 5860
60S WARD 106 14-JUL-90 8314
620 TURNER 100 12-MAR-91 4450
613 TURNER 108 01-FEB-91 6400
614 MARTIN 102 01-FEB-91 23940
611 TURNER 10S O5-FEB-91 46310
618 MARTIN 102 15-FEB-91 3083
549 PETERS 226 2J-DEC-90 1620
516 PETERS 228 30-SEP-89 1815
5S3 PETERS 228 02-FEB-91 4400
526 WEST 221 04-MAR-90 7700
543 WEST 221 04-SEP-90 8400
555 WEST 221 04-MAR-91 8540
528 WEST 224 29-MAR-90 3770
558 WEST 224 31-MAR-91 1700
56S ROSS 227 01-JUN-91 4900
514 SHAW 2O1 10-OCT-91 1685
516 SHAW 201 13-OCT-91 2058.9
516 SHAW 201 13-OCT-91 2058.3

решение:

text
#!/bin/bash

A=($(cat query4|awk '{print $2}'|sort -u)) B=($(cat query4|awk '{print $2}'))

for i in ${!A[@]} do max=0 for b in ${!B[@]} do if [ "${A[$i]}" = "${B[$b]}" ]; then max=$[max+1] fi done echo ${A[$i]}=$max done

SUM=0 idx=0 C=($(cat query4|grep .-91|awk '{print $5}')) for c in ${!C[@]} do SUM=$(echo "scale=10;$SUM+${C[c]}"|bc) idx=$[idx+1] done SUM=$(echo "scale=10;$SUM/$idx"|bc) echo "SUM=$SUM"

Только объяснять что к чему на зло не буду :P

#295600
"ormorph" написал:
Только объяснять что к чему на зло не буду ae

Примеры можно решить, используя только awk, в одну строку.

#295648
"Lupo Alberto" написал:
Примеры можно решить, используя только awk, в одну строку.

Упс 8)

#295663
"sergey21" написал:
здравствуйте. может кто-то знает, как решить данные задания. Очень срочно надо
1. В файле query4 определить среднюю сумму заказа для 1990 г.
2. В файле query4 определить количество пяродаж для каждого продавца
пример файла указан ниже
s100.fotosklad.org.ua/20130110/84c4c67a … 817231.jpg

Да, данную операцию можно сделать в одну строчку, посмотри примеры хотя бы на википедии по awk. Вообщем, я взял твой пример, только не полностью, а несколько строк:

Показать

Итак, имеем

612 ALLEN 104 15-JAN-91 5678
605 WARD 106 14-JUL-90 8345
620 TURNEL 100 12-MAR-91 4450
613 TURNEL 108 01-FEB-91 6400
516 PETERS 228 15-FEB-90 4509
516 RETERS 226 30-SEP-89 4567

команда

less file | awk -F '[ ]' '{print $1,$2,$3,$4,$5}' | grep 90 | awk '{s = s + $5}
END {print ("Общая сумма заказа:" s)
print ("Средняя сумма заказа:" s/NR)}'
Общая сумма заказа:12854
Средняя сумма заказа:6427

Комментарии по команде - сначала выводишь файл на обработку awk, далее grep-ом выборку делаешь по 90 году и применяешь команду суммирования.
и вот вуаля все считает ;)

Проверку можешь сделать на калькуляторе - результат будет тот же самый. Это было первое задание. Сейчас второе напишу. Удачи)

#295665
"sergey21" написал:
здравствуйте. может кто-то знает, как решить данные задания. Очень срочно надо
1. В файле query4 определить среднюю сумму заказа для 1990 г.
2. В файле query4 определить количество пяродаж для каждого продавца
пример файла указан ниже
s100.fotosklad.org.ua/20130110/84c4c67a … 817231.jpg

Кстати эта команда считает по всему файлу, это я просто выписал для примера 6 строк. Потому что awk - потоковый редактор.

#295667

Вот решение второй задачи, тут еще проще

Показать

итак имеем, твой файл данных

612 ALLEN 104 15-JAN-91 5860
60S WARD 106 14-JUL-90 8314
620 TURNER 100 12-MAR-91 4450
613 TURNER 108 01-FEB-91 6400
614 MARTIN 102 01-FEB-91 23940
611 TURNER 10S O5-FEB-91 46310
618 MARTIN 102 15-FEB-91 3083
549 PETERS 226 2J-DEC-90 1620
516 PETERS 228 30-SEP-89 1815
5S3 PETERS 228 02-FEB-91 4400
526 WEST 221 04-MAR-90 7700
543 WEST 221 04-SEP-90 8400
555 WEST 221 04-MAR-91 8540
528 WEST 224 29-MAR-90 3770
558 WEST 224 31-MAR-91 1700
56S ROSS 227 01-JUN-91 4900
514 SHAW 2O1 10-OCT-91 1685
516 SHAW 201 13-OCT-91 2058.9
516 SHAW 201 13-OCT-91 2058.3

команду пишем:

less awkfile | awk -F '[ ]' '{print $1,$2,$3,$4,$5}' | grep WEST | wc -l
5

далее просто замени имя WEST на любое которое следует посчитать. И все вуаля узнаешь ответ. WEST продал 5 товаров))

#295671
"Linux777" написал:
less awkfile | awk -F '[ ]' '{print $1,$2,$3,$4,$5}' | grep WEST | wc -l

Сколько команд — столько и «ошибок» ;) Точнее, нерациональное их использование.

#295678

все работает. но можно и убрать эту часть

"Lupo Alberto" написал:
awk -F '[ ]' '{print $1,$2,$3,$4,$5}'
#295679

просто по аналогии с предыдущим примером, не стал заморачиваться. там то эти комнады нужны. чтобы обработать файл на заданный параметр 90

#295680
"Linux777" написал:
все работает. но можно и убрать эту часть

Можно и вручную посчитать. Название темы предполагает использование awk.

#295681

просто по аналогии с предыдущим примером, не стал заморачиваться. там то эти комнады нужны. чтобы обработать файл на заданный параметр 90

#295694
"Lupo Alberto" написал:
Можно и вручную посчитать. Название темы предполагает использование awk.

кстати, можно да вручную, но только если строк файле немного, как в данном примере, каждого юзера посчитать легко. а если файл с 2000 строк, тогда никак не обойтись без команд, что я писал выше. Так что это даст возможность хоть разобраться с синтаксисом awk автору данной темы :)

#295741
"Linux777" написал:
кстати, можно да вручную

Это был сарказм.

"Linux777" написал:
Так что это даст возможность хоть разобраться с синтаксисом awk автору данной темы ab

...если бы синтаксис в вашем примере был правильный.

#295797

Я не понял только, как на счет чисел с плавающей точкой?

text
less file | grep .-91| awk '{s = s + $5} END{print "сумма = " s}'

Зы: где две десятые?

#295928
"Lupo Alberto" написал:
...если бы синтаксис в вашем примере был правильный.

он правильный. не соглашусь с Вами. Если были ошибки, то ответа бы не получилось. Это как в написание кода, при запуске обработчика вылезают ошибки, значит надо править.

Войдите или зарегистрируйтесь, чтобы ответить.