BASH - удалить строку, если содержимое первого столбца появляется в другом файле

Если у меня есть два файла. Файл А выглядит так:

a 1
a 2
a 3
b 4
c 5

и у меня есть файл B, который имеет содержание:

a
b

Для всего, что появляется в файле B, а также в столбце 1 файла A, я хотел бы удалить эти строки. Таким образом, ожидаемый результат для файла A должен быть:

c 5

Любая помощь очень ценится!

2 ответа

GNU Awk:

awk 'ARGIND == 1 { del[$0]++ } ARGIND == 2 && !del[$1]' B A

При обработке первого файла (ARGIND 1), введите $0 (каждая целая строка) в ассоциативный массив del увеличивая его вход.

При обработке второго файла выведите, если первое поле $1 не связан с ненулевым счетчиком в del,

Конечно, мы делаем B первый файл и A второй.

(Действие печати подразумевается, когда ARGIND == 2 && !del[$1] Выражение шаблона дает логическое значение true. Шаблон без действия имеет действие воздействия, эквивалентное { print }).

ARGIND не в POSIX. В переносимом коде Awk для различения первого файла и второго может использоваться некрасивый хак.

awk 'FNR == NR { del[$0]++ } FNR < NR && !del[$1]' B A

Когда первый файл обрабатывается, "номер записи файла" (номер записи в текущем файле) равен "общему количеству записи" (абсолютное количество записей, обработанных во всех файлах). Конечно, это ломается, если первый файл вообще не содержит записей. Смотрите, что такое "NR==FNR" в awk?

Следующее сделает работу,

awk 'FNR==NR{map[$1]=1;next;}map[$1]==""{print;}' <fileB> <fileA>
Другие вопросы по тегам