Трубопровод 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 не работает?

  • Как добавить другой префикс для каждой строки в grep-выходе?
  • Текстовая обработка только для условий, встречающихся в строке X до Y
  • df -k + как совместить строку корневого тома
  • нужно понимать использование «/» в команде sed
  • как использовать awk для вычитания с числами в большом файле
  • Как заменить \ 1 \ на новую строку
  • Как пропустить файл в sed, если он содержит регулярное выражение?
  • поиск по шаблону и отображение последнего текущего шаблона?
  • 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 является неожиданно универсальной и, возможно, недооцененной, парой инструментов. Для выполнения быстрых задач они могут обеспечить необходимый результат для результата.

    Interesting Posts

    Код выхода по умолчанию при завершении процесса?

    CUPS не распознает принтер квитанции Bluetooth

    Объектно-ориентированная оболочка Unix с возможностями LINQ?

    Как открыть процесс с терминала, не становясь дочерним процессом?

    Вызывают ли системные вызовы сами?

    Не удалось подключить раздел NTFS из учетной записи пользователя.

    Установка пользовательских паролей хэширования пароля в PAM

    Консольные TTY-дисплеи на встроенном мониторе Intel HD3000 вместо монитора NVidia GPU

    Как улучшить рендеринг шрифтов в Firefox

    Сила сигнала средняя от iw

    Как добавить путь к исходному каталогу, который будет обнаружен Unix, какая команда?

    Сброс TCP после SYN ACK, возможно, связанный с "no route to host"

    Получение ошибочной ошибки проверки подлинности в openldap

    Нужно ли luksClose раздел luks моего USB перед отключением его?

    Что такое пересылка порта ssh и какая разница между локальной и удаленной пересылкой портов

    Linux и Unix - лучшая ОС в мире.