Да. Стандарт grep
инструмент для поиска файлов для текстовых строк может использоваться для вычитания всех строк в одном файле от другого.
grep -F -x -v -f fileB fileA
Это работает при помощи каждой строки в fileB как шаблон (-f fileB
) и обработка его как простая строка для соответствия (не регулярный regex) (-F
). Вы вынуждаете соответствие произойти на целой строке (-x
) и распечатайте только строки, которые не соответствуют (-v
). Поэтому Вы распечатываете строки в fileA, которые не содержат те же данные как никакая строка в fileB.
Оборотная сторона этого решения - то, что оно не принимает порядок строки во внимание и если Ваш вход имеет дублирующиеся строки в различных местах, Вы не могли бы получить то, что Вы ожидаете. Решение этого состоит в том, чтобы использовать реальный инструмент сравнения такой как diff
. Вы могли сделать это путем создания различного файла со значением контекста в 100% строк в файле, затем парсинга его для просто строк, которые будут удалены при преобразовании файла A в файл B. (Обратите внимание, что эта команда также удаляет разность, форматирующую после того, как это получает правильные строки.)
diff -U $(wc -l < fileA) fileA fileB | sed -n 's/^-//p' > fileC
Ответ зависит много от типа и формата файлов, которые Вы сравниваете.
Если файлы, которые Вы сравниваете, являются отсортированными текстовыми файлами, то инструмент GNU, записанный Richard Stallman и позвонившим Davide McKenzie comm
может выполнить фильтрацию, Вы после. Это - часть coreutils.
Скажите, что у Вас есть следующие 2 файла:
$ cat a
1
2
3
4
5
$ cat b
1
2
3
4
5
6
Строки в файле b
это не находится в файле a
:
$ comm <(sort a) <(sort b) -3
6
<()
? Это работает, и я получаю его, но есть ли название этой странности?
– mlissner
06.04.2017, 01:47
comm
был первоначально записан приблизительно 1973 кем-то в Bell Labs, не RMS. Вы обращаетесь к реализации GNU, которая произошла намного позже. Было много различных реализаций утилит Unix через годы.
– Stéphane Chazelas
30.10.2017, 10:33
Вы могли также рассмотреть vimdiff, он выделяет различия между файлами в редакторе Vim
Если файлы являются большими, и у Вас нет пользовательского порядка к Вашим записям, grep берет слишком долго. Быстрая альтернатива была бы
sort file1 > 1
sort file2 > 2
diff 1 2 | grep "\>" | sed -e 's/> //'
[результаты file2-file1 для экранирования передайте по каналу в файл и т.д.]
Изменение >
кому: <
получил бы противоположное вычитание. rm 1 2
от stackoverflow...
коммуникация-23 file1 file2
- 23 подавляет строки, которые находятся в обоих файлах, или только в файле 2. Файлы должны быть отсортированы (они находятся в Вашем примере), но в противном случае передайте их по каналу через вид сначала...
См. страницу справочника здесь
grep и коммуникация (с видом) методы занимают много времени на больших файлах. SiegeX и ghostdog74 совместно использовали два замечательных awk метода для извлечения строк, уникальных для одного из двух файлов на Переполнении стека:
$ awk 'FNR==NR{a[$0]++}FNR!=NR && !a[$0]{print}' file1 file2
$ awk 'FNR==NR{a[$0]++;next}(!($0 in a))' file1 file2
combine
из пакет moreutils интуитивно понятен:
combine fileA not fileB
Файлы не нужно сортировать, порядок сохраняется.
Существуют также операторы xor
, or
и and
.
awk 'NR==FNR{a[$1];next}!($1 in a){print }' fileA fileB
cat fileA
1
2
3
4
5
6
7
8
9
file B
8
9
10
11
12
13
14
15
16
17
18
19
output
10
11
12
13
14
15
16
17
18
19
It will print contents of fileB which is not in fileA
-u
аргумент действительно на самом деле берет параметр числа, пока он не сопровождается пространством. Преимущество способа, которым у меня был он прежде, состоит в том, что это будет работать с или без значения, таким образом, Вы могли использовать что-то в этом, sub управляют стандартной программой, которая возвратила не вывод. Верхний регистр '-U', с другой стороны, требует аргумента. – Caleb 28.08.2013, 00:46diff
конвейерно обработайте работы, которые благодарит обработка. – Felipe Alvarez 04.11.2016, 01:01grep
по мере необходимости. Пример:grep -F -x -v -f <(sort fileB) <(sort fileA)
– Tony Cesaro 04.10.2017, 18:22diff
то положение в файле, принят во внимание. – Caleb 05.10.2017, 09:06