Plik 1:
123
234
345
456
Plik2:
123
234
343
758
Oczekiwany wynik: Plik 3:
TRUE
TRUE
FALSE
FALSE
więc kod powinien porównać dwa pliki i wydrukować „PRAWDA”, jeśli pasuje, w przeciwnym razie powinien wypisać „FAŁSZ” w nowym pliku. Czy ktoś mógłby podać rozwiązanie tego problemu?
text-processing
awk
diff
Velu
źródło
źródło
diff
.comm
. Ułatwia to wylistowanie linii, które oba pliki mają wspólne lub są unikatowe dla jednego lub drugiego.comm
to, że wymaga posortowanego wejścia. Pomijając fakt, że przykład w pytaniu nie mieć wkład sortowane, nigdy kwestia twierdzi, że jest to rzeczywiste dane, który jest używany i nigdy nie mówi nic na temat porządkowania danych.nl
jest przydatna przycomm
narzucaniu sortowania plików.Odpowiedzi:
Użyj
diff
polecenia w następujący sposób, wbash
dowolnej powłoce obsługującej<(...)
zastępowanie procesów lub możesz ją emulować, jak pokazano tutaj :Dane wyjściowe byłyby:
--new-line-format='FALSE'$'\n
, drukuj,FALSE
jeśli linie są różne, a przy--old-line-format=''
wyłączonym wyjściu, jeśli linia jest inna dla pliku 1, który jest znany jako stary plik do polecenia diff (możemy je również zamienić, co oznacza, że jeden z nich powinien wypisaćFALSE
inny, należy wyłączyć).--unchanged-line-format='TRUE'$'\n'
, drukuj,TRUE
jeśli linie były takie same.$'\n'
składni ucieczki C-styl jest używany do drukowania nowej linii po każdym wyjściu liniowym.źródło
Zakładając, że pliki nie zawierają znaków tabulacji:
Służy to
paste
do utworzenia dwóch rozdzielanych tabulatorami kolumn z zawartością dwóch plików w obu kolumnach.awk
Polecenie porównuje dwie kolumny na każdej linii i drukujeTRUE
jeśli kolumny są takie same, a inaczej drukujeFALSE
.źródło
Zakładając, że oba pliki mają tę samą liczbę linii:
Robi to porównanie numeryczne, jeśli ciągi do porównania są liczbami, a w przeciwnym razie leksykalne. Na przykład
100
i1.0e2
byłoby uważane za identyczne. Zmień, abyf2"" == $0
w każdym przypadku wymusić porównanie leksykalne.W zależności od
awk
implementacji porównanie leksykalne zostanie wykonane tak, jakby przy użyciumemcmp()
(porównanie bajtów do bajtów) lub tak, jakby przy użyciustrcoll()
(czy oba łańcuchy sortują to samo w porządku sortowania ustawień narodowych). Może to mieć znaczenie w niektórych lokalizacjach, w których kolejność nie jest poprawnie zdefiniowana dla niektórych znaków, a nie na wszystkich cyfrach dziesiętnych, jak w twojej próbce.źródło
Python 3
Wynik:
Jeśli potrzebujesz
TRUE
iFALSE
wielkimi literami, zamień wiersz wydruku na jeden z następujących:źródło
import itertools
najpierw, a następnie użyjitertools.izip
zamiastzip
. W przeciwnym razie odczyta oba pliki do pamięci, prawdopodobnie wykorzystując zbyt dużo pamięci.W
bash
, czytanie z każdego pliku wwhile
pętli, porównywanie odczytanych linii i drukowanieTRUE
lubFALSE
odpowiednio:Dwa wezwania do
read
odczytu odpowiednio z deskryptora pliku 3 i 4. Pliki są przekierowywane na te dwa przekierowania wejściowe w pętli.źródło
wynik
źródło