Mam plik 1.txt
$ cat 1.txt
page1
рage1
Ale:
$ head -n1 1.txt | file -i -
/dev/stdin: text/plain; charset=us-ascii
$ head -n2 1.txt | tail -n1 | file -i -
/dev/stdin: text/plain; charset=utf-8
Ciągi mają różne zestawy znaków. Z tego powodu nie mogę uzyskać unikalnego ciągu za pomocą metody, którą znam:
$ cat 1.txt | sort | uniq -c | sort -rn
1 рage1
1 page1
Czy możesz mi pomóc znaleźć sposóbtylko unikalny ciąg w mojej sytuacji? P.S. Preferuj rozwiązania tylko z linuxową linią poleceń / bash / awk. Ale jeśli masz rozwiązanie w innym języku programowania, też mi się podoba.
Aktualizacja. awk "!a[$0]++" Input_file
nie pracuj, pic:
Odpowiedzi:
1 dla odpowiedzi № 1Pobieżne zbadanie tego, co mamy tutaj:
$ cat 1.txt
page1
рage1
$ hd 1.txt
00000000 70 61 67 65 31 0a d1 80 61 67 65 31 0a |page1...age1.|
0000000d
Jak zauważono w komentarzach do pytania, drugi „рage1” jest rzeczywiście odmienny od poprzedniego „page1” z jakiegoś powodu: to nie jest łacina p
, to cyrylica р
, więc filtr unikalności powinien wywoływać je jako oddzielne, chyba że wcześniej znormalizujesz tekst.
iconv nie zrobiłby tego tutaj. uconv (na przykład. apt install icu-devtools
na Debianie / Ubuntu) zamknie Cię, ale jej mapowania transliteracji opierają się raczej na fonetyce niż na wyglądach, więc kiedy transliterujemy ten przykład, cyrylica р
staje się łaciną r
:
$ uconv -x Cyrillic-Latin 1.txt
page1
rage1
Zobacz też te bardziej złożone uconv
polecenia, które mają podobne wyniki.
The Strona man uconv ICU stany
uconv może również uruchomić określony transliteracja na transkodowanych danych, w którym to przypadku transliteracja nastąpi jako krok pośredni, po tym jak dane zostaną transkodowane do Unicode. The transliteracja może być listą nazw transliteratorów rozdzielonych średnikami lub dowolnie złożonym zbiorem reguł w formacie reguł transliteracji ICU.
Oznacza to, że ktoś może użyć „formatu reguł transliteracji ICU” do określenia odwzorowania znaków typu lookalike. Oczywiście w takim tempie możesz użyć dowolnego języka.
Próbowałem też perla Tekst :: Kod Unidecode, ale to ma swoje (podobne) problemy:
$ perl -Mutf8 -MText::Unidecode -pe "$_ = unidecode($_)" 1.txt
page1
NEURage1
To może działać lepiej w niektórych przypadkach, ale oczywiście nie jest to jedno z nich.