Mam dwa pliki: plik 1 z około 10 000 linii i plik 2 z kilkuset liniami. Chcę sprawdzić, czy wszystkie linie pliku2 występują w pliku1. To znaczy: ∀ linia ℓ ∈ plik2: ℓ ∈ plik1
Jeżeli ktokolwiek nie wie, co oznaczają te symbole lub co „sprawdź, czy wszystkie linie pliku 2 występują w pliku 1”: Kilka równoważnych linii w obu plikach nie wpływa na to, czy kontrola zwraca, czy pliki spełniają wymagania, czy nie.
Jak mam to zrobic?
text-processing
UTF-8
źródło
źródło
file2
zawiera 2 linieA
, czy musiszfile1
zawierać co najmniej 2 linieA
?Odpowiedzi:
To polecenie wyświetli wiersze unikatowe dla
file_2
. Tak więc, jeśli dane wyjściowe są puste, wówczas wszystkiefile_2
wiersze są zawarte wfile_1
.Od komunikatora:
źródło
-u
opcja dodana dosort
polecenia. Teraz w obu posortowanych plikach pozostały tylko unikalne linie.<
skończymy na standardowe wyjście. Czy termin w nawiasach to zmienia?file_1
w zalecanej formie. Oszczędza zarówno pisanie, jak i czas.Jeśli liczba dopasowań z pliku2 w (unikatowych wierszach) pliku1 jest taka sama jak liczba unikalnych wierszy w pliku2, wówczas wszystkie są dostępne; w przeciwnym razie nie są.
źródło
Używanie GNU
awk
tam, gdzie obsługuje określonelength(array)
funkcje (i niektóre inneawk
implementacje, które mogą obsługiwać) i nie jest wymagane, jeśli pliki są sortowane.Odczytuje plik2 do tablicy wywoływanej
seen
z kluczem jako całą linią pliku2 .Następnie przeczytaj plik 1 i dla każdej linii, jeśli pasują do linii w tablicy, a następnie usuń ten klucz.
Na koniec, jeśli tablica była pusta, oznacza to, że wszystkie wiersze w pliku 2 istnieją w pliku 1 i zostaną wydrukowane
Matched
, w przeciwnym razie zostaną wyświetloneNot Matched
.Dla kompatybilności we wszystkich
awk
implementacjach.Aby zignorować puste linie / linie z białymi spacjami tylko w pliku 2 , należy dodać
NF
warunek w,NR==FNR && NF {...
aby pominąć czytanie ich w tablicy.źródło
length(array)
jest AFAIK tylko dla gawk; to zdecydowanie nie jest POSIX.Za pomocą
comm
możesz znaleźć linie, które są wspólne w obu plikach.Zobacz
man comm
więcej szczegółówźródło
comm
- porównaj dwa posortowane pliki linia po linii”.comm
zawiera rozwiązanie, które nie jest oczywiście niepoprawne. Po uruchomieniu polecenia pojawia się ostrzeżenie, że pliki nie są posortowane i wiele wierszy, które zdecydowanie znajdują się w obu plikach.będzie produkować nie ma wyjścia, jeśli
file1
zawiera wszystkie linie wfile2
i wyjść ze stanu0
, w przeciwnym razie będzie drukować coś takiegoi wyjdź ze statusem
1
źródło
Użyj programu Python:
Stosowanie:
Status wyjścia z programu wskazuje, czy wszystkie wzorce pliku 2 były dopasowane:
Aby zapytać o status wyjścia w powłoce (skrypt) można albo użyć
$?
specjalnej zmiennej lub innych wyrażeń, które oceniają stan wyjścia polecenia, np operatorów krótkich obwodów&&
i||
i wyrażeń warunkowych typuif
lubwhile
. Przykład:źródło
combine
z moreutils pokaże wszystkie liniefile2
, których nie ma wfile1
:Następnie możesz policzyć liczbę linii, przesyłając je do pipety
wc -l
, na przykład:źródło