LinuxForum.Fans
Тема

Нужно соотнести и объединить слова между двумя переменными. (bash)

Автор: EvgeniusDragon 10 сообщений 4752 просмотров
09.04.2014 13:36 #375800

Нужно сделать скрипт что бы соединял слова из разных переменных. Не знаю как правильно объяснить, но вот пример как нужно

text
var1="1 2 3 4 5 6"
var2="a b c d e f"

в итоге нужно получить что то типа

text
1 = a
2 = b
3 = c
4 = d
5 = e
6 = f

Для чего мне нужно такое? Есть сайт к примеру. На нем страницы с фотками. Но над каждой фоткой есть заголовок. Фотки со страниц я могу скачать все. Но нужно еще и дать имя фоткам соответствующее заголовку. И у меня есть переменная линка фотки и переменная имени. И в переменной линки идут в одной строке через пробел, как и имена фоток. И если я могу объединить линк и имя, то могу передать в wget линк и имя сохраняемого файла.

09.04.2014 15:05 · отредактировано #375804

Можно данные из переменных переместить в массивы (http://www.opennet.ru/docs/RUS/bash_scripting_guide/c12790.html) и далее уже сопоставлять соответствующие элементы массивов.
Так же можно в цикле через cut -d " " -f1 и cut -d " " -f2 выделять соответствующие элементы прямо из переменных.

09.04.2014 15:21 #375805

О! Спасибо. Думаю то что нужно.

09.04.2014 15:45 #375806

А можно и через awk, в общем дальше уже твой полёт фантазии должен работать :)

09.04.2014 22:26 · отредактировано #375843
text
#!/usr/bin/perl -w
use strict;   #чтоб при неуловимых косяках программа подсказывала

my $a = "a b c d e f g"; #тут понятно my $b = "1 2 3 4 5 6 7"; #тут тоже

my @a = split /\s+/, $a; # загоняем в массив, разделитель любой пробельный символ, один или более раз подряд my @b = split /\s+/, $b; # то же самое

for (my $i = 0; $i < @a; $i++){ #цикл кол-во раз == количеству элементов, так как @a в скалярном контексте возвращает число элементов print "$a[$i] => $b[$i]; }

text

a => 1
b => 2
c => 3
d => 4
e => 5
f => 6
g => 7

теперь перепишите на bash и будет Вам счастье.
тут необходимое условие, как следствие из условия задачи.
нужно чтоб количество элементов в массивах совпадало.
либо можно сделать проверку, типа

text
if (@a == @b){
    #some code
}

хотя странноватая задача, разве нельзя из sql вытащить сразу два значения? (ссылку и имя)
несортирован, ибо хеш, но оно Вам и не нужно, на сколько я понял.
теперь сортирован и без хеша

09.04.2014 22:34 · отредактировано #375844
sdgfgffgfdfdgf написал:

несортирован, ибо хеш, но оно Вам и не нужно, на сколько я понял.

Да. Спасибо. Это тоже сойдет.

14.04.2014 07:50 #376408

[console]$ cat f1
1
2
3
4
5
6
$ cat f2
a
b
n
d
e
f
$ paste -d= f1 f2
1=a
2=b
3=n
4=d
5=e
6=f
[/console]

16.12.2014 23:23 · отредактировано #405524

Можно через массив

text
#!/bin/bash

VAR1=(g h j k l m) VAR2=(a b c d e f)

for i in ${!VAR1[*]} do #echo $i

echo ${VAR1['i']} "= "${VAR2['i']} done

или

text

echo ${VAR1[$i]} "= "${VAR2[$i]}

В вашем случае нужно перевести переменную в массив
Переводим переменную в массив:

text

VAR1="g h j k l m"
VAR2="a b c d e f"

в

text

VAR1=(g h j k l m)
VAR2=(a b c d e f)

так

text

VAR1="g h j k l m"
VAR2="a b c d e f"
VARA1=($VAR1)
VARA2=($VAR2)

и того скрипт

text

#!/bin/bash

VAR1="g h j k l m" VAR2="a b c d e f" VARA1=($VAR1) VARA2=($VAR2) #echo $VARA1

for i in ${!VARA1[*]} do

echo ${VARA1['i']} "= "${VARA2['i']} done

17.12.2014 16:44 #405609

Для парсинга сайтов лучше использовать специализированные инструменты, например xidel, но уж никак не wget.

20.12.2014 17:49 · отредактировано #405982

1000Mhz, я не сомневаюсь, что в гугле вас забанили, потому: http://lurkmore.to/4.2

Да и вообще вы со своими репликами не к месту. Wget для парсинга тут никто не использует. Это вообще КАК?

PS: и да, использовать для X специальный костыль Y, это маздайно, не юниксвейно, не Ъ, и вообще No Way.

Войдите или зарегистрируйтесь, чтобы ответить.