Подскажите, как на shell осуществить такое.
Есть некий файлик a.txt, в котором находится таблица с неизвестным кол-вом строк, но обязательно два столбца. Значения "Имя" и "Кол-во лет" разделены пробелами и знаками табуляции:Маша 23
Паша 2
Вася 45
Настя 34
Костик 33Необходимо создать два массива, что бы значения из таблички распологались так:
n[1]=Маша
a[1]=23
n[2]=Паша
a[2]=2
n[3]=Вася
a[3]=45
...Еще раз повторю, кол-во строк в файле не известно.
Помогите, пожалуйста, если можно!
while read nn aa; do n[$((${#n[@]}+1))]=$nn; a[$((${#a[@]}+1))]=$aa; done < file
>while read nn aa; do n[$((${#n[@]}+1))]=$nn; a[$((${#a[@]}+1))]=$aa; done < fileА можно немного описать как это работает?
>Подскажите, как на shell осуществить такое.
>Есть некий файлик a.txt, в котором находится таблица с неизвестным кол-вом строк,
>но обязательно два столбца. Значения "Имя" и "Кол-во лет" разделены пробелами
>и знаками табуляции:
>
>Маша 23
>Паша 2
>Вася 45
>Настя 34
>Костик 33
>
>Необходимо создать два массива, что бы значения из таблички распологались так:
>
>n[1]=Маша
>a[1]=23
>n[2]=Паша
>a[2]=2
>n[3]=Вася
>a[3]=45
>...
>
>Еще раз повторю, кол-во строк в файле не известно.
>Помогите, пожалуйста, если можно!
Или AWK...
>
>Или AWK...А как с помощью awk не подскажете. Мне awk ближе к сердцу.
>>
>>Или AWK...
>
>А как с помощью awk не подскажете. Мне awk ближе к сердцу.
>
Коктретный пример делать в лом, но работающие скрипты могу выслать почтой
>>>
>>>Или AWK...
>>
>>А как с помощью awk не подскажете. Мне awk ближе к сердцу.
>>
>Коктретный пример делать в лом, но работающие скрипты могу выслать почтойЕсли не сложно на roman@tario.ru.
Спасибо.
>>>>
>>>>Или AWK...
>>>
>>>А как с помощью awk не подскажете. Мне awk ближе к сердцу.
>>>
>>Коктретный пример делать в лом, но работающие скрипты могу выслать почтой
>
>Если не сложно на roman@tario.ru.
>Спасибо.
Отослал
>>>>>
>>>>>Или 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... а вот как строки выделить, и засунуть в массив не понятно.
>Что-то там совсем не понятно. Сергей, может всетаки поможете!?
>На столбцы разбить легко:
>
>#!/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`)
>>>>>>
>>>>>>Или 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/shawk '{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
Так понятно?
>
>
># 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 не получим
>>
>>
>># 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
>>
>>Не понятно, т.к. если потом написать:
>>
>>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Скажите, пожалуйста, где я ошибся и можно ли оптимизировать скрипт!?
Что значат эти ошибки? На что он ругается!?
>>>
>>>Не понятно, т.к. если потом написать:
>>>
>>>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. Что вам нужно делать с этим массивом дальше?
>Так это не массив, вы же просто хотите дать кривые имена переменным!
>
>Пользуйтесь массивом в рамках awk. Что вам нужно делать с этим массивом
>дальше?Ну мне надо дальше с массивом работать, сортировать, и т.д.. В общем, есть ли вариант как-то экспортировать его из awk!? Или как вообще с массивами работать в шелл, если в примере выше я не прав!?
>>Так это не массив, вы же просто хотите дать кривые имена переменным!
>>
>>Пользуйтесь массивом в рамках awk. Что вам нужно делать с этим массивом
>>дальше?
>
>Ну мне надо дальше с массивом работать, сортировать, и т.д.. В общем,
>есть ли вариант как-то экспортировать его из awk!? Или как вообще
>с массивами работать в шелл, если в примере выше я не
>прав!?Может я чего не понимаю, но я же дал аж два варианта.
>>>>
>>>>Не понятно, т.к. если потом написать:
>>>>
>>>>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Кто-нибудь может объяснить в чем дело? Что значит кривые имена переменным. А как же с массивами работать!?
>test53.sh: 7: Syntax error: Bad substitutionВ традиционном sh нет поддержки массивов, используйте другие shell'ы, например bash.
>>test53.sh: 7: Syntax error: Bad substitution
>
>В традиционном sh нет поддержки массивов, используйте другие shell'ы, например bash.root@noname:~# cat test53.sh
#!/usr/local/bin/bashfor i in 1 2 3 4 5; do
a[$i]=$i
done
for i in 1 2 3 4 5; do
echo ${a[$i]}
doneroot@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:~#
>>>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:~#Ссори, понял свою ошибку. Спасибо большое.