
У меня есть два файла, и я хотел бы получить новый файл только с теми строками, которые есть в первом файле, но отсутствуют во втором. Пример:
файл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