Вывести строки из одного файла, которые не содержатся в другом файле

Я хочу напечатать строки, которые находятся в одном файле, но не в другом файле. Однако ни один из файлов не отсортирован, и мне нужно сохранить первоначальный порядок в обоих файлах.

 contents of file1:
 string2
 string1
 string3

 contents of file2:
 string3
 string1

 Output:
 string2

Есть ли простой сценарий, в котором я могу это сделать?

4 ответа

fgrep -x -f file2 -v file1

-x соответствует всей строке

-f ФАЙЛ берет шаблоны из ФАЙЛА

-v инвертирует результаты (показать несоответствие)

В Perl загрузите file2 в хеш, затем прочитайте file1, выводя только строки, которых не было в file2:

use strict;
use warnings;

my %file2;
open my $file2, '<', 'file2' or die "Couldn't open file2: $!";
while ( my $line = <$file2> ) {
    ++$file2{$line};
}

open my $file1, '<', 'file1' or die "Couldn't open file1: $!";
while ( my $line = <$file1> ) {
    print $line unless $file2{$line};
}
awk 'FNR==NR{a[$0];next} (!($0 in a))' file2 file1

comm <(sort a) <(sort b) -3 → Строки в файле b, которых нет в файле a

Другие вопросы по тегам