Сравнить два текстовых файла, с исключением повторяющихся строк

Задача наверное покажется странной, но надеюсь, что кто-нибудь сможет помочь.

И так, есть два *.txt файла

Первый «base.txt»:
01
02
02

03
04
05

Второй «exceptions.txt»:
04
08
15
16
23
42


Можно ли сделать так, чтобы автоматически удалялись строки с идентичным содержанием из первого файла?
Только вне зависимости от того, находятся ли совпадение на одних и тех же строках по порядку.
В идеале, конечно, чтобы еще и дубли в первом файле удалялись автоматически, но это уже не критично.

image

В итоге должен получится вот такой: «base.txt»
01
02
03
05


Может посоветуете какую-нибудь годную софтину или плагин? Решение надо найти в рамках OS'ей: Windows 7 / Ubuntu / Centos. И плагин для любой программы, лишь бы работало.

Спасибо.

UPD. до поры до времени спасал grep, теперь ругается на файл исключения (2000 тысячи строк) Regular expression too big
  • Вопрос задан
  • 14223 просмотра
Пригласить эксперта
Ответы на вопрос 4
sledopit
@sledopit
Ну плагин вы такой навряд ли найдёте. Задача довольно специфичная. А вот наваять однострок под это дело очень просто:
grep -vf exceptions.txt base.txt | sort -u

выведет вам очищенный base.txt без дублей.
если вам нужно сохранить его обратно в base.txt, но не стоит добавлять > base.txt в конце, нужно действовать через временный файл:
grep -vf exceptions.txt base.txt | sort -u > base.tmp ; mv base.tmp base.txt


Хотя из условия не очень понятно, нужно ли от одинаковых вхождений очищать ещё и exceptions.txt. Если нужно, тогда логика поменяется.
Ответ написан
might
@might
javascript developer
Рекомендую софтину WinMerge
Ответ написан
Комментировать
IlyaEvseev
@IlyaEvseev
Opensource geek
Велосипед:
#!/usr/bin/perl

use strict;
use warnings;

die "Usage: $0 filtered.txt filter.txt\n" if @ARGV != 2;

my %filter;

open F, $ARGV[1] or die "Cannot open $ARGV[1]: $!\n";
while(<F>) {
    chomp;
    $filter{$_} = 1;
}
close F;

open F, $ARGV[0] or die "Cannot open $ARGV[0]: $!\n";
while(<F>) {
    chomp;
    print "$_\n" unless $filter{$_};
    $filter{$_} = 1;
}
Ответ написан
Комментировать
@DancingOnWater
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы