- Работа с массивами в shell, madskull, 17:14 , 13-Апр-06 (1)
while read nn aa; do n[$((${#n[@]}+1))]=$nn; a[$((${#a[@]}+1))]=$aa; done < file
- Работа с массивами в shell, Роман, 17:35 , 13-Апр-06 (6)
>while read nn aa; do n[$((${#n[@]}+1))]=$nn; a[$((${#a[@]}+1))]=$aa; done < file А можно немного описать как это работает?
- Работа с массивами в shell, Pikador, 17:19 , 13-Апр-06 (2)
>Подскажите, как на shell осуществить такое. >Есть некий файлик a.txt, в котором находится таблица с неизвестным кол-вом строк, >но обязательно два столбца. Значения "Имя" и "Кол-во лет" разделены пробелами >и знаками табуляции: > >Маша 23 >Паша 2 >Вася 45 >Настя 34 >Костик 33 > >Необходимо создать два массива, что бы значения из таблички распологались так: > >n[1]=Маша >a[1]=23 >n[2]=Паша >a[2]=2 >n[3]=Вася >a[3]=45 >... > >Еще раз повторю, кол-во строк в файле не известно. >Помогите, пожалуйста, если можно! Или AWK...
- Работа с массивами в shell, Роман, 17:24 , 13-Апр-06 (3)
> >Или AWK... А как с помощью awk не подскажете. Мне awk ближе к сердцу.
- Работа с массивами в shell, Pikador, 17:27 , 13-Апр-06 (4)
>> >>Или AWK... > >А как с помощью awk не подскажете. Мне awk ближе к сердцу. > Коктретный пример делать в лом, но работающие скрипты могу выслать почтой
- Работа с массивами в shell, Роман, 17:29 , 13-Апр-06 (5)
>>> >>>Или AWK... >> >>А как с помощью awk не подскажете. Мне awk ближе к сердцу. >> >Коктретный пример делать в лом, но работающие скрипты могу выслать почтой Если не сложно на roman@tario.ru. Спасибо.
- Работа с массивами в shell, Pikador, 18:29 , 13-Апр-06 (7)
>>>> >>>>Или AWK... >>> >>>А как с помощью awk не подскажете. Мне awk ближе к сердцу. >>> >>Коктретный пример делать в лом, но работающие скрипты могу выслать почтой > >Если не сложно на roman@tario.ru. >Спасибо. Отослал
- Работа с массивами в shell, Роман, 19:03 , 13-Апр-06 (8)
>>>>> >>>>>Или AWK... >>>> >>>>А как с помощью awk не подскажете. Мне awk ближе к сердцу. >>>> >>>Коктретный пример делать в лом, но работающие скрипты могу выслать почтой >> >>Если не сложно на roman@tario.ru. >>Спасибо. > > >Отослал Что-то там совсем не понятно. Сергей, может всетаки поможете!? На столбцы разбить легко: #!/bin/sh n=`cat a.txt| wc -l` a=0 while [ a -ne n ] do a=$(($a+1)) k[a]=`cat a.txt | awk -F " " '{ print $1 }' | а вот что тут дальше ??? ... :) l[a]=`cat a.txt | awk -F " " '{ print $2 }' | ??? done ... а вот как строки выделить, и засунуть в массив не понятно.
- Работа с массивами в shell, madskull, 20:20 , 13-Апр-06 (9)
>Что-то там совсем не понятно. Сергей, может всетаки поможете!? >На столбцы разбить легко: > >#!/bin/sh > >n=`cat a.txt| wc -l` >a=0 >while [ a -ne n ] do > a=$(($a+1)) > k[a]=`cat a.txt | awk -F " " '{ print >$1 }' | а вот что тут дальше ??? ... :) > > l[a]=`cat a.txt | awk -F " " '{ print >$2 }' | ??? >done > >... а вот как строки выделить, и засунуть в массив не понятно. > ... подумать, что-нить про программирование в баш, пофантазировать... n=(`awk '{print$1}' a.txt`) a=(`awk '{print$2}' a.txt`)
- Работа с массивами в shell, Pikador, 11:06 , 14-Апр-06 (10)
>>>>>> >>>>>>Или AWK... >>>>> >>>>>А как с помощью awk не подскажете. Мне awk ближе к сердцу. >>>>> >>>>Коктретный пример делать в лом, но работающие скрипты могу выслать почтой >>> >>>Если не сложно на roman@tario.ru. >>>Спасибо. >> >> >>Отослал > >Что-то там совсем не понятно. Сергей, может всетаки поможете!? >На столбцы разбить легко: > >#!/bin/sh > >n=`cat a.txt| wc -l` >a=0 >while [ a -ne n ] do > a=$(($a+1)) > k[a]=`cat a.txt | awk -F " " '{ print >$1 }' | а вот что тут дальше ??? ... :) > > l[a]=`cat a.txt | awk -F " " '{ print >$2 }' | ??? >done > >... а вот как строки выделить, и засунуть в массив не понятно. > # cat test.txt Masha 23 Pasha 2 Vasa 45 Nasta 34 Kostik 33
# cat test.sh #!/bin/sh awk '{i=i+1; Name_arr[i]=$1; Num_arr[i]=$2; printf ("Name=%s\tNum=%d\ti=%d\n", Name_arr[i], Num_arr[i], i ) }' test.txt Так понятно?
- Работа с массивами в shell, Роман, 16:56 , 14-Апр-06 (11)
> > ># cat test.txt >Masha 23 >Pasha 2 >Vasa 45 >Nasta 34 >Kostik 33 > ># cat test.sh >#!/bin/sh > >awk '{i=i+1; Name_arr[i]=$1; Num_arr[i]=$2; printf ("Name=%s\tNum=%d\ti=%d\n", Name_arr[i], Num_arr[i], i ) }' test.txt > > >Так понятно? Не понятно, т.к. если потом написать: echo ${Name_arr[2]} <-- здесь Pasha не получим echo ${Num_arr[2]} <-- здесь 2 не получим
- Работа с массивами в shell, Pikador, 14:15 , 16-Апр-06 (12)
>> >> >># cat test.txt >>Masha 23 >>Pasha 2 >>Vasa 45 >>Nasta 34 >>Kostik 33 >> >># cat test.sh >>#!/bin/sh >> >>awk '{i=i+1; Name_arr[i]=$1; Num_arr[i]=$2; printf ("Name=%s\tNum=%d\ti=%d\n", Name_arr[i], Num_arr[i], i ) }' test.txt >> >> >>Так понятно? > >Не понятно, т.к. если потом написать: > >echo ${Name_arr[2]} <-- здесь Pasha не получим >echo ${Num_arr[2]} <-- здесь 2 не получим Естественно не получите, ибо массив действиетелен только в рамках awk
- Работа с массивами в shell, Роман, 14:32 , 16-Апр-06 (13)
>> >>Не понятно, т.к. если потом написать: >> >>echo ${Name_arr[2]} <-- здесь Pasha не получим >>echo ${Num_arr[2]} <-- здесь 2 не получим > >Естественно не получите, ибо массив действиетелен только в рамках awk Так мне потом надо к ним обращаться. Вот что я тут попробывал. Есть файл test.txt: Masha 23 Pasha 2 Vasa 45 Nasta 34 Kostik 33 Скрипт test.sh: #!/bin/sh n=`cat test.txt | wc -l` a=0 while [ $a -ne $n ] do a=$(($a+1)) k[$a]=`cat test.txt | awk -F " " '{ print $1 }' | head -n $a | tail -n 1` l[$a]=`cat test.txt | awk -F " " '{ print $2 }' | head -n $a | tail -n 1` done a=0 echo $a $n while [ $a -ne $n ] do a=$(($a+1)) echo ${k[$a]} echo ${l[$a]} done Запускаем, получаем ошибки: k[1]=Masha: not found l[1]=23: not found k[2]=Pasha: not found l[2]=2: not found k[3]=Vasa: not found l[3]=45: not found k[4]=Nasta: not found l[4]=34: not found k[5]=Kostik: not found l[5]=33: not found 0 5 test.sh: 16: Syntax error: Bad substitution Скажите, пожалуйста, где я ошибся и можно ли оптимизировать скрипт!? Что значат эти ошибки? На что он ругается!?
- Работа с массивами в shell, Pikador, 10:06 , 17-Апр-06 (14)
>>> >>>Не понятно, т.к. если потом написать: >>> >>>echo ${Name_arr[2]} <-- здесь Pasha не получим >>>echo ${Num_arr[2]} <-- здесь 2 не получим >> >>Естественно не получите, ибо массив действиетелен только в рамках awk > >Так мне потом надо к ним обращаться. Вот что я тут попробывал. > > >Есть файл test.txt: > >Masha 23 >Pasha 2 >Vasa 45 >Nasta 34 >Kostik 33 > >Скрипт test.sh: > >#!/bin/sh > >n=`cat test.txt | wc -l` >a=0 >while [ $a -ne $n ] >do > a=$(($a+1)) > k[$a]=`cat test.txt | awk -F " " '{ print >$1 }' | head -n $a | tail -n 1` > l[$a]=`cat test.txt | awk -F " " '{ print >$2 }' | head -n $a | tail -n 1` >done >a=0 >echo $a $n >while [ $a -ne $n ] >do > a=$(($a+1)) > echo ${k[$a]} > echo ${l[$a]} >done > >Запускаем, получаем ошибки: > >k[1]=Masha: not found >l[1]=23: not found >k[2]=Pasha: not found >l[2]=2: not found >k[3]=Vasa: not found >l[3]=45: not found >k[4]=Nasta: not found >l[4]=34: not found >k[5]=Kostik: not found >l[5]=33: not found >0 5 >test.sh: 16: Syntax error: Bad substitution > >Скажите, пожалуйста, где я ошибся и можно ли оптимизировать скрипт!? >Что значат эти ошибки? На что он ругается!? Так это не массив, вы же просто хотите дать кривые имена переменным! Пользуйтесь массивом в рамках awk. Что вам нужно делать с этим массивом дальше?
- Работа с массивами в shell, Роман, 12:36 , 17-Апр-06 (15)
>Так это не массив, вы же просто хотите дать кривые имена переменным! > >Пользуйтесь массивом в рамках awk. Что вам нужно делать с этим массивом >дальше? Ну мне надо дальше с массивом работать, сортировать, и т.д.. В общем, есть ли вариант как-то экспортировать его из awk!? Или как вообще с массивами работать в шелл, если в примере выше я не прав!?
- Работа с массивами в shell, madskull, 12:42 , 17-Апр-06 (16)
>>Так это не массив, вы же просто хотите дать кривые имена переменным! >> >>Пользуйтесь массивом в рамках awk. Что вам нужно делать с этим массивом >>дальше? > >Ну мне надо дальше с массивом работать, сортировать, и т.д.. В общем, >есть ли вариант как-то экспортировать его из awk!? Или как вообще >с массивами работать в шелл, если в примере выше я не >прав!? Может я чего не понимаю, но я же дал аж два варианта.
- Работа с массивами в shell, Роман, 13:25 , 21-Апр-06 (17)
>>>> >>>>Не понятно, т.к. если потом написать: >>>> >>>>echo ${Name_arr[2]} <-- здесь Pasha не получим >>>>echo ${Num_arr[2]} <-- здесь 2 не получим >>> >>>Естественно не получите, ибо массив действиетелен только в рамках awk >> >>Так мне потом надо к ним обращаться. Вот что я тут попробывал. >> >> >>Есть файл test.txt: >> >>Masha 23 >>Pasha 2 >>Vasa 45 >>Nasta 34 >>Kostik 33 >> >>Скрипт test.sh: >> >>#!/bin/sh >> >>n=`cat test.txt | wc -l` >>a=0 >>while [ $a -ne $n ] >>do >> a=$(($a+1)) >> k[$a]=`cat test.txt | awk -F " " '{ print >>$1 }' | head -n $a | tail -n 1` >> l[$a]=`cat test.txt | awk -F " " '{ print >>$2 }' | head -n $a | tail -n 1` >>done >>a=0 >>echo $a $n >>while [ $a -ne $n ] >>do >> a=$(($a+1)) >> echo ${k[$a]} >> echo ${l[$a]} >>done >> >>Запускаем, получаем ошибки: >> >>k[1]=Masha: not found >>l[1]=23: not found >>k[2]=Pasha: not found >>l[2]=2: not found >>k[3]=Vasa: not found >>l[3]=45: not found >>k[4]=Nasta: not found >>l[4]=34: not found >>k[5]=Kostik: not found >>l[5]=33: not found >>0 5 >>test.sh: 16: Syntax error: Bad substitution >> >>Скажите, пожалуйста, где я ошибся и можно ли оптимизировать скрипт!? >>Что значат эти ошибки? На что он ругается!? > >Так это не массив, вы же просто хотите дать кривые имена переменным! > >Пользуйтесь массивом в рамках awk. Что вам нужно делать с этим массивом >дальше? Во все описаниях работы с массивами в shell приводят такой пример: for i in 1 2 3 4 5; do a[$i]=$i done for i in 1 2 3 4 5; do echo ${a[$i]} done Но почему он не работает? Вот результат выполнения скрипта: a[1]=1: not found a[2]=2: not found a[3]=3: not found a[4]=4: not found a[5]=5: not found test53.sh: 7: Syntax error: Bad substitution Кто-нибудь может объяснить в чем дело? Что значит кривые имена переменным. А как же с массивами работать!? - Работа с массивами в shell, Vic, 14:21 , 21-Апр-06 (18)
>test53.sh: 7: Syntax error: Bad substitution В традиционном sh нет поддержки массивов, используйте другие shell'ы, например bash.
- Работа с массивами в shell, Роман, 14:24 , 21-Апр-06 (19)
>>test53.sh: 7: Syntax error: Bad substitution > >В традиционном sh нет поддержки массивов, используйте другие shell'ы, например bash. root@noname:~# cat test53.sh #!/usr/local/bin/bash for i in 1 2 3 4 5; do a[$i]=$i done for i in 1 2 3 4 5; do echo ${a[$i]} done root@noname:~# sh test53.sh a[1]=1: not found a[2]=2: not found a[3]=3: not found a[4]=4: not found a[5]=5: not found test53.sh: 7: Syntax error: Bad substitution root@noname:~#
- Работа с массивами в shell, Роман, 14:25 , 21-Апр-06 (20)
>>>test53.sh: 7: Syntax error: Bad substitution >> >>В традиционном sh нет поддержки массивов, используйте другие shell'ы, например bash. > >root@noname:~# cat test53.sh >#!/usr/local/bin/bash > >for i in 1 2 3 4 5; do > a[$i]=$i >done >for i in 1 2 3 4 5; do > echo ${a[$i]} >done > >root@noname:~# sh test53.sh >a[1]=1: not found >a[2]=2: not found >a[3]=3: not found >a[4]=4: not found >a[5]=5: not found >test53.sh: 7: Syntax error: Bad substitution >root@noname:~# Ссори, понял свою ошибку. Спасибо большое.
|