/ / Jak uzyskać łańcuchy uniq o innym zestawie znaków - linux, bash, awk, kodowanie znaków

Jak uzyskać ciągi uniq z innym zestawem znaków - linux, bash, awk, kodowanie znaków

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:

wprowadź opis obrazu tutaj

Odpowiedzi:

1 dla odpowiedzi № 1

Pobież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.