O arquivo file1.txt contém linhas como:
/api/purchase/<hash>/index.html
Por exemplo:
/api/purchase/12ab09f46/index.html
O arquivo file2.csv contém linhas como:
<hash>,timestamp,ip_address
Por exemplo:
12ab09f46,20150812235200,22.231.113.64
a77b3ff22,20150812235959,194.66.82.11
Quero filtrar file2.csv removendo todas as linhas em que o valor de hash também está presente em file1.txt. Isso é para dizer:
cat file1.txt | extract <hash> | sed '/<hash>/d' file2.csv
ou algo parecido com isto.
Deve ser simples, mas pareço incapaz de fazê-lo funcionar.
Alguém pode fornecer um pipeline de trabalho para esta tarefa?
fonte
cat
, apenascut -d / -f 4 file1.txt
. Ou, se você preferir o visual seqüencial,<file1.txt cut -d / -f 4
awk
Solução possível :Primeiro, lemos
file1.txt
usandoFS
(separador de campo) "/" e criamos a matriz x com os valores das chaves do campo,$4
que é o hash que você deseja. A seguir lemos segundo arquivo defile2.txt
configuraçãoFS
para ser,
e verificar se o valor de campo$1
não existe como chave em ordemx
e se não nós imprimi-lo.O mesmo mais idiomático que proposto nos comentários pode ser:
fonte
!($1 in x)
vez de{ if (!($1 in x)) print $0; }
awk
solução baseada ... a longo prazo, você aprenderá a buscar soluções que podem ser alcançadas usando tubos menores para simplificar ... :)Para GNU sed
onde first sed produz uma lista de hashes no formato sed-command-like
/12ab09f46\|a77b3ff22\|..../d
e transfere-a para o próximo sed -script, que lê o comando acima da-f -
opção input, portanto .Mesmo com grep
ou sem expressões perl:
ou ainda melhor com o corte :
fonte
Observe que as picadas de pesquisa são
/$key/
e,^$key,
para reduzir os resultados, devem estar entre duas barras (arquivo 1) ou a primeira entrada de uma linha e seguidas por uma vírgula (arquivo 2). Isso deve torná-lo seguro se as chaves pareceremno arquivo 2 ou como
no arquivo 1
fonte
Eu apenas tentei o seguinte liner e parece fazer o trabalho:
Substitua primeiro -ri por -re para testá-lo. -re faz uma corrida a seco e, se estiver tudo bem, você pode executá-la com -ri
fonte
Além da resposta de Gabriele Lana , observe que o comando colar do BSD precisa que o traço seja especificado para ler o conteúdo da entrada padrão.
comando manual de colar
Então final precisa ser alterado como abaixo
fonte