Plik file1.txt zawiera linie takie jak:
/api/purchase/<hash>/index.html
Na przykład:
/api/purchase/12ab09f46/index.html
Plik file2.csv zawiera linie takie jak:
<hash>,timestamp,ip_address
Na przykład:
12ab09f46,20150812235200,22.231.113.64
a77b3ff22,20150812235959,194.66.82.11
Chcę filtrować plik2.csv usuwając wszystkie wiersze, w których wartość skrótu jest obecna, również w pliku1.txt. To znaczy:
cat file1.txt | extract <hash> | sed '/<hash>/d' file2.csv
lub coś w tym stylu.
To powinno być proste, ale wydaje mi się, że nie jestem w stanie sprawić, by działało.
Czy ktoś może podać działający potok dla tego zadania?
źródło
cat
, tylkocut -d / -f 4 file1.txt
. Lub jeśli wolisz sekwencyjny wygląd,<file1.txt cut -d / -f 4
Możliwe
awk
rozwiązanie:Najpierw czytamy
file1.txt
za pomocąFS
(separator pól) „/” i tworzymy tablicę x z wartościami kluczy z pola,$4
które jest skrótem, który chcesz. Następnie drugi plik odczytaćfile2.txt
ustawienieFS
się,
i sprawdzić, czy wartość pola$1
nie istnieje jako klucza w tablicyx
, a jeśli to nie my go wydrukować.Taki sam bardziej idiomatyczny, jak zaproponowano w komentarzach, może być:
źródło
!($1 in x)
zamiast{ if (!($1 in x)) print $0; }
awk
rozwiązanie oparte ... na dłuższą metę nauczysz się dążyć do rozwiązań, które można osiągnąć za pomocą mniejszych rur dla uproszczenia ... :)Dla GNU sed
gdzie pierwszy sed tworzy listę skrótów w formacie sed-command
/12ab09f46\|a77b3ff22\|..../d
i przenosi ją do następnego skryptu sed, który odczytuje powyższe polecenie z wejścia, dlatego też-f -
opcja.To samo z grep
lub bez perl-wyrażeń:
lub jeszcze lepiej z cięciem :
źródło
Zauważ, że żądaniami wyszukiwania są
/$key/
i,^$key,
aby zmniejszyć wyniki między dwoma ukośnikami (plik 1) lub być pierwszym wpisem linii, a po nim przecinek (plik 2). To powinno zapewnić bezpieczeństwo, jeśli wyglądają kluczew pliku 2 lub podobnym
w pliku 1
źródło
Właśnie wypróbowałem jedną linijkę i wydaje się, że wykonuje to zadanie:
Proszę wymienić pierwszy ri z -R , aby go przetestować. -re wykonuje próbę na sucho, a jeśli wszystko jest w porządku, możesz uruchomić ją za pomocą -ri
źródło
Oprócz odpowiedzi Gabriele Lany należy pamiętać, że polecenie wklejania BSD wymaga określenia myślnika, aby odczytać zawartość ze standardowego wejścia.
instrukcja polecenia wklej
Tak więc ostateczna potrzeba zmiany, jak poniżej
źródło