Исключить повторяющиеся строки из двух разных файлов и создать новые?

У меня есть несколько файлов списка слов, которые основаны на слове в строке.

Теперь я хочу создать новый файл, который должен быть:

сравнил первый и второй файл и подставил слова из второго файла, которых нет в первом, поместив их в третий файл.

Файл_1

слово1

слово2

слово3

слово4

слово5

Файл_2

слово1

слово3

слово5

слово7

слово9

Я пробовал несколько вещей:

cat file.1 file.2 | sort -n | uniq -u | cat > file.3

Но я получаю:

Файл_3

слово2

слово4

слово7

слово9

Также я пробовал:

cat file.1 file.2 | sort -n | uniq -d | cat > file.3

но снова получаю:

Файл_3

слово1

слово3

слово5

Я пробовал также с ECHO

echo $(cat file.{1,2} | sort -n | uniq -u) > file.3

Но я получаю одни и те же слова, и, что хуже всего, он печатает все в одну строку.

Окончательный File_3 должен содержать:

слово7

слово9

Потому что эти слова не найдены в первом файле.

Любая идея, как это сделать?


person black_hat_cat    schedule 15.12.2013    source источник
comment
Итак, вопрос можно перефразировать: удалить совпадающие строки из ввода? grep с правильными флагами должен это сделать: шаблон должен быть прочитан из файла, разделенного символами новой строки, и он должен печатать не совпадающие файлы вместо совпадающих. Я считаю, что у него есть флаги, чтобы сделать именно это, поэтому перечитайте справочную страницу.   -  person hyde    schedule 15.12.2013
comment
Может быть, вы забыли там несколько cat? Если серьезно; избегайте бесполезного использования cat.   -  person tripleee    schedule 15.12.2013


Ответы (4)


Если ваш файл невелик, вы можете дважды выполнить cat первый файл:

cat file.1 file.1 file.2 | sort -n | uniq -u | cat > file.3

но это дорого для больших файлов.

или с помощью grep вы можете добиться этого (спасибо @tripleee):

grep -F -x -v -f file.1 file.2 > file.3
person scriptmonster    schedule 15.12.2013
comment
grep удалит слишком много, если file.1 содержит частичные совпадения, и либо слишком мало, либо слишком много, если элементы в file.1 содержат символы, которые не совпадают сами с собой и только сами с собой в интерпретации регулярных выражений. Добавление -F -x устраняет обе проблемы. - person tripleee; 15.12.2013
comment
файлы в основном имеют размер от 5 до 15 ГБ: D - person black_hat_cat; 15.12.2013
comment
sort предполагает, что файлы еще не содержат дубликатов (и использует на два кота больше). - person tripleee; 15.12.2013

Попробуй это.

grep -F -x -v -f file.1 file.2 >file.3
person tripleee    schedule 15.12.2013

Возможно, используйте awk:

$ awk 'NR==FNR{a[$0];next}!($0 in a)' file_1 file_2 > file_3
$ cat file_3
word7
word9
person user000001    schedule 15.12.2013

Для этого вы можете использовать программу comm:

comm -13 <(sort file_1) <(sort file_2)
person John Bartholomew    schedule 15.12.2013