Страница 1 из 1

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

Добавлено: 2011-09-26 9:48:27
mmvds
Ситуация такая - есть файл 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

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

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

Добавлено: 2011-09-26 9:54:32
Bayerische
Придётся взяться за самый близкий по пониманию скриптовый язык...

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

Добавлено: 2011-09-26 10:39:11
mmvds

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

    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

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

Добавлено: 2011-09-26 14:31:31
kpp
Мой вариант решения:

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

#!/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 слабовата, поэтому пришлось поизвращаться ;-)

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

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

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

Добавлено: 2011-09-26 16:57:56
kpp
На баше не программировал, в sh массивов нет, да и не нужны массивы для этой задачи.

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

Добавлено: 2011-09-27 10:45:54
mmvds
все-таки доделал с массивами,

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

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

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

Добавлено: 2011-09-27 11:38:46
kpp
Согласен, 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

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

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