Інструмент в 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 швидша.
rici

18

comm ваш друг:

NAME comm - порівняйте два відсортовані файли по черзі

SYNOPSIS comm [ОПЦІЯ] ... FILE1 FILE2

ОПИС Порівняйте відсортовані файли 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 -1 -3 file.txt bigfile.txt > newbigfile.txt
Стів Мідглі

Я підтверджую, що я спробував команду grep, про яку повідомлялося вище, з файлами близько 100 МБ, і я отримав помилку "вбито". Спроба з комунікацією закінчилася успішно.
Gianluca Casati

Перенаправлення команд корисно для несортованих файлів або якщо вам потрібно більше двох файлів:comm -1 -3 <(sort BAD.txt GOOD.txt) <(sort FILES.txt)
odinho - Велмонт,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.