Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Помогите пжста новичку Shell-процедуре / 25 сообщений из 34, страница 1 из 2
31.05.2007, 22:43:04
    #34566295
Vladao
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
Ребят, привет! С Unix я на "Вы", поэтому прошу у вас помощи для дальнейшего его освоения
вместе с shell-программингом. Сделал пункты 1) 2), а вот 3) 4) - шляпа...:(( Помогите советом, кто
каким может. Спасибо!
Написать shell-процедуру, которая выполняет действия:
1)читает содержимое файла, передаваемого в качестве первого параметра;
2)создаёт новый файл, имя которого передаётся в качестве второго параметра;
3)выводит на экран каждые 7 сек очередную строку первого файла;
4)сортирует все выделенные на экран строки первого файла по длине и записывает их в новый файл;
при вводе с клавиатуры слова quit удаляет новый файл и завершате работу
...
Рейтинг: 0 / 0
01.06.2007, 02:01:31
    #34566434
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
не знаю, правильно ли я понял
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
!/bin/sh

fname1=$ 1 
fname2=$ 2 

bIFS=IFS
IFS="
"
set `cat $fname1`

for i in $*
do
 echo $i
 sleep  7 
done


for i in $*
do
 echo $i
done | awk '{arr[length($0)]=$0}END{for (i in arr){print i "separator" arr[i]}}' | sort -n -t xaxa + 1  |
 sed s/^[ 0 - 9 ]*separator// > $fname2

IFS=$bIFS

read a
[ "$a" = "quit" ] && {
rm $fname2
exit
}
...
Рейтинг: 0 / 0
01.06.2007, 02:44:26
    #34566448
Ося
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
2 автор

не совсем понятно авторсортирует все выделенные на экран строки первого файла по длине и записывает их в новый файл;
при вводе с клавиатуры слова quit удаляет новый файл и завершате работу

что значит выделенные

2 null

у вас последовательное исполнение 3 и 4, мне каэца ,автор хотел параллельно...
...
Рейтинг: 0 / 0
01.06.2007, 03:14:11
    #34566456
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
Vladao wrote:

> 1)читает содержимое файла, передаваемого в качестве первого параметра;
cat файл_аргумент
> 2)создаёт новый файл, имя которого передаётся в качестве второго
cat файл_аргумент > новый_файл
3)выводит на экран каждые 7 сек очередную строку первого файла;
команды read, sleep

> 4)сортирует все выделенные на экран строки первого файла по длине и
sort

> записывает их в новый файл; при вводе с клавиатуры слова quit удаляет
> новый файл и завершате работу
непонятно.

можно почитать info bash.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
01.06.2007, 10:38:06
    #34566828
Умаксуман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
VladaoРебят, привет! С Unix я на "Вы", поэтому прошу у вас помощи для дальнейшего его освоения
вместе с shell-программингом. Сделал пункты 1) 2), а вот 3) 4) - шляпа...:(( Помогите советом, кто
каким может. Спасибо!
Написать shell-процедуру, которая выполняет действия:
1)читает содержимое файла, передаваемого в качестве первого параметра;
2)создаёт новый файл, имя которого передаётся в качестве второго параметра;
3)выводит на экран каждые 7 сек очередную строку первого файла;
4)сортирует все выделенные на экран строки первого файла по длине и записывает их в новый файл;
при вводе с клавиатуры слова quit удаляет новый файл и завершате работу

- А Вы с компьютером на "Вы" или на "ты"?
- Я с ним на "иоптвоюмать"
...
Рейтинг: 0 / 0
01.06.2007, 14:33:09
    #34568007
Vladao
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
Умаксуман
- А Вы с компьютером на "Вы" или на "ты"?
- Я с ним на "иоптвоюмать"
Умаксуман, я с компом, ну как это по-культурней выразиться...

ErV, вот сижу читаю info bash...

-null-, спасибо большое, что отозвался помочь, только поясни вот эту строчку:
awk '{arr[length($0)]=$0}END{for (i in arr){print i "separator" arr}}' | sort -n -t xaxa +1 |
sed s/^[0-9]*separator//

Спасибо всем:)
...
Рейтинг: 0 / 0
01.06.2007, 14:48:05
    #34568092
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
этой строчкой я сортирую строки по длине.
Можно и по-другому придумать.

А вообще честно говоря задание мутно сформулировано, в том плане, что можно не однозначно понимать написанное (см. вопрос Оси)
...
Рейтинг: 0 / 0
01.06.2007, 15:18:20
    #34568241
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
Кстати, вот как в Unix Power Tools О'Релли сделана сортировка строк по длине (lensort)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
#!/bin/sh
awk 'BEGIN { FS=RS }
{ print length, $0 }' $* |
# Sort the lines numerically
sort +0n - 1  |
# Remove the length and the space and print each line
sed 's/^[0-9][0-9]* //'
...
Рейтинг: 0 / 0
01.06.2007, 15:19:21
    #34568246
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
так что я че-то перемудрил спросоня :)
...
Рейтинг: 0 / 0
01.06.2007, 15:20:19
    #34568251
Vladao
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
--null--, покажи лучше как по-другому, можно ведь и через expr() и sort() сделать, просто объясни как с помощью них всё прально выполнить... Спасибо:)
...
Рейтинг: 0 / 0
01.06.2007, 15:55:18
    #34568461
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
Vladao wrote:

> ErV, вот сижу читаю info bash...
Ещё есть смысл системные скрипты почитать.

> -null-, спасибо большое, что отозвался помочь, только поясни вот эту
> строчку:
Это по пунктам - вызов awk, передача (значок трубы) результата его работы в
sort, передача результата работы sort в sed.
По всем трем есть мануалы. С awk'ом еще не общался, разобраться можно было
бы, но мне влом. Судя по всему там идет циклическая печать исходных
аргументов, которые представлены как массив (зы а что вы перл не
юзаете ?:)). "sed s/^[0-9]*separator//" удаляет из вывода сорт все строки
(пардон, выражения), которые соответствуют шаблону: начинаются с начала
строки, после чего идет произвольное число цифр ([0..+бесконечность)),
затем "separator".
опять же можно почитать маны по регэкспам, они должны быть в man 7 regex,
man perlre и man sed, по-любому ещё где-то описаны...

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
01.06.2007, 16:21:52
    #34568599
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
получается что так.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
#!/bin/sh

fname1=$ 1 
fname2=$ 2 

bIFS=$IFS
IFS="
"
set `cat $fname1`

for i in $*
do
 echo $i
 sleep  7 
done


for i in $*
do
 echo $i
done | awk 'BEGIN { FS=RS } { print length, $0 }' $* | sort +0n - 1  | sed 's/^[0-9][0-9]* //' > $fname2

IFS=$bIFS

read a
[ "$a" = "quit" ] && {
rm $fname2
exit
}


ErV не perl, а awk, потому что товарищу на shell надо, а awk это все-таки unix utils

в случае perl сортировка конечно интеллигентнее получается

Код: plaintext
1.
2.
3.
4.
5.
6.
...
for i in $*
do
 echo $i
done   | perl -ne '@_=<>;print(sort {length($a)<=>length($b)} @_)' > $fname2
...
...
Рейтинг: 0 / 0
01.06.2007, 16:36:19
    #34568680
Vladao
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
Ося
что значит выделенные

Извеняюсь, конеш не выделенные, а выведенные

Ребят, а можно обойти все эти ухищрения наподобие awk и perl для сортирвки по длине
чем нибудь по-проще, просто мне это надо сделать в Korn/Bourne-shell...С помощью expr() и sort()
я всё это делаю в теории, а вот как это будет в практике...не знаююю...Помогите с практикой please
...
Рейтинг: 0 / 0
01.06.2007, 17:46:35
    #34569030
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
Думаю, что с awk самое оно. Вот и TOR в своей книжке советует, а он авторитет, как-никак
Дело в том, что sort не умеет сортировать по длине строк, насколько я знаю.
Посему придется извращаться всяко дело:
длину строки обычно можно узнать awk-ом, perl-ом или expr (и то не везде)
и дальше именно так действовать как в ранее приведенном.
Ещё некоторые версии команды test умеют сравнивать строки по длине - но тогда придется алгоритм сортировки писать.

да, можно без awk обойтись и вычислять expr-ом длину

Код: plaintext
1.
2.
3.
4.
for i in $*
do
 echo $i
done  | while read a; do echo `expr length "$a"`-$a ; done | sort -t- +0n  | sed s/[ 0 - 9 ]*-//

но мне это не нравится, ибо данная опция expr есть не во всех версиях.
...
Рейтинг: 0 / 0
02.06.2007, 00:48:08
    #34569572
Vladao
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
--null-- , спасибо тебе за советы дельные:)
Подскажи, а можно строчки
bIFS=$IFS
IFS="
"
чем-то другим, более простым-понятным заменить?
А что вот это +0n в строчке sort значит?
...
Рейтинг: 0 / 0
02.06.2007, 02:42:19
    #34569601
ErV
ErV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
Vladao wrote:

> Ребят, а можно обойти все эти ухищрения наподобие awk и perl для сортирвки
> по длине
По-моему на шелле можно забабахать обычную тупую процедуру сортировки. Т.е.
создать массив, считать туда строки, а потом его отсортировать так же, как
на любом другом языке программирования, ибо циклы на шелле пишутся без
проблем. Особых сложностей пока не вижу, разве что тормоза могут быть, если
сильно перезагнаться.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
02.06.2007, 04:18:52
    #34569608
DocAl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
Коллеги, я что-то не пойму, или вы просто забыли о ключике -m у wc?
...
Рейтинг: 0 / 0
02.06.2007, 10:21:52
    #34569663
Vladao
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
Всем привет:) У меня Korn-shell конструкцию
bIFS=$IFS
IFS="
"
не принимает...Что делать?? Она здесь обязательна? Посоветуйте альтернативу пжста
...
Рейтинг: 0 / 0
02.06.2007, 11:06:07
    #34569684
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
DocAlКоллеги, я что-то не пойму, или вы просто забыли о ключике -m у wc?
Хороший ключик. Но есть проблема: не везде он присутствует.

авторbash-2.05$ uname -v
FreeBSD 4.4-RELEASE #4:
bash-2.05$ echo hello | wc -m
wc: illegal option -- m
usage: wc [-clw] [file ...]

В линухе есть, в FreeBSD 6x есть.
...
Рейтинг: 0 / 0
02.06.2007, 11:36:04
    #34569703
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
под ksh тоже работает - KSH v5.2.14
хотя его преимуществ не исполбзует - ориентирована на Bourne Shell
немного подсократил еще...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
#!/bin/ksh


fname1=$ 1 
fname2=$ 2 


bIFS=$IFS
IFS="
"
set `cat $fname1`

for i in $*
do
 echo $i
 sleep  7 
done



for i in $*
do
 echo $i
done |  awk '{print length($0)"-"$0}' | sort -t- + 0  -n | sed s/^[ 0 - 9 ]*-// > $fname2

IFS=$bIFS


read a
[ "$a" = "quit" ] && {
rm $fname2
exit
}
...
Рейтинг: 0 / 0
02.06.2007, 13:44:34
    #34569764
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
ErV
Vladao wrote:

> Ребят, а можно обойти все эти ухищрения наподобие awk и perl для сортирвки
> по длине
По-моему на шелле можно забабахать обычную тупую процедуру сортировки. Т.е.
создать массив, считать туда строки, а потом его отсортировать так же, как
на любом другом языке программирования, ибо циклы на шелле пишутся без
проблем. Особых сложностей пока не вижу, разве что тормоза могут быть, если
сильно перезагнаться.
Posted via ActualForum NNTP Server 1.4


Специально для извращенцев - Korn Shell с пузырьковой сортировкой

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
#!/bin/ksh

fname1=$ 1 
fname2=$ 2 

bIFS=$IFS
IFS="
"
set -A arr `cat $fname1`
IFS=$bIFS



bubble()
{
i= 1 
while [ "$i" -ne "${#arr[*]}" ]
do
 let j=${#arr[*]}- 1 
 while [ "$j" -ge "$i" ]
  do
   let tmp_i=$j- 1 
   [ `echo "${arr[$tmp_i]}" | wc -c | sed -e "s/^ *//"` -gt `echo "${arr[$j]}" | wc -c | sed -e "s/^ *//"` ]  && {
    tmp=${arr[$tmp_i]}
    arr[tmp_i]=${arr[j]}
    arr[j]=$tmp
    }
    let j=--
  done
let i=++
done
}

i= 0 
while [ "$i" -ne "${#arr[*]}" ]
do
 echo ${arr[$i]}
 let i=++
 sleep  7 
done

bubble



i= 0 
while [ "$i" -ne "${#arr[*]}" ]
do
 echo ${arr[$i]}
 let i=++
done > $fname2


read a
[ "$a" = "quit" ] && {
rm $fname2
exit
}
...
Рейтинг: 0 / 0
02.06.2007, 13:50:12
    #34569768
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
VladaoПодскажи, а можно строчки
bIFS=$IFS
IFS="
" чем-то другим, более простым-понятным заменить?
А что вот это +0n в строчке sort значит?


без IFS все будет намного скучнее.
Например, пришлось бы так заполнять массив в предыдущем примере

Код: plaintext
1.
2.
3.
4.
5.
6.
i= 0 
while read a
do
 arr[$i]=$a
 let i=++
done <$fname1
или аналогично псевдомассив $@, думаю, понятно как, но нафига всё это, ио есть IFS и set

А в sort +0n означает сортировать по полю номер 0, сравнивая как числа
...
Рейтинг: 0 / 0
02.06.2007, 14:47:08
    #34569786
Vladao
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
--null-- , спасибо за альтернативу, полезная вещь, но буду впредь использовать IFS:)
Скучно не будет!:) А вот если мне проверить вводимые параметры, то использовать надо команду test?
...
Рейтинг: 0 / 0
02.06.2007, 15:02:16
    #34569791
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
ну да. Проверить существование файла, из которго собираемся читать строки.
...
Рейтинг: 0 / 0
02.06.2007, 17:41:09
    #34569894
DocAl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите пжста новичку Shell-процедуре
--null-- DocAlКоллеги, я что-то не пойму, или вы просто забыли о ключике -m у wc?
Хороший ключик. Но есть проблема: не везде он присутствует.

авторbash-2.05$ uname -v
FreeBSD 4.4-RELEASE #4:
bash-2.05$ echo hello | wc -m
wc: illegal option -- m
usage: wc [-clw] [file ...]

В линухе есть, в FreeBSD 6x есть.Ну, для FreeBSD 4 и -с подойдёт. Там однобайтная кодировка.
...
Рейтинг: 0 / 0
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Помогите пжста новичку Shell-процедуре / 25 сообщений из 34, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]