The OpenNET Project / Index page

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

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

"Работа с массивами в shell"  
Сообщение от Роман email(??) on 13-Апр-06, 17:05 
Подскажите, как на shell осуществить такое.
Есть некий файлик a.txt, в котором находится таблица с неизвестным кол-вом строк, но обязательно два столбца. Значения "Имя" и "Кол-во лет" разделены пробелами и знаками табуляции:

Маша     23
Паша     2
Вася     45
Настя    34
Костик   33

Необходимо создать два массива, что бы значения из таблички распологались так:

n[1]=Маша
a[1]=23
n[2]=Паша
a[2]=2
n[3]=Вася
a[3]=45
...

Еще раз повторю, кол-во строк в файле не известно.
Помогите, пожалуйста, если можно!

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

 Оглавление

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


1. "Работа с массивами в shell"  
Сообщение от madskull (ok) on 13-Апр-06, 17:14 
while read nn aa; do n[$((${#n[@]}+1))]=$nn; a[$((${#a[@]}+1))]=$aa; done < file
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

6. "Работа с массивами в shell"  
Сообщение от Роман email(??) on 13-Апр-06, 17:35 
>while read nn aa; do n[$((${#n[@]}+1))]=$nn; a[$((${#a[@]}+1))]=$aa; done < file

А можно немного описать как это работает?

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

2. "Работа с массивами в shell"  
Сообщение от Pikador email(ok) on 13-Апр-06, 17:19 
>Подскажите, как на shell осуществить такое.
>Есть некий файлик a.txt, в котором находится таблица с неизвестным кол-вом строк,
>но обязательно два столбца. Значения "Имя" и "Кол-во лет" разделены пробелами
>и знаками табуляции:
>
>Маша     23
>Паша     2
>Вася     45
>Настя    34
>Костик   33
>
>Необходимо создать два массива, что бы значения из таблички распологались так:
>
>n[1]=Маша
>a[1]=23
>n[2]=Паша
>a[2]=2
>n[3]=Вася
>a[3]=45
>...
>
>Еще раз повторю, кол-во строк в файле не известно.
>Помогите, пожалуйста, если можно!


Или AWK...

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

3. "Работа с массивами в shell"  
Сообщение от Роман email(??) on 13-Апр-06, 17:24 
>
>Или AWK...

А как с помощью awk не подскажете. Мне awk ближе к сердцу.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

4. "Работа с массивами в shell"  
Сообщение от Pikador email(ok) on 13-Апр-06, 17:27 
>>
>>Или AWK...
>
>А как с помощью awk не подскажете. Мне awk ближе к сердцу.
>
Коктретный пример делать в лом, но работающие скрипты могу выслать почтой
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

5. "Работа с массивами в shell"  
Сообщение от Роман email(??) on 13-Апр-06, 17:29 
>>>
>>>Или AWK...
>>
>>А как с помощью awk не подскажете. Мне awk ближе к сердцу.
>>
>Коктретный пример делать в лом, но работающие скрипты могу выслать почтой

Если не сложно на roman@tario.ru.
Спасибо.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

7. "Работа с массивами в shell"  
Сообщение от Pikador email(ok) on 13-Апр-06, 18:29 
>>>>
>>>>Или AWK...
>>>
>>>А как с помощью awk не подскажете. Мне awk ближе к сердцу.
>>>
>>Коктретный пример делать в лом, но работающие скрипты могу выслать почтой
>
>Если не сложно на roman@tario.ru.
>Спасибо.


Отослал

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

8. "Работа с массивами в shell"  
Сообщение от Роман (??) on 13-Апр-06, 19:03 
>>>>>
>>>>>Или 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

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

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

9. "Работа с массивами в shell"  
Сообщение от madskull (ok) on 13-Апр-06, 20:20 

>Что-то там совсем не понятно. Сергей, может всетаки поможете!?
>На столбцы разбить легко:
>
>#!/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`)

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

10. "Работа с массивами в shell"  
Сообщение от Pikador email(ok) on 14-Апр-06, 11:06 
>>>>>>
>>>>>>Или 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

Так понятно?

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

11. "Работа с массивами в shell"  
Сообщение от Роман email(??) on 14-Апр-06, 16:56 
>
>
># 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 не получим

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

12. "Работа с массивами в shell"  
Сообщение от Pikador email(ok) on 16-Апр-06, 14:15 
>>
>>
>># 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

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

13. "Работа с массивами в shell"  
Сообщение от Роман (??) on 16-Апр-06, 14:32 
>>
>>Не понятно, т.к. если потом написать:
>>
>>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

Скажите, пожалуйста, где я ошибся и можно ли оптимизировать скрипт!?
Что значат эти ошибки? На что он ругается!?


Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

14. "Работа с массивами в shell"  
Сообщение от Pikador email(ok) on 17-Апр-06, 10:06 
>>>
>>>Не понятно, т.к. если потом написать:
>>>
>>>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. Что вам нужно делать с этим массивом дальше?

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

15. "Работа с массивами в shell"  
Сообщение от Роман email(??) on 17-Апр-06, 12:36 
>Так это не массив, вы же просто хотите дать кривые имена переменным!
>
>Пользуйтесь массивом в рамках awk. Что вам нужно делать с этим массивом
>дальше?

Ну мне надо дальше с массивом работать, сортировать, и т.д.. В общем, есть ли вариант как-то экспортировать его из awk!? Или как вообще с массивами работать в шелл, если в примере выше я не прав!?


Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

16. "Работа с массивами в shell"  
Сообщение от madskull (ok) on 17-Апр-06, 12:42 
>>Так это не массив, вы же просто хотите дать кривые имена переменным!
>>
>>Пользуйтесь массивом в рамках awk. Что вам нужно делать с этим массивом
>>дальше?
>
>Ну мне надо дальше с массивом работать, сортировать, и т.д.. В общем,
>есть ли вариант как-то экспортировать его из awk!? Или как вообще
>с массивами работать в шелл, если в примере выше я не
>прав!?

Может я чего не понимаю, но я же дал аж два варианта.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

17. "Работа с массивами в shell"  
Сообщение от Роман email(??) on 21-Апр-06, 13:25 
>>>>
>>>>Не понятно, т.к. если потом написать:
>>>>
>>>>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

Кто-нибудь может объяснить в чем дело? Что значит кривые имена переменным. А как же с массивами работать!?

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

18. "Работа с массивами в shell"  
Сообщение от Vic (??) on 21-Апр-06, 14:21 
>test53.sh: 7: Syntax error: Bad substitution

В традиционном sh нет поддержки массивов, используйте другие shell'ы, например bash.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

19. "Работа с массивами в shell"  
Сообщение от Роман email(??) on 21-Апр-06, 14:24 
>>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:~#


Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

20. "Работа с массивами в shell"  
Сообщение от Роман email(??) on 21-Апр-06, 14:25 
>>>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:~#

Ссори, понял свою ошибку. Спасибо большое.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

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

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




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

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