Трубопровод sed для grep не работает должным образом

У меня есть 2 файла:

$ cat file1 jim.smith john.doe bill.johnson alex.smith $ cat file2 "1/26/2017 8:02:01 PM",Valid customer,jim.smith,NY,1485457321 "1/30/2017 11:09:36 AM",New customer,tim.jones,CO,1485770976 "1/30/2017 11:14:03 AM",New customer,john.doe,CA,1485771243 "1/30/2017 11:13:53 AM",New customer,bill.smith,CA,1485771233 

Я хочу, чтобы из файла2 все имена, которые не существуют в файле1.
Не работает следующее:

 $ cut -d, -f 3 file2 | sed 's/"//g' | grep -v file1 jim.smith tim.jones john.doe bill.smith 

Почему в этом случае труба grep -v не работает?

4 Solutions collect form web for “Трубопровод sed для grep не работает должным образом”

Это фактически последний шаг в моем ответе на ваш предыдущий вопрос .

Ваше решение работает, если вы добавите -f перед file1 в grep :

 $ cut -d, -f3 file2 | grep -v -f file1 tim.jones bill.smith 

С -f grep будет выглядеть в file1 для шаблонов. Без него он просто будет использовать file1 как буквенный шаблон.

Вы также можете использовать -F так как иначе точка в шаблоне будет интерпретироваться как «любой символ». И пока вы на нем, поместите -x туда, чтобы grep выполнил матч по всей строке (будет полезно, если у вас есть joe.smith который не должен соответствовать joe.smiths ):

 $ cut -d, -f3 file2 | grep -v -F -x -f file1 

Это требует, очевидно, что в конце строк в file1 нет конечных пробелов (что, похоже, содержится в тексте вопроса).

Обратите внимание, что sed не нужен, так как выход cut не содержит никаких " . Также, если вам нужно было удалить все " , тогда tr -d '"' был бы лучшим инструментом.

Попробуй это. Нет sed . Требуется GNU diff и bash .

 diff --new-line-format="" --unchanged-line-format="" <(cut -f3 -d, file2|sort) <(sort file1) 

Получает результаты:

 bill.smith tim.jones 

Это должно работать:

 $ pattern=$(cut -d, -f 3 file2) $ grep -v -e "$pattern" file1 

В вашем примере grep пропускает свой шаблон. Кроме того, grep может читать либо файл, либо stdin (по каналу), а не оба. Если имя файла не указано, grep читает из stdin.

Кроме того, это может также работать:

 $ grep -v -f <(cut -d, -f3 file1) file2 

Извините, он не проверен.

Ответ с grep -f , вероятно, лучший, но немного стильная альтернатива:

 % cut -d, -f3 file2 >names2 % cat file1 file1 names2 | sort | uniq -u bill.smith tim.jones % 

Разумеется, это требует дополнительного временного файла (или развлечений и игр с файловыми дескрипторами), и я бы не захотел попробовать его с большими файлами.

Я упоминаю об этом только потому, что для задач, связанных с сопоставлением файлов, sort plus uniq является неожиданно универсальной и, возможно, недооцененной, парой инструментов. Для выполнения быстрых задач они могут обеспечить необходимый результат для результата.

  • Как удалить строки короче XY?
  • Простое использование суффикса адресной строки '/ M'?
  • sed one-liner, чтобы удалить все между двумя скобками?
  • Код рефакторинга с использованием sed
  • Заменить соответствия многострочной строкой с помощью sed
  • Перемещение файлов в отдельные каталоги на основе группировки, определенной в файле CSV
  • Почему непоследовательность с использованием cat и echo для этой команды sed?
  • Как получить последнее вхождение строк между двумя шаблонами из файла?
  • Используйте SED или AWK для перемещения строк по столбцам
  • проверка данных в столбцах, когда данные или некоторые могут отсутствовать или присутствовать?
  • Почему этот простой скрипт grep / sed работает
  • Linux и Unix - лучшая ОС в мире.