Файл file1.txt содержит такие строки:
/api/purchase/<hash>/index.html
Например:
/api/purchase/12ab09f46/index.html
Файл file2.csv содержит такие строки:
<hash>,timestamp,ip_address
Например:
12ab09f46,20150812235200,22.231.113.64
a77b3ff22,20150812235959,194.66.82.11
Я хочу отфильтровать file2.csv, удалив все строки, где значение hash присутствует также в file1.txt. Это сказать:
cat file1.txt | extract <hash> | sed '/<hash>/d' file2.csv
или что-то вроде этого.
Это должно быть просто, но я не могу заставить его работать.
Кто-нибудь может предоставить рабочий конвейер для этой задачи?
источник
cat
, простоcut -d / -f 4 file1.txt
. Или, если вы предпочитаете последовательный взгляд,<file1.txt cut -d / -f 4
Возможное
awk
решение:Сначала мы читаем
file1.txt
с помощьюFS
(разделитель полей) "/" и создаем массив x со значениями ключей из поля,$4
которое является желаемым хешем. Далее мы читаем второй файлfile2.txt
настройку ,FS
чтобы быть,
и проверить , если значение поля$1
не существует в качестве ключа в массиве ,x
и если он не выводит его.Та же более идиоматическая, как предложено в комментариях:
источник
!($1 in x)
вместо{ if (!($1 in x)) print $0; }
awk
, если вы начнете изучать другие инструменты, такие как это решение на основе ... в конечном счете, вы научитесь стремиться к решениям, которые могут быть достигнуты с использованием меньших каналов для простоты ... :)Для GNU SED
где first sed создает список хэшей в формате sed-command-format
/12ab09f46\|a77b3ff22\|..../d
и передает его следующему сценарию sed, который читает указанную выше команду из ввода, поэтому-f -
опция.То же самое с grep
или без perl-выражений:
или еще лучше с разрезом :
источник
Обратите внимание, что строки поиска
/$key/
и^$key,
для уменьшения результатов должны быть либо между двумя косыми чертами (файл 1), либо быть первой записью строки, за которой следует запятая (файл 2). Это должно обеспечить безопасность, если ключи выглядят какв файле 2 или как
в файле 1
источник
Я только что попробовал следующий лайнер, и он, кажется, делает эту работу:
Пожалуйста, замените сначала -ri на -re, чтобы проверить это. -re делает пробный прогон, и если все в порядке, вы можете запустить его с -ri
источник
В дополнение к ответу Габриэле Ланы, обратите внимание, что для вставки команды BSD необходимо указать дефис для чтения содержимого из стандартного ввода.
руководство команды вставки
Таким образом, окончательное должно быть изменено, как показано ниже
источник