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

сравнение файлов...

Добавлено: 2008-07-30 13:26:53
LMik
Хм.. вот задачка такая...

Есть значит два файла 10 и 20, в них построчно вбиты IP адреса, в файле 10 есть адреса которые так же есть и в 20, чем бы из 20 удалить адреса которые есть в 10?

Re: сравнение файлов...

Добавлено: 2008-07-30 13:43:44
paradox
брр
а зачем удалять их с 20
если их уже нет в 10
)))?

Re: сравнение файлов...

Добавлено: 2008-07-30 14:15:42
LMik
paradox писал(а):брр
а зачем удалять их с 20
если их уже нет в 10
)))?
ЭЭЭ

Давай так.
В файле 10 есть список ипов.
В файле 20 есть список ипов.
В обоих файлах есть одинаковые ипы.
Как из файла 20 вычесть ипы которые уже есть в файле 10?

Re: сравнение файлов...

Добавлено: 2008-07-30 14:28:44
paradox
tr и sad я незнаю))
поэтому поизвращался бы diff и grep

Re: сравнение файлов...

Добавлено: 2008-07-30 14:32:10
LMik
paradox писал(а):tr и sad я незнаю))
поэтому поизвращался бы diff и grep
чето я фтыкал фтыкал в ман дифа так и не нашел ничего :(

Re: сравнение файлов...

Добавлено: 2008-07-30 15:00:30
salvator

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

#!/usr/bin/perl

use strict;

sub f2a($) {
    open(F, shift) || die $!;
    my @i = <F>;
    chomp @i;
    close(F10);
    return @i;
}

my %h10 = map { ($_=>1) } f2a("10");
print join "\n", grep {!defined($h10{$_})} f2a("20");
print "\n";

Re: сравнение файлов...

Добавлено: 2008-07-30 15:09:08
LMik
salvator писал(а):

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

#!/usr/bin/perl

use strict;

sub f2a($) {
    open(F, shift) || die $!;
    my @i = <F>;
    chomp @i;
    close(F10);
    return @i;
}

my %h10 = map { ($_=>1) } f2a("10");
print join "\n", grep {!defined($h10{$_})} f2a("20");
print "\n";
Так... и чо оно делает? Выдало список ипов... это кто?

Re: сравнение файлов...

Добавлено: 2008-07-30 15:16:10
paradox
Так... и чо оно делает? Выдало список ипов... это кто?
)))
типа нашло ипы которых нет ни в 10 ни в 20?
:ROFL: :ROFL:

Re: сравнение файлов...

Добавлено: 2008-07-30 15:21:08
LMik
paradox писал(а):
Так... и чо оно делает? Выдало список ипов... это кто?
)))
типа нашло ипы которых нет ни в 10 ни в 20?
:ROFL: :ROFL:
:D

Походу выдало таблицу 20 без ипов 10, теперь как в перл передать параметры командной строки?

Re: сравнение файлов...

Добавлено: 2008-07-30 16:18:14
salvator

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

#!/usr/bin/perl

use strict;

sub f2a($) {
    open(F, shift) || die $!;
    my @i = <F>;
    chomp @i;
    close(F10);
    return @i;
}

my %h10 = map { ($_=>1) } f2a($1);
print join "\n", grep {!defined($h10{$_})} f2a($2);
print "\n";
первый параметр - файл 10, второй - 20

Re: сравнение файлов...

Добавлено: 2008-07-30 16:22:31
dikens3

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

#!/bin/sh

file1="10"
file2="20"
tmp_file="tmp"

ip_file1=$(cat $file1)

for i in $ip_file1
    do
    sed /"$i"/D $file2 > $tmp_file
    mv $tmp_file $file2
    done

Re: сравнение файлов...

Добавлено: 2008-07-30 16:30:49
LMik
а как diff сделать в формате патча, типа со сточками и вначале + -?

Re: сравнение файлов...

Добавлено: 2008-07-30 16:32:38
paradox

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

diff -urN файл1 файл2

Re: сравнение файлов...

Добавлено: 2008-07-31 8:47:19
LMik
dikens3 писал(а):

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

#!/bin/sh

file1="10"
file2="20"
tmp_file="tmp"

ip_file1=$(cat $file1)

for i in $ip_file1
    do
    sed /"$i"/D $file2 > $tmp_file
    mv $tmp_file $file2
    done
На перле быстрее в разы отработало...

Re: сравнение файлов...

Добавлено: 2008-07-31 10:33:57
manefesto
на перле пишут проги, на шеле скрипты...

Re: сравнение файлов...

Добавлено: 2008-07-31 10:34:18
salvator
LMik писал(а):
dikens3 писал(а):

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

#!/bin/sh

file1="10"
file2="20"
tmp_file="tmp"

ip_file1=$(cat $file1)

for i in $ip_file1
    do
    sed /"$i"/D $file2 > $tmp_file
    mv $tmp_file $file2
    done
На перле быстрее в разы отработало...
так извините, здесь вы в цикле запускаете sed и mv - огромные расходы на fork();
а в случае с перлом - все работает в одном процессе

Re: сравнение файлов...

Добавлено: 2008-07-31 10:45:23
dikens3
так извините, здесь вы в цикле запускаете sed и mv - огромные расходы на fork();
а в случае с перлом - все работает в одном процессе
Вопросы качества программирования и т.п. обсуждаются на ЛОР, BASH.ORG и т.п.

Если что-то смешно, тогда можно отправиться туда и повеселиться. Лично мне что в голову пришло, то и написал. Тем более perl я не знаю. Да и сами скрипты не писал уже года 2.

Re: сравнение файлов...

Добавлено: 2008-07-31 11:08:03
salvator
dikens3 писал(а):Если что-то смешно, тогда можно отправиться туда и повеселиться. Лично мне что в голову пришло, то и написал. Тем более perl я не знаю. Да и сами скрипты не писал уже года 2.
Я не в коем случае не хотел поднимать вопросы качества программирования или инструментов для написания скриптов. Использование вызовов внешних программ - особенность шелл скриптов и никуда от них не уйдешь. Но это добавляет им простоты и гибкости.

Re: сравнение файлов...

Добавлено: 2008-07-31 11:13:37
LMik
salvator писал(а):
dikens3 писал(а):Если что-то смешно, тогда можно отправиться туда и повеселиться. Лично мне что в голову пришло, то и написал. Тем более perl я не знаю. Да и сами скрипты не писал уже года 2.
Я не в коем случае не хотел поднимать вопросы качества программирования или инструментов для написания скриптов. Использование вызовов внешних программ - особенность шелл скриптов и никуда от них не уйдешь. Но это добавляет им простоты и гибкости.
+1 Спасибо, обидеть не хотел.

Теперь интересует конструкция сравнения файла 10 и 20 и выдергивания из файла 10 ипов которых нет в 20.

Re: сравнение файлов...

Добавлено: 2008-07-31 13:27:10
salvator
LMik писал(а):Теперь интересует конструкция сравнения файла 10 и 20 и выдергивания из файла 10 ипов которых нет в 20.

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

#!/usr/bin/perl

use strict;

sub f2a($) {
    open(F, shift) || die $!;
    my @i = <F>;
    chomp @i;
    close(F10);
    return @i;
}

my ($f1, $f2) = @ARGV;

my %h10 = map { ($_=>1) } f2a($f1);
print join "\n", grep {!defined($h10{$_})} f2a($f2);
print "\n";
тот же скрипт фактически. аргументы местами поменяйте

Re: сравнение файлов...

Добавлено: 2008-07-31 13:46:00
LMik
salvator писал(а):
LMik писал(а):Теперь интересует конструкция сравнения файла 10 и 20 и выдергивания из файла 10 ипов которых нет в 20.
тот же скрипт фактически. аргументы местами поменяйте
я тоже так сначала подумал, а вот нифига :( Не работает так.

Re: сравнение файлов...

Добавлено: 2008-07-31 14:39:57
salvator
LMik писал(а):я тоже так сначала подумал, а вот нифига :( Не работает так.
Тогда задачу уточните, works for me:

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

$ cat kk.pl
#!/usr/bin/perl

use strict;

sub f2a($) {
    open(F, shift) || die $!;
    my @i = <F>;
    chomp @i;
    close(F10);
    return @i;
}

my ($f1, $f2) = @ARGV;

my %h10 = map { ($_=>1) } f2a($f1);
print join "\n", grep {!defined($h10{$_})} f2a($f2);
print "\n";

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

$ cat 10 
1.2.3.4
5.4.3.2
5.6.7.8
n1.2.3.4
n5.4.3.2
n5.6.7.8

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

$ cat 20
1.2.3.4
1.2.3.4
1.2.3.4
1.2.3.4
1.2.3.4
1.2.3.4
5.4.3.2
5.6.7.8
5.4.3.2
5.6.7.8
5.4.3.2
5.6.7.8
5.4.3.2
5.6.7.8
5.4.3.2
5.6.7.8
5.4.3.2
5.6.7.8

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

$ ./kk.pl 20 10
n1.2.3.4
n5.4.3.2
n5.6.7.8
Показывает те, которые есть в 10 и нет в 20

Re: сравнение файлов...

Добавлено: 2008-07-31 14:43:31
LMik
salvator писал(а): Показывает те, которые есть в 10 и нет в 20
Должно быть так

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

в 10
10.11.12.13
10.11.12.14
10.11.12.15
10.11.12.16

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

в 20
10.11.12.13
10.11.12.14
В результате

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

10.11.12.15
10.11.12.16

Re: сравнение файлов...

Добавлено: 2008-07-31 14:50:45
manefesto
учи перл и регулярные выражения.

Re: сравнение файлов...

Добавлено: 2008-07-31 14:53:05
salvator
o_O у меня так и работает?)))

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

$ cat 10 
10.11.12.13
10.11.12.14
10.11.12.15
10.11.12.16

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

$ cat 20 
10.11.12.13
10.11.12.14

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

$ ./kk.pl 20 10
10.11.12.15
10.11.12.16
вы точно в правильном порядке запускаете и точно та версия скрипта?

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

$ cat kk.pl
#!/usr/bin/perl

use strict;

sub f2a($) {
    open(F, shift) || die $!;
    my @i = <F>;
    chomp @i;
    close(F10);
    return @i;
}

my ($f1, $f2) = @ARGV;

my %h10 = map { ($_=>1) } f2a($f1);
print join "\n", grep {!defined($h10{$_})} f2a($f2);
print "\n";
В самом начале имена файлов были hardcoded