El archivo file1.txt contiene líneas como:
/api/purchase/<hash>/index.html
Por ejemplo:
/api/purchase/12ab09f46/index.html
El archivo file2.csv contiene líneas como:
<hash>,timestamp,ip_address
Por ejemplo:
12ab09f46,20150812235200,22.231.113.64
a77b3ff22,20150812235959,194.66.82.11
Quiero filtrar file2.csv eliminando todas las líneas donde el valor de hash está presente también en file1.txt. Que quiere decir:
cat file1.txt | extract <hash> | sed '/<hash>/d' file2.csv
o algo como esto.
Debería ser sencillo, pero parece que no puedo hacerlo funcionar.
¿Alguien puede proporcionar una tubería de trabajo para esta tarea?
fuente
cat
, solocut -d / -f 4 file1.txt
. O si prefiere el aspecto secuencial,<file1.txt cut -d / -f 4
Posible
awk
solución:Primero leemos
file1.txt
usandoFS
(separador de campo) "/" y creamos una matriz x con valores de claves del campo,$4
que es el hash que desea. A continuación, leemos lafile2.txt
configuración del segundo archivoFS
para ser,
y verificamos si el valor del campo$1
no existe como clave en la matrizx
y si no lo imprimimos.Lo mismo más idiomático como se propone en los comentarios podría ser:
fuente
!($1 in x)
lugar de{ if (!($1 in x)) print $0; }
awk
solución basada ... a la larga, aprenderá a gravitar hacia soluciones que se pueden lograr utilizando tuberías menores para simplificar ... :)Para GNU sed
donde primero sed lista de productos de hashes en orden sed-formato como
/12ab09f46\|a77b3ff22\|..../d
y transferirla al siguiente SED -script que se lee por encima de comando desde por lo tanto, de entrada-f -
opción.Lo mismo con grep
o sin expresiones perl:
o incluso mejor con corte :
fuente
Tenga en cuenta que las picaduras de búsqueda son
/$key/
y^$key,
para reducir los resultados, ya sea entre dos barras (archivo 1) o como la primera entrada de una línea y seguidas de una coma (archivo 2). Esto debería hacerlo seguro si las teclas se ven comoen el archivo 2, o como
en el archivo 1
fuente
Acabo de probar el siguiente revestimiento, y parece hacer el trabajo:
Reemplace first -ri con -re para probarlo. -re realiza una ejecución en seco, y si todo está bien, puede ejecutarlo con -ri
fuente
Además de la respuesta de Gabriele Lana, tenga en cuenta que el comando de pegado BSD necesita que se especifique el guión para leer el contenido de la entrada estándar.
manual de comando pegar
Entonces, la necesidad final debe ser el cambio como a continuación
fuente