Построчное сравнение двух файлов (perl, bash)
Модератор: Модераторы разделов
-
victor_g
- Сообщения: 5
Построчное сравнение двух файлов
Добрый день!
Мне необходимо сравнить два файла. Один содержит mac адрес и порт циски, второй содержит mac и ip машины.
Мне нужно определить на каком порту циски какая машина висит, т.е. из двух файлов вида mac - порт и mac - ip сделать файл вида: порт, mac, ip.
Подскажите как это сделать...
Мне необходимо сравнить два файла. Один содержит mac адрес и порт циски, второй содержит mac и ip машины.
Мне нужно определить на каком порту циски какая машина висит, т.е. из двух файлов вида mac - порт и mac - ip сделать файл вида: порт, mac, ip.
Подскажите как это сделать...
-
Bizdelnick
- Модератор
- Сообщения: 21504
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Построчное сравнение двух файлов
Как-то так:
Код: Выделить всё
#!/usr/bin/perl
open(PORTS, $ARGV[0]);
while (<PORTS>) {
($mac, $port) = split /\s+/;
$ports{$mac} = $port;
}
close(PORTS);
open(IPS, $ARGV[1]);
while (<IPS>) {
($mac, $ip) = split /\s+/;
$ips{$mac} = $ip;
}
close(IPS);
foreach (sort keys %ports) {
print "$ports{$_} $_ $ips{$_}\n";
}Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
SLEDopit
- Модератор
- Сообщения: 4824
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: Построчное сравнение двух файлов
Если это не часть какой-то задачи, то можно обойтись и без perl'a:
Код: Выделить всё
join <(sort mac-ip.txt) <(sort mac-port.txt)UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
The more you believe you don't do mistakes, the more bugs are in your code.
-
victor_g
- Сообщения: 5
Re: Построчное сравнение двух файлов
Bizdelnick писал(а): ↑08.02.2013 13:15Как-то так:Код: Выделить всё
#!/usr/bin/perl open(PORTS, $ARGV[0]); while (<PORTS>) { ($mac, $port) = split /\s+/; $ports{$mac} = $port; } close(PORTS); open(IPS, $ARGV[1]); while (<IPS>) { ($mac, $ip) = split /\s+/; $ips{$mac} = $ip; } close(IPS); foreach (sort keys %ports) { print "$ports{$_} $_ $ips{$_}\n"; }
Substitution replacement not terminated at ./sort_perl line 13
(($mac, $port) = split /\s+/;)
Просто я не силен в программировании, а сделать как-то нужно.
SLEDopit писал(а): ↑08.02.2013 14:10Если это не часть какой-то задачи, то можно обойтись и без perl'a:
Код: Выделить всё
join <(sort mac-ip.txt) <(sort mac-port.txt)
А в этом случае: join 1 is not sorted arder
-
SLEDopit
- Модератор
- Сообщения: 4824
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: Построчное сравнение двух файлов
Можно увидеть именно скопированные команду, которую вы вводили, скопированную ошибку и по пяток строчек из каждого файла (вместе с именами)?
Именно скопированную, а не перепечатанную.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
The more you believe you don't do mistakes, the more bugs are in your code.
-
victor_g
- Сообщения: 5
Re: Построчное сравнение двух файлов
[root@Fed-new f_s]# join -i <(sort 0) <(sort 1)
join: file 1 is not in sorted order
Файл с mac и портом
0001.807d.7007 Fa0/20
0001.807d.708f Fa0/14
0002.4426.e35c Fa0/20
000b.6a50.6511 Fa0/20
000d.8778.4f16 Fa0/20
0013.8f2f.c2cd Fa0/20
0013.a9f7.33d4 Fa0/20
0019.2119.32be Fa0/20
Файл с ip и mac
10.27.1.1 7081.051a.bbbf
10.27.1.2 2c3f.380e.4441
10.27.1.3 0022.1546.481c
10.27.1.52 0019.6660.741a
10.27.1.103 0001.807d.7007
10.27.1.189 00a8.59c4.0318
I10.27.1.235 001e.90f9.1476
-
SLEDopit
- Модератор
- Сообщения: 4824
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: Построчное сравнение двух файлов
А, ну конечно работать не будет. Вы в первом сообщении указали формат файлов mac-port и mac-ip (порядок для join'а важен).
Если порядок идёт mac-port и ip-mac об этом всенепременно необходимо сообщить join'y (и sort'y):
зы. ай-яй-яй, под рутом работаете (:
Если порядок идёт mac-port и ip-mac об этом всенепременно необходимо сообщить join'y (и sort'y):
Код: Выделить всё
join -i -1 1 -2 2 <(sort mac-port) <(sort -k2 ip-mac)зы. ай-яй-яй, под рутом работаете (:
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
The more you believe you don't do mistakes, the more bugs are in your code.
-
victor_g
- Сообщения: 5
Re: Построчное сравнение двух файлов
SLEDopit писал(а): ↑08.02.2013 17:36А, ну конечно работать не будет. Вы в первом сообщении указали формат файлов mac-port и mac-ip (порядок для join'а важен).
Если порядок идёт mac-port и ip-mac об этом всенепременно необходимо сообщить join'y (и sort'y):
Код: Выделить всё
join -i -1 1 -2 2 <(sort mac-port) <(sort -k2 ip-mac)
зы. ай-яй-яй, под рутом работаете (:
Он вообще ничего не выдает на это.
Это не сервер, на ноуте в виртуалке с файрволом эксперементировал.
-
SLEDopit
- Модератор
- Сообщения: 4824
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: Построчное сравнение двух файлов
На вышеприведённых огрызках файлов оно выдаёт
Код: Выделить всё
$ join -i -1 1 -2 2 <(sort maс-port) <(sort -k2 ip-mac)
0001.807d.7007 Fa0/20 10.27.1.103(номера после -1 и -2 - это номера одинаковых столбцов, по которым происходит склеивание)
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
The more you believe you don't do mistakes, the more bugs are in your code.
-
Bizdelnick
- Модератор
- Сообщения: 21504
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Построчное сравнение двух файлов
Ну так покажите весь свой скрипт. Судя по тому, что в оригинале это была 5 строка, Вы туда ещё что-то добавили.
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
victor_g
- Сообщения: 5
Re: Построчное сравнение двух файлов
Bizdelnick писал(а): ↑08.02.2013 23:48
Ну так покажите весь свой скрипт. Судя по тому, что в оригинале это была 5 строка, Вы туда ещё что-то добавили.
#!/usr/bin/perl
#
#
open(PORTS, $ARGV[0]);
while (<PORTS>) {
($mac, $port) = splin /\s+/;
$ports{$mac} = $ports;
}
сlose(PORTS);
#
open (IPS, $ARGV[1]);
while (<IPS>) {
($mac, $ip) = split /\s+/;
$ips{$mac} = $ip;
}
close(IPS);
#
foreach (sort keys %ports) {
print "$ports{$_} $_ $ips{$_}\n";
}
Я ошибся, не ту строку скопировал Вам. 13 строка у меня ($mac, $ip) = split /\s+/;. На нее ошибка.
SLEDopit писал(а): ↑08.02.2013 18:28На вышеприведённых огрызках файлов оно выдаёт
вы точно так же запускаете?Код: Выделить всё
$ join -i -1 1 -2 2 <(sort maс-port) <(sort -k2 ip-mac) 0001.807d.7007 Fa0/20 10.27.1.103
(номера после -1 и -2 - это номера одинаковых столбцов, по которым происходит склеивание)
У меня ничего. Я уже и файлы создал новые (в оригинальных пробелов много).
Запускаю также.
Но, спасибо за помощь! Может в системе косяк где. Попробую на другой машине.
-
Bizdelnick
- Модератор
- Сообщения: 21504
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Построчное сравнение двух файлов
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |