Сравните два файла и получите несопоставленные строки из второго файла на основе первого и второго столбца [дубликат]

Каталог / etc / skel на самом деле содержит все настройки вашей системы. Вам может помочь его резервное копирование и восстановление в новой установке.

1
25.01.2019, 07:39
3 ответа

Попробуйте:

$ awk -F'|' 'FNR==NR{a[$1,$2]=1; next}  !a[$1,$2]' file1 file2
TEST|123461|JOHN|DOE||
TEST|123462|STEVE|SMITH||

Как это работает

  • -F'|'указывает awk использовать |в качестве разделителя полей.

  • FNR==NR{a[$1,$2]=1; next}

    Для строк, принадлежащих первому файлу (FNR==NR), это указывает awk добавить запись в ассоциативный массив aпод ключом $1,$2со значением 1.

  • !a[$1,$2]

    Это говорит awk печатать любую строку, для которой !a[$1,$2]верно. Поскольку !является логическим отрицанием, это означает, что печатается любая строка, для которой a[$1,$2]является ложным (нулем ).

    Это означает, что строки, для которых мы установили a[$1,$2]=1, будут пропущены (, а не напечатаны ). Другие строки будут напечатаны.

3
27.01.2020, 23:18

joinот GNU coreutils имеет опцию -v, которая печатает непарные -строки из одного из двух исходных файлов. Использование этого для инвертирования спичек работает хорошо:

$ cat file1.txt
TEST|123456
TEST|123457
TEST|123458
TEST|123459
TEST|123460

$ cat file2.txt
TEST|123456|RAY|DOE||
TEST|123457|JANE|DOE||
TEST|123458|ROSE|DAWN||
TEST|123459|GEORGE|BRID||
TEST|123460|RALPH|DOE||
TEST|123461|JOHN|DOE||
TEST|123462|STEVE|SMITH||

$ join -t '|' -j 2 -o '2.1,2.2,2.3,2.4' -v 2 file1.txt file2.txt
TEST|123461|JOHN|DOE
TEST|123462|STEVE|SMITH
4
27.01.2020, 23:18

В Grep есть возможность получить регулярные выражения для сопоставления из файла.
Чтобы сделать первый файл регулярным выражением, нам нужно только добавить ^в начало каждой строки. Это можно сделать с помощью команды sed, например sed 's/.*/^&/' file1.

Затем мы передаем результат sed в grep следующим образом (ksh, zsh, bash):

grep -vf <(sed 's/.*/^&/' file1) file2
0
27.01.2020, 23:18

Теги

Похожие вопросы