Много замен из файлов
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
-
- мл. сержант
- Сообщения: 92
- Зарегистрирован: 2011-01-26 17:24:07
Много замен из файлов
Ситуация такая - есть файл 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
Подскажите пожалуйста, как произвести такую замену?
Как пробегаться сразу по двум файлам чтобы провести все замены?
Использовать можно все что угодно
например
файл 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
Тарифы на хостинг в России, от 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/
Тарифы на виртуальные сервера (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/
-
- капитан
- Сообщения: 1820
- Зарегистрирован: 2010-12-25 20:41:50
- Откуда: Хлебная столица
Re: Много замен из файлов
Придётся взяться за самый близкий по пониманию скриптовый язык...
-
- мл. сержант
- Сообщения: 92
- Зарегистрирован: 2011-01-26 17:24:07
Re: Много замен из файлов
Код: Выделить всё
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;
в trna$1.dot все-равно остается содержимое tree$1.dot
-
- лейтенант
- Сообщения: 613
- Зарегистрирован: 2009-08-05 16:10:46
- Откуда: Украина Днепропетровск-Киев
- Контактная информация:
Re: Много замен из файлов
Мой вариант решения:
Использование:
Можно классически - циклами, но подумал - почему бы и нет?
К слову - утилита join слабовата, поэтому пришлось поизвращаться
Код: Выделить всё
#!/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 слабовата, поэтому пришлось поизвращаться
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.
-
- мл. сержант
- Сообщения: 92
- Зарегистрирован: 2011-01-26 17:24:07
Re: Много замен из файлов
Ух СпасибоК слову - утилита join слабовата, поэтому пришлось поизвращаться
И все же хотелось бы узнать, почему не работает конструкция
${s//${array2[count1]}/${array1[count1]}}
заменил на
${s//${array2[$count1]}/${array1[$count1]}}
все-равно не работает
${s//{array2[$count1]}/{array1[$count1]}}
и так тоже не работет
При этом никаких ошибок не выдает, но и текст не заменяет
-
- лейтенант
- Сообщения: 613
- Зарегистрирован: 2009-08-05 16:10:46
- Откуда: Украина Днепропетровск-Киев
- Контактная информация:
Re: Много замен из файлов
На баше не программировал, в sh массивов нет, да и не нужны массивы для этой задачи.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.
-
- мл. сержант
- Сообщения: 92
- Зарегистрирован: 2011-01-26 17:24:07
Re: Много замен из файлов
все-таки доделал с массивами,
Зато данный скрипт не зависит от структуры заменяемого файла
P.s. во всех записях узлов и ip адресов пришлось добавить кавычки, т.к. без кавычек возникала ситуация типа такой:
node1 10.10.1.2
node10 10.30.4.1
в итоге при замене записи node10->node8 происходила замена
node10 на 10.10.1.20
Код: Выделить всё
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
-
- лейтенант
- Сообщения: 613
- Зарегистрирован: 2009-08-05 16:10:46
- Откуда: Украина Днепропетровск-Киев
- Контактная информация:
Re: Много замен из файлов
Согласен, 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
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.
-
- мл. сержант
- Сообщения: 92
- Зарегистрирован: 2011-01-26 17:24:07
Re: Много замен из файлов
спасибо! про read я как-то забыл
теперь осталось придумать как все это загнать в zabbix
http://forum.lissyara.su/viewtopic.php?f=48&t=34277
теперь осталось придумать как все это загнать в zabbix
http://forum.lissyara.su/viewtopic.php?f=48&t=34277