příkaz uniq se zachováním pořadí / i s pravidlem navíc

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Da Gony 1. 3. 2022 17:59

Kód: Vybrat vše
cat  .bash_history | sed -E 's/[ \t;]+//g' | sort | uniq |  (wc)
# sice je to useless use of cat  ale je to přehlednější, když se přidávají pípy

Dejme tomu že mám textový soubor s řádky z nichž některé jsou duplicitami. Pokud bych je chtěl odstranit, stačilo by použít kombo sort|uniq

1. Milestone: Chci zachovat pořadí. sort|uniq sice najde duplicity, ale jako vedlejší efekt dojde (významově) "promíchání pořadí" (z pohledu sort ale ne naopak :) )
>> Jak provést elegantně smazání duplicit Bez nějakého bušení algoritmů. Ideálně s možnostní výběru jestli chci nechat první nebo poslední výskyt duplicity (což je relevantní požadavek - výsledný soubor bude vypadat jinak)

2. Milestone . Provést detekci duplicit s tím, že za duplicity se budou považovat i třeba řádky "ping -c1 host" - i ping -c 2 host" (Našlo by se toho víc). Tudíž proběhne nějaká normalizace řádků. (v úvodu realizovaná sedem) Ale samozřejmě ve vysledném souboru chci nenormalizovaný výskyt(první nebo poslední)
Da Gony
Junior
Uživatelský avatar

Odeslat příspěvekod JanFiala 2. 3. 2022 09:37

Jak velké jsou ty soubory (kolik řádků)?
Bušit algoritmy nemusíš, jsou to jen 2 vnořené cykly. v prvním procházíš soubor od začátku do zbývajícího počtu řádků, ve druhém pak od konce do řádku + 1 z prvního cyklu. Pokud narazíš na stejný řádek, smažeš jej. Tím budeš mít vyřešet milestone 1.

Co se týká podobných řádků, tam provedeš to samé, jen budeš porovnávat pomocí své "normalizace".
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod JirkaVejrazka 2. 3. 2022 16:06

Jednodussi (pro soubory typu .bash_history) bude projit to jednim cyklem a vyplivnout na vystup jen ty radky, ktere jsou "nove" (tj. v nejake datove strukture si pamatovat predchozi radky). Pro male soubory je to nejjednodussi zpusob.

Dva vnorene cykly by byly zbytecne pomale a vetsina radku by se prochazela mockrat, hlavne ty od konce souboru.
JirkaVejrazka
Mírně pokročilý

Odeslat příspěvekod Da Gony 3. 3. 2022 10:36

30000 řádků. Jen letmé sort | uniq to zkrátí na 16000, přidání toho sed kvůli mezerám na 14000
Da Gony
Junior
Uživatelský avatar

Odeslat příspěvekod JirkaVejrazka 3. 3. 2022 12:53

To je pro bezny pocitac nic. Tu prvni variantu bez "porovnavaci magie" zvladne petiradkovy skript. U te druhe zavisi na tom, jak moc logiky bude potreba na zjisteni "podobnych" radku.
JirkaVejrazka
Mírně pokročilý


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků