Много замен из файлов

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
mmvds
мл. сержант
Сообщения: 92
Зарегистрирован: 2011-01-26 17:24:07

Много замен из файлов

Непрочитанное сообщение mmvds » 2011-09-26 9:48:27

Ситуация такая - есть файл a.txt - в котором список ip узлов сети, есть список b.txt имен соответствующих узлов, т.е. первая строка файла a.txt соответствует первой строке файла b.txt, вторая второй и т.д.
например
файл a.txt:
10.10.1.2
10.13.4.5
10.11.3.1

файл b.txt
node1
node2
node3

И есть файл c.txt со связями узлов по их именам,например:
node1->node2
node3->node1

понадобилось превратить его в связи по ip
10.10.1.2->10.13.4.5
10.11.3.1->10.10.1.2

Подскажите пожалуйста, как произвести такую замену?
Как пробегаться сразу по двум файлам чтобы провести все замены?
Использовать можно все что угодно

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Bayerische
капитан
Сообщения: 1820
Зарегистрирован: 2010-12-25 20:41:50
Откуда: Хлебная столица

Re: Много замен из файлов

Непрочитанное сообщение Bayerische » 2011-09-26 9:54:32

Придётся взяться за самый близкий по пониманию скриптовый язык...

mmvds
мл. сержант
Сообщения: 92
Зарегистрирован: 2011-01-26 17:24:07

Re: Много замен из файлов

Непрочитанное сообщение mmvds » 2011-09-26 10:39:11

Код: Выделить всё

    declare -a array1
    declare -a array2
    array1=( `cat "./ip$1.txt" | tr '\n' ' '`)
    array2=( `cat "./name$1.txt" | tr '\n' ' '`)
    count1=${#array1[*]}
    cp ./tree$1.dot ./trna$1.dot
    while [ $count1 -gt 0 ]; do
    count1=$(($count1-1))
    s=`cat ./trna$1.dot`
    ${s//${array2[count1]}/${array1[count1]}} 
    echo $s > ./trna$1.dot
    done;
Написал на баше, сначала считываю данные по обоим файлам отдельные массивы, затем файл закидываю в переменную и заменяю в ней части со значением из второго массива на значения из первого, скрипт выполняется, но результата 0
в trna$1.dot все-равно остается содержимое tree$1.dot

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Много замен из файлов

Непрочитанное сообщение kpp » 2011-09-26 14:31:31

Мой вариант решения:

Код: Выделить всё

#!/bin/sh
#
# sh_join.sh
# 2011-09-26 10:08:01
# Description
# version 1
#

vhod1="${1}"
vhod2="${2}"
vhod3="${3}"

awk '{print NR" "$0}' ${vhod1} > tmp1
awk '{print NR" "$0}' ${vhod2} > tmp2
join -o 2.2,1.2 tmp1 tmp2 > sootv.txt
sed 's/->/ /' ${vhod3} | awk '{print NR" "$0}' | sort +1 -2 > tmp1
join -1 2 -o 1.1,2.2,1.3 tmp1 sootv.txt > tmp3
sort +2 -3 tmp1 > tmp2
join -1 3 -o 1.1,1.2,2.2 tmp2 sootv.txt | sort +0 -1 > tmp1
join -o 1.2,2.3 tmp3 tmp1 | sed 's/ /->/'> result
Использование:

Код: Выделить всё

sh_join.sh a.txt b.txt c.txt
Можно классически - циклами, но подумал - почему бы и нет?
К слову - утилита join слабовата, поэтому пришлось поизвращаться ;-)
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

mmvds
мл. сержант
Сообщения: 92
Зарегистрирован: 2011-01-26 17:24:07

Re: Много замен из файлов

Непрочитанное сообщение mmvds » 2011-09-26 16:51:22

К слову - утилита join слабовата, поэтому пришлось поизвращаться ;-)
Ух :) Спасибо
И все же хотелось бы узнать, почему не работает конструкция
${s//${array2[count1]}/${array1[count1]}}
заменил на
${s//${array2[$count1]}/${array1[$count1]}}
все-равно не работает
${s//{array2[$count1]}/{array1[$count1]}}
и так тоже не работет :(
При этом никаких ошибок не выдает, но и текст не заменяет

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Много замен из файлов

Непрочитанное сообщение kpp » 2011-09-26 16:57:56

На баше не программировал, в sh массивов нет, да и не нужны массивы для этой задачи.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

mmvds
мл. сержант
Сообщения: 92
Зарегистрирован: 2011-01-26 17:24:07

Re: Много замен из файлов

Непрочитанное сообщение mmvds » 2011-09-27 10:45:54

все-таки доделал с массивами,

Код: Выделить всё

declare -a array1
    declare -a array2
    array1=( `cat "./ip$1.txt" | tr '\n' ' '`)
    array2=( `cat "./name$1.txt" | tr '\n' ' '`)
    count1=${#array1[*]}
    cp ./tree$1.dot ./trna$1.txt
    while [ $count1 -gt 0 ]; do
    count1=$(($count1-1))
    a=${array2[$count1]}
    b=${array1[$count1]}
    sed -e s/\"$a\"/\"$b\"/g ./trna$1.txt > ./temp
    cp ./temp ./trna$1.txt
    done;
Зато данный скрипт не зависит от структуры заменяемого файла :)

P.s. во всех записях узлов и ip адресов пришлось добавить кавычки, т.к. без кавычек возникала ситуация типа такой:
node1 10.10.1.2
node10 10.30.4.1
в итоге при замене записи node10->node8 происходила замена
node10 на 10.10.1.20

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Много замен из файлов

Непрочитанное сообщение kpp » 2011-09-27 11:38:46

Согласен, join совсем слаб и малоэффективен.
Предлагаю классический вариант с циклом, но без массивов (ну не нужны они тут ;))

Код: Выделить всё

#!/bin/sh
#
# sh_join2.sh
# 2011-09-27 11:08:01
# Description
# version 1
#

vhod1="${1}"
vhod2="${2}"
vhod3="${3}"

awk '{print NR" "$0}' ${vhod1} > tmp1
awk '{print NR" "$0}' ${vhod2} > tmp2
join -o 2.2,1.2 tmp1 tmp2 > sootv.txt

depend="`cat ${vhod3}`"

while read node ip
do
 depend="`echo "${depend}" | sed 's/>'"${node}"'$/>'"${ip}"'/' | sed 's/^'"${node}"'-/'"${ip}"'-/'`"
done < sootv.txt

echo "${depend}" > result
Использование :

Код: Выделить всё

sh_join2.sh a.txt b.txt c.txt
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

mmvds
мл. сержант
Сообщения: 92
Зарегистрирован: 2011-01-26 17:24:07

Re: Много замен из файлов

Непрочитанное сообщение mmvds » 2011-09-27 11:46:44

спасибо! про read я как-то забыл
теперь осталось придумать как все это загнать в zabbix
http://forum.lissyara.su/viewtopic.php?f=48&t=34277