LINUX.ORG.RU

Как решить задачу по аналогу функции ВПР на bash/awk/sed ?

 , ,


0

2

Добрый день! Подскажите, как решить задачу по аналогу функции ВПР в linux?

Описание задачи: через SNMP получаю с Juniper-ов информацию, которую затем необходимо передать в Zabbix.

Опросом имею два файла:

1. первый файл с индексами и именами интерфейсов vlan

553 vlan.31
554 vlan.51
555 vlan.61
556 vlan.81
557 vlan.800
558 vlan.801
559 vlan.802
560 vlan.3000
568 vlan.101
569 vlan.102
570 vlan.103
571 vlan.104
572 vlan.105

2. второй файл с дескрипшинами влан. Индексы в этом файле соответствуют номер влан в прошлом файле

3000 ISL
61 RNC-Iub
31 RNC-OAM
81 RNC-SCTP
51 RNC-UP
801 ToP-1
802 ToP-2
800 ToP-OAM
102 RNC-IuCS
103 RNC-IuPS
101 RNC-Iub
104 RNC-MBH
105 RNC-SIGNALING

Что я хочу поиметь на выходе:

553 vlan.31 RNC-OAM
554 vlan.51 RNC-UP
555 vlan.61 RNC-Iub
556 vlan.81 RNC-SCTP
557 vlan.800 ToP-OAM
558 vlan.801 ToP-1
559 vlan.802 ToP-2
560 vlan.3000 ISL
568 vlan.101 RNC-Iub
569 vlan.102 RNC-IuCS
570 vlan.103 RNC-IuPS
571 vlan.104 RNC-MBH
572 vlan.105 RNC-SIGNALING

Подскажите, как это можно сделать? К сожалению, моих навыков пока не хватает :(



Последнее исправление: ZhKSteaL (всего исправлений: 3)

как-то так пойдёт?

#! /bin/sh

file1=$1
file2=$2

while IFS='' read -r line || [[ -n $line ]] ; do
    echo "$line $(grep "^$(echo $line | awk '{ print $2 }' | awk -F '.' '{ print $2 }') " $file2 | awk '{ print $2 }')"
done < "$file1"

f1u77y ★★★★
()
Ответ на: комментарий от f1u77y
[xxx@yyy ~]$ /usr/bin/bash test.sh interface.txt vlan.txt
test.sh: line 2: $'\r': command not found
test.sh: line 5: $'\r': command not found
test.sh: line 8: syntax error near unexpected token `done'
test.sh: line 8: `done < "$file1"'

как то так :(

ZhKSteaL
() автор топика

only awk

Через массивы z и x

$ awk 'BEGIN {while((getline<"2.txt")>0) {z[$1]=$2}} {split($2,x,"."); print $0,z[x[2]]}' 1.txt
553 vlan.31 RNC-OAM
554 vlan.51 RNC-UP
555 vlan.61 RNC-Iub
556 vlan.81 RNC-SCTP
557 vlan.800 ToP-OAM
558 vlan.801 ToP-1
559 vlan.802 ToP-2
560 vlan.3000 ISL
568 vlan.101 RNC-Iub
569 vlan.102 RNC-IuCS
570 vlan.103 RNC-IuPS
571 vlan.104 RNC-MBH
572 vlan.105 RNC-SIGNALING

justAmoment ★★★★★
()
Ответ на: комментарий от zolden

Очень не надежно. Работает только если входные файлы аккуратно составлены/проверенны.

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

anonymous
()
Ответ на: комментарий от anonymous

Я бы такое в продакшен не пустил

Если вы по такому ТЗ что-то в продакшен пускать/не пускать думаете, то боюсь, я вас бы самого в продакшен не пустил

zolden ★★★★★
()
Ответ на: комментарий от anonymous

Посылай, не посылай, но это не изменит факта что ты не зная ТЗ нормально (варианты и объём входных данных, условия отбраковки и способы обработки некорректных записей и прочее), уже пытаешься делать какие-то предположения.
Я таких персонажей, которые гадают, вместо нормальной проработки задачи навидался выше крыши.

zolden ★★★★★
()
Ответ на: комментарий от zolden

гадаешь ты. надо делать через хеш, это работает на приведенных данных и на «испорченных»

таких персонажей, которые пишут говнокод по принципу: " у меня работает " я вижу каждый день пачками

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.