4

У меня есть файл, содержащий слова (по одному в строке), такие как

Собака
Рыба
Кошка
обувь

У меня есть дополнительный файл в формате CSV, такой как

1, обувь, красный
2, яблоко, черный
3, туман, синий

Я хотел бы использовать grep с первым файлом, являющимся шаблоном поиска, если строка во вторичном файле содержит слово в первом файле, я хотел бы полностью удалить строку во вторичном файле.

Я не уверен, что grep - даже способ пойти по этому поводу.

РЕДАКТИРОВАТЬ: скрипты Bash

1 ответ1

9

Вы можете сделать это с помощью опции grep -f (это -f , а не -F):

% echo -e 'Dog\nFish\nCat\nShoes' > ./file1.txt 
% echo -e '1,shoes,red\n2,apple,black\n3,fog,blue' > ./file2.csv 

# Grab all lines from the CSV that match a pattern from file1:
% grep -if ./file1.txt ./file2.csv
1,shoes,red

# Grab all lines from the CSV that DON'T match a pattern from file1:
% grep -vif ./file1.txt ./file2.csv
2,apple,black
3,fog,blue

Детальное объяснение:

  • grep - говорит сам за себя
  • -v - означает «возврат строк, не соответствующих шаблону ввода»
  • -i - означает «использовать сопоставление без учета регистра» (поскольку ваш первый файл имел заглавные буквы, а CSV - нет)
  • -f - означает «интерпретировать каждую строку в указанном файле (file1.txt) как шаблон для сопоставления»

В зависимости от желаемых результатов и содержимого ваших файлов, вы можете также прочитать опции -F и -w .

Если вам нужно отредактировать файл на месте, я думаю , что вы можете сделать это с sed «s опции -f но sed интерпретирует каждую строку файла в качестве команды , а не простой схеме , как grep делает.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .