Próbuję napisać prosty skrypt, który wyświetli zawartość znalezioną na dwóch listach. Aby uprościć, użyjmy ls jako przykładu. Wyobraź sobie, że „jeden” i „dwa” to katalogi.
one = `ls one` two = `ls two` przecięcie $ jeden $ dwa
Nadal jestem dość zielony w bashu, więc nie krępuj się poprawić, jak to robię. Potrzebuję tylko jakiegoś polecenia, które wypisze wszystkie pliki w „jednym” i „dwóch”. Muszą istnieć w obu. Można to nazwać „przecięciem” między „jeden” i „dwa”.
Odpowiedzi:
źródło
comm
do dzisiaj nic nie wiedziałem . To właśnie zrobiło mój cały tydzień :)comm
wymaga sortowania danych wejściowych. W tym przypadkuls
automatycznie sortuje dane wyjściowe, ale inne zastosowania mogą wymagać tego:comm -12 <(some-command | sort) <(some-other-command | sort)
public
metodyerror()
dostarczanej przez cechę w połączeniu zgit grep
, i to było niesamowite! Pobiegłem$ comm -12 <(git grep -il "\$this->error(" -- "*.php") <(git grep -il "Dash_Api_Json_Response" -- "*.php")
i na szczęście skończyłem z nazwą pliku zawierającego tylko cechę.Rozwiązanie z
comm
comm
jest świetny, ale rzeczywiście trzeba pracować z posortowaną listą. I na szczęście tutaj używamyls
tego ze stronyls
podręcznika BashAlternatywa z
sort
Przecięcie dwóch list:
symetryczna różnica dwóch list:
Premia
Baw się tym ;)
źródło
Użyj
comm
polecenia:„sort” nie jest tak naprawdę potrzebne, ale zawsze dołączam go przed użyciem „comm” na wszelki wypadek.
źródło
Mniej wydajna (niż komunikacja) alternatywa:
źródło
(ls 1; ls 2) | sort -u | uniq -d
.sort -u | uniq -d
nic nie daje, ponieważ sortowanie usuwa duplikaty, zanim uniq zacznie ich szukać. Myślę, że nie zrozumiałeś, co robi moje polecenie.cat <(ls 1 | sort -u) <(ls 2 | sort -u) | uniq -d
aby cokolwiek wyprowadzić. Moje polecenie powinno czytać(ls 1; ls 2) | sort | uniq -d
, bez-u
, aby pokazać przecięcie listy. @ MikaëlMayer miał rację, że moje pierwotne polecenie zostało złamane.ls
coś innym, npfind
. Twoje rozwiązanie na to nie pozwala, ponieważ jeśli jedno z poleceń zwraca dwie takie same linie, pobiera je jako duplikat. Mój działa, nawet jeśli użytkownik chce zrobićls 1/*
i porównać wszystkie pliki w podkatalogach. W przeciwnym razie tak, to też działa. Możliwe, że mój jest specyficzny dla basha.Dołącz to kolejna dobra opcja w zależności od wejścia i pożądanego wyjścia
źródło
Jest jeszcze jedno pytanie Stackoverflow „Przecięcie tablicy w bash”, które jest oznaczone jako duplikat tego. Moim zdaniem to nie to samo, ponieważ to pytanie dotyczy porównania dwóch tablic bash, podczas gdy to pytanie koncentruje się na plikach bash. Jednowierszowa odpowiedź na drugie pytanie, które jest teraz zamknięte, jest następująca:
Narzędzie comm wykonuje sortowanie alfanumeryczne, podczas gdy odpowiedzi „Przecięcie tablicy w bash” używają liczb; stąd użycie "sort" i "sort -g".
źródło