Итак, вот быстрый ответ, но он не так эффективен:
$ join -v1 <(sort FileA) <(sort FileB) | tee UniqueA
e0f886f2124804b87a81defdc38ad2b492458f34 /home/user/second.txt
$ join -v2 <(sort FileA) <(sort FileB) | tee UniqueB
650bc1eb1b24604819eb342f2ebc1bab464d9210 /home/user/third.txt
Команда join сопоставляет строки из двух отсортированных файлов по ключу (который по умолчанию является первым полем с разделителем пробелов по умолчанию). Однако приведенные выше команды не так эффективны, потому что мы сортируем файлы дважды: один раз, чтобы получить значения, уникальные для первого файла (-v1), а затем снова, чтобы получить уникальные значения из второго (-v2). В скором времени я опубликую некоторые улучшения.
Вы можете получить уникальные значения за один вызов, но исходный файл будет потерян. Смотрите этот код ниже:
$ join -v1 -v2 <(sort FileA) <(sort FileB)
650bc1eb1b24604819eb342f2ebc1bab464d9210 /home/user/third.txt
e0f886f2124804b87a81defdc38ad2b492458f34 /home/user/second.txt
На данный момент у нас почти есть наш ответ. У нас есть все непревзойденные файлы из обоих файлов. Более того, мы отсортировали каждый файл только один раз. Я считаю, что это эффективно. Однако вы потеряли информацию о происхождении. Мы можем пометить строки с помощью sed, используя эту итерацию или код:
$ join -v1 -v2 <(sort FileA | sed s/$/\ A/ ) <(sort FileB | sed s/$/\ B/ )
650bc1eb1b24604819eb342f2ebc1bab464d9210 /home/user/third.txt B
e0f886f2124804b87a81defdc38ad2b492458f34 /home/user/second.txt A
На данный момент у нас есть уникальные записи, и мы знаем файл, из которого они пришли. Если вы должны иметь результаты в отдельных файлах, я думаю, что вы можете сделать это с помощью awk (или просто с помощью bash). Вот еще одна итерация кода с включенным awk:
join -v1 -v2 <(sort FileA | sed s/$/\ A/ ) <(sort FileB | sed s/$/\ B/ ) | awk '{ file="Unique" $3 ; print $1,$2 > file }