Le fichier file1.txt contient des lignes comme:
/api/purchase/<hash>/index.html
Par exemple:
/api/purchase/12ab09f46/index.html
Le fichier file2.csv contient des lignes comme:
<hash>,timestamp,ip_address
Par exemple:
12ab09f46,20150812235200,22.231.113.64
a77b3ff22,20150812235959,194.66.82.11
Je veux filtrer file2.csv en supprimant toutes les lignes où la valeur de hachage est également présente dans file1.txt. Ce est-à-dire:
cat file1.txt | extract <hash> | sed '/<hash>/d' file2.csv
ou quelque chose comme ça.
Cela devrait être simple, mais je semble incapable de le faire fonctionner.
Quelqu'un peut-il fournir un pipeline fonctionnel pour cette tâche?
la source
cat
, justecut -d / -f 4 file1.txt
. Ou si vous préférez le look séquentiel,<file1.txt cut -d / -f 4
awk
Solution possible :D'abord, nous lisons en
file1.txt
utilisantFS
(séparateur de champs) "/" et créons le tableau x avec les valeurs des clés du champ$4
qui est le hachage que vous voulez. Ensuite , nous lisons deuxième fichierfile2.txt
paramètreFS
pour être,
et vérifier si la valeur de champ$1
n'existe pas comme clé dans le tableaux
et si elle ne nous l' imprimer.La même chose plus idiomatique que celle proposée dans les commentaires pourrait être:
la source
!($1 in x)
au lieu de{ if (!($1 in x)) print $0; }
awk
solution basée sur ... à long terme, vous apprendrez à graviter vers des solutions qui peuvent être obtenues en utilisant des tuyaux moindres pour plus de simplicité ... :)Pour GNU sed
où la première sed liste des produits de hash en commandant format sed comme
/12ab09f46\|a77b3ff22\|..../d
et le transférer à côté sed -script qui se lit ci - dessus commande d'entrée donc l'-f -
option.Idem avec grep
ou sans perl-expressions:
ou encore mieux avec coupe :
la source
Notez que les piqûres de recherche sont
/$key/
et^$key,
pour que les résultats soient soit entre deux barres obliques (fichier 1) soit comme la première entrée d'une ligne et suivis d'une virgule (fichier 2). Cela devrait le rendre sûr si les clés ressemblentdans le fichier 2, ou comme
dans le dossier 1
la source
Je viens d'essayer la doublure suivante, et elle semble faire l'affaire:
Veuillez remplacer first -ri par -re pour le tester. -re fait un essai à sec, et si tout va bien, vous pouvez l'exécuter avec -ri
la source
En plus de la réponse de Gabriele Lana, veuillez noter que la commande de collage BSD doit spécifier un tiret pour lire le contenu à partir de l'entrée standard.
manuel de la commande coller
Donc, le dernier doit être changé comme ci-dessous
la source