Mam plik tekstowy zawierający takie linie:
This is a thread 139737522087680
This is a thread 139737513694976
This is a thread 139737505302272
This is a thread 139737312270080
.
.
.
This is a thread 139737203164928
This is a thread 139737194772224
This is a thread 139737186379520
Jak mogę być pewien wyjątkowości każdej linii?
UWAGA: Celem jest przetestowanie pliku, a nie modyfikowanie go, jeśli występują zduplikowane linie.
Odpowiedzi:
źródło
uniq
zamiastsort -u
uniq
byłby to duży błąd; deduplikuje tylko sąsiednie linie!sort <file> | uniq -d
wydrukuje duplikaty.Rozwiązanie awk:
źródło
echo
INTOEND
?&& echo
lub|| echo
jest konwencją w odpowiedziach, wskazującą, że polecenie działa poprawnie z kodem statusu wyjścia. Ważną rzeczą jestexit(1)
. Idealnie byłoby użyć tego takif has_only_unique_lines file; then ...
, jakby nieif [[ $(has_only_unique_lines file) = "no dupes" ]]; then ...
, to byłoby głupie.sort
będzie również, niezależnie od tego, czy są duplikaty, czy nie, prawda? Jak to oszczędza pamięć?Używanie
sort
/uniq
:Aby sprawdzić tylko zduplikowane linie, użyj
-d
opcji uniq. Spowoduje to wyświetlenie tylko zduplikowanych wierszy, jeśli nie, nic nie pokaże:źródło
TLDR
Pierwotne pytanie było niejasne i czytano, że OP chciał po prostu unikalnej wersji zawartości pliku. To pokazano poniżej. W zaktualizowanej formie pytania OP twierdzi teraz, że po prostu chce wiedzieć, czy zawartość pliku jest unikalna, czy nie.
Sprawdź, czy zawartość pliku jest unikalna, czy nie
Możesz po prostu użyć
sort
do sprawdzenia, czy plik jest unikalny lub zawiera takie duplikaty:Przykład
Powiedz, że mam te dwa pliki:
zduplikowany plik przykładowy unikalny przykładowy plikTeraz, gdy analizujemy te pliki, możemy stwierdzić, czy są one unikalne, czy zawierają duplikaty:
test duplikatów pliku przetestuj unikalny plikOryginalne pytanie (unikalna zawartość pliku)
Można to zrobić za pomocą
sort
:źródło
Zwykle
sort
plik, następnie używamuniq
do zliczania liczby duplikatów, a następniesort
znów widzę duplikaty na dole listy.Dodałem jeden duplikat do podanych przykładów:
Ponieważ
uniq
od jakiegoś czasu nie czytałem strony podręcznika, szybko szukałem alternatyw. Poniższe eliminuje potrzebę drugiego sortowania, jeśli chcesz zobaczyć tylko duplikaty:źródło
Jeśli nie ma duplikatów, wszystkie wiersze są unikalne:
Opis: posortuj wiersze pliku, aby powtarzały się kolejne wiersze (sortuj)
Wyodrębnij wszystkie kolejne wiersze, które są równe (uniq -d).
Jeśli istnieje wynik wyjściowy polecenia powyżej (
[...]
), a następnie (&&
) wydrukuj komunikat.źródło
Nie byłoby to kompletne bez odpowiedzi Perla!
Spowoduje to wydrukowanie każdej nieunikalnej linii jeden raz: jeśli więc nic nie wydrukuje, to plik ma wszystkie unikalne linie.
źródło
Korzystanie
cmp
isort
wbash
:lub
Spowodowałoby to jednak sortowanie pliku dwa razy, podobnie jak zaakceptowana odpowiedź.
źródło