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>