The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Работа с массивами в shell, !*! Роман, 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
...

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

  • Работа с массивами в shell, !*! madskull, 17:14 , 13-Апр-06 (1)
    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:~#

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




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

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