Как удалить строки из текстового файла, который имеет определенное значение в колонке, через входной файл?

Все очень просто.

/etc/ssl/openssl.cnf имел незначительную проблему с конфигурацией. По-видимому, openssl обновился, требуя дополнительных полей, но, поскольку диспетчер пакетов учитывает личные конфигурации, он сохранил другой файл конфигурации как .backup рядом с используемой конфигурацией.

Моя конфигурация заменена на более новую по умолчанию, и все работает.

0
04.09.2018, 01:19
3 ответа

Опция -fожидает имя файла. Как вы это пишете, имя файла — это текст, следующий за f, в -vfw, другими словами, это w.

Вы должны поместить опцию, которая принимает аргумент в конце (, за исключением tar, которая использует странный разбор опции ).

Любой из них должен работать.

grep -v -w -f input.txt data.txt > output.txt
grep -vwf input.txt data.txt > output.txt
grep -vwfinput.txt data.txt > output.txt

Обратите внимание, :точное сообщение об ошибке, которое вы всегда должны цитировать полностью, когда задаете вопрос, упоминает имя w.

grep:w:Нет такого файла или каталога

2
28.01.2020, 02:16

Если вы хотите ограничить сравнение только вторым полем с разделителями, вы можете использовать awk вместо grep:

$ awk -F'|' 'NR==FNR {a[$1]++; next} !($2 in a)' input.txt data.txt > output.txt

$ cat output.txt
ESP|041336|46566|NY|CA
ESP|041340|46566|NY|CA
ESP|041341|46566|NY|CA
2
28.01.2020, 02:16
sed -nE '
   /\|/!{H;1h;d;}
   G
   /^[^|]+\|([^|]+)\|.*\n\1(\n|$)/!P
'  input.txt data.txt

Результат:

ESP|041336|46566|NY|CA
ESP|041340|46566|NY|CA
ESP|041341|46566|NY|CA

Комментарии:

  • Храните стропы input.txtв трюме, поскольку в нем нет трубы. /\|/!Эти строки разделены символом новой строки в пробеле.

  • Для строк данных мы добавляем область хранения к пространству шаблонов, а затем пытаемся найти второе поле с разделителями вертикальной чертой. Если его не найти, напечатайте часть перед первой новой строкой в ​​пространстве шаблонов P.

    Регулярное выражение, /^[^|]+\|([^|]+)\|.*\n\1(\n|$)/соответствует пространству шаблонов если второе|-поле с разделителем в строке данных (изdata.txt)соответствует одной из входных строк, которые находятся в конце пространства шаблона, разделенного символами новой строки. В конце есть условие ИЛИ, чтобы позаботиться о сценарии, когда совпадающий шаблон был последней строкой файла input.txt.

Предполагается версия GNU sed с включенными расширенными регулярными выражениями для уменьшения шума в строке.

1
28.01.2020, 02:16

Теги

Похожие вопросы