Сравнить два файла по первому столбцу

Сравнить два файла по первому столбцу

У меня есть два файла, и я хотел бы получить новый файл только с теми строками, которые есть в первом файле, но отсутствуют во втором. Пример:

файл1:

ID      firstname        lastname
1       John             Wilkens
2       Andrea           Smith
3       Matthew          Freberg
4       Brenda           Something

файл2:

ID      firstname        lastname
1       John             Wilkens
2       Andrea           Willems
3       Jay              Freberg
5       Mike             Hart

Выход:

ID      firstname        lastname
4       Brenda           Something

Я пробовал использовать comm, но он также выдает строки, в которых что-то было изменено, например, ID 2 и 3.

Не могли бы вы мне помочь с этим?

решение1

$ awk 'NR==FNR{a[$1]; next} FNR==1 || !($1 in a)' file2 file1
ID      firstname        lastname
4       Brenda           Something
  • NR==FNR{a[$1]; next}Использовать первый столбец file2для построения ключей массива
    • NRотслеживает общее количество прочитанных записей, FNRимеет номер записи только для текущего читаемого файла. Таким образом, NR==FNRэто верно только для первого файла (при условии, что он не пустой)
  • FNR==1 || !($1 in a)для file1файла, вывести строку заголовка или если первый столбец не найден в массивеa
  • Используйте awk -F'\t' '...', если вводимые данные разделены табуляцией и awk -F, '...'запятыми.

Если первый файл может быть пустым, используйте это:

awk '!f{a[$1]; next} FNR==1 || !($1 in a)' file2 f=1 file1

Это установит флаг fмежду двумя файлами.

решение2

В командной строке bash вы можете сделать следующее. Отфильтровать идентификаторы из file2 и поискать их в file1, но только в начале строки:

$ grep -vf <(< file2 tail -n+2 | grep -Eo '^[^ ]{1,}'|sed 's/.*/^& /') file1
ID      firstname        lastname
4       Brenda           Something

Связанный контент