Инструмент в Unix для вычитания текстовых файлов?

16

У меня есть большой файл, состоящий из текстовых полей, разделенных точками с запятой в виде большой таблицы. Это было отсортировано. У меня есть файл меньшего размера, состоящий из тех же текстовых полей. В какой-то момент кто-то связал этот файл с другими, а затем сделал сортировку, чтобы сформировать большой файл, описанный выше. Я хотел бы вычесть строки маленького файла из большого (т. Е. Для каждой строки в маленьком файле, если в большом файле есть совпадающая строка, удалите эту строку в большом файле).

Файл выглядит примерно так

GenericClass1; 1; 2; NA; 3; 4;
GenericClass1; 5; 6; NA; 7; 8;
GenericClass2; 1; 5; NA; 3; 8;
GenericClass2; 2; 6; NA; 4; 1;

и т.д

Есть ли быстрый классный способ сделать это или мне нужно использовать awk?

Эшер
источник

Ответы:

28

Вы можете использовать grep. Дайте ему маленький файл в качестве входных данных и скажите, чтобы он нашел несоответствующие строки:

grep -vxFf file.txt bigfile.txt > newbigfile.txt

Используемые параметры:

   -F, --fixed-strings
          Interpret PATTERN as a  list  of  fixed  strings,  separated  by
          newlines,  any  of  which is to be matched.  (-F is specified by
          POSIX.)
   -f FILE, --file=FILE
          Obtain  patterns  from  FILE,  one  per  line.   The  empty file
          contains zero patterns, and therefore matches nothing.   (-f  is
          specified by POSIX.)

   -v, --invert-match
          Invert the sense of matching, to select non-matching lines.  (-v
          is specified by POSIX.)
   -x, --line-regexp
          Select only those matches that exactly match the whole line.  
          (-x is specified by POSIX.)
Тердон
источник
Хорошо, работал отлично. Огромное спасибо.
Эшер
1
Круто, что это сработало, но мне кажется, что и с этой -xопцией было бы лучше , если бы строка в меньшем файле оказалась для меня подстрокой другой строки в главном файле. Кроме того, вполне возможно, что ответ @ UlrichSchwarz будет быстрее.
Ричи
18

comm твой друг:

NAME comm - построчно сравнивать два отсортированных файла

ОПИСАНИЕ comm [ОПЦИЯ] ... ФАЙЛ1 ФАЙЛ2

ОПИСАНИЕ Сравнение отсортированных файлов FILE1 и FILE2 построчно.

   With  no  options, produce three-column output.  Column one contains lines unique to FILE1, column two contains
   lines unique to FILE2, and column three contains lines common to both files.

   -1     suppress column 1 (lines unique to FILE1)

   -2     suppress column 2 (lines unique to FILE2)

   -3     suppress column 3 (lines that appear in both files)

( commвероятно, будет иметь преимущество в производительности по сравнению grepс учетом сортировки.)

Например:

comm -1 -3 file.txt bigfile.txt > newbigfile.txt
Ульрих Шварц
источник
2
Хорошее замечание об использовании comm поверх grep для отсортированных списков. Это было бы лучшим ответом, если бы вы дали конкретный пример командной строки, такой какcomm -1 -3 file.txt bigfile.txt > newbigfile.txt
Стив Мидгли
Я подтверждаю, что попробовал указанную выше команду grep с файлами размером около 100 МБ и получил ошибку «kill». Попытка с комм завершена успешно.
Джанлука Касати
Перенаправление команд полезно для несортированных файлов или если вам нужно более двух файлов:comm -1 -3 <(sort BAD.txt GOOD.txt) <(sort FILES.txt)
odinho - Velmont