Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Mam plik tekstowy zawierający słownik włosko-polski w którym potrzebuję usunąć powtarzanie włoskich homonimów w kolejnych liniach.
Jest tak:
abaco=abakus abaco=liczydło abate=opat abbacchiare=przygnębiać abbacchio=baranek abbacchio=jagnięcy
a chciałbym żeby było tak:
abaco=abakus / liczydło abate=opat abbacchiare=przygnębiać abbacchio=baranek / jagnięcy
Proszę o pomoc w postaci linii poleceń albo skryptu, który pozwoli wykonać tę operację automatycznie.
Offline
871
Ostatnio edytowany przez uzytkownikubunt (2016-12-01 00:54:25)
Offline
Kolego @uzytkownikubunt - gratuluję zajefajnej znajomości C++. Daj w ryj facetowi co Cię tego uczył - a jak spyta za co to daj jeszcze raz.
Kod w Pythonie (w C++ też można tak prosto, zakładamy że plik wejściowy jest posortowany):
#!/usr/bin/env python #coding: utf-8 import sys last_word="" ds=[] while True: a=sys.stdin.readline() if not a: break a=a.strip().split('=',1) if len(a) != 2: continue if last_word != a[0]: if last_word: print "%s=%s" % (last_word, " / ".join(ds)) ds=[] last_word=a[0] ds.append(a[1]) print "%s=%s" % (last_word, " / ".join(ds))
Działa jak filtr - czyli:
python program.py <plik_wejsciowy.txt > plik_wyjsciowy.txt
PS. jeśli nie jest posortowany - kod będzie tak samo krótki, ale będziesz mógł pójść na piwo zanim się wykona.
Ostatnio edytowany przez ethanak (2014-06-27 16:59:10)
Offline
872
Ostatnio edytowany przez uzytkownikubunt (2016-12-01 00:54:26)
Offline
a ja jestem ciekaw, na ile mój pyhonowy kod będzie wolniejszy od kodu kolegi.
bo że będzie wolniejszy to wiem...
Offline
Dziękuje! Oba programy działają znakomicie.
Oto wynik programu w C++ (komp z procesorem Athlon XP 2000+):
Obecna data i godzina: Sat Jun 28 18:24:16 2014 Odczytano 28774 linijek z pliku wejsciowego Zapisano 10674 linijek do pliku Zakonczono operacje na plikach Obecna data i godzina: Sat Jun 28 18:24:16 2014
Ostatnio edytowany przez rafi (2014-06-28 19:13:09)
Offline
OK ale zrobię ten pomiar jutro, gdyż muszę w tej chwili wyjść.
Offline
awk -F= '{a[$1]=a[$1] $2 " / " }END{for(b in a) print b "=" a[b]}' wejściowy > wyjściowy
Ostatnie pole "/" usuniesz tak:
awk '{FS=OFS=" "}NF--' wyjściowy > końcowy
Offline
no tak, ale to algorytm dla nieposortowanych danych - a kolega ma dane wejściowe posortowane.
Offline
awk -F= '{a[$1]=a[$1] $2 " / "}END{for(b in a) print b "=" a[b]}' wejściowy | sort -t'=' -k1 | awk '{FS=OFS=" "}NF--' > wyjściowy
Wynik
pic@pic:~/Desktop$ cat wejściowy abaco=abakus abaco=liczydło abate=opat abbacchiare=przygnębiać abbacchio=baranek pic@pic:~/Desktop$ awk -F= '{a[$1]=a[$1] $2 " / "}END{for(b in a) print b "=" a[b]}' wejściowy | sort -t'=' -k1 | awk '{FS=OFS=" "}NF--' abaco=abakus / liczydło abate=opat abbacchiare=przygnębiać abbacchio=baranek / jagnięcy pic@pic:~/Desktop$
Ostatnio edytowany przez prosze (2014-06-29 15:55:31)
Offline
ale zrozumiałeś o czym pisałem czy na chama chcesz udowodnić, że napisałeś super jednolinijkowca (pomijając fakt, że do działania wymaga drugiego jednolinijkowca, a przy paruset tysiącach rekordów klęknie) czy to, że opanowałeś podstawy awka?
napisz kod w awku, który pobiera dane posortowane i nie wymaga dodatkowego skryptu do usuwania błędnych linii. naprawdę się da!
Offline
[b]ethanak[/b], kolego celowo tak napisałem bo widzę, że zawsze lubisz postawić na swoim ;)
Offline
A oto rezultaty time
[b]uzytkownikubunt[/b], C++:
real 0m0.630s user 0m0.132s sys 0m0.136s
[b]ethanak[/b], Python:
real 0m0.390s user 0m0.224s sys 0m0.020s
[b]prosze[/b], awk:
real 0m0.939s user 0m0.360s sys 0m0.016s
Przy czym w tym ostatnim wystąpiły zmiany w porządku sortowania linii.
Orginalny plik słownika można pobrać [url=http://www.slowniki.org.pl/n4.html]stąd[/url], gdyby komuś chciało się jeszcze poeksperymentować. :)
Offline
@uzytkownikubunt na studiach to mogą co najwyżej pobieżnie przybliżyć daną dziedzinę. Generalnie dużo studentów ma nastawienie typu "byle zaliczyć" "byle działało" w przypadku tych rzeczy, które ich nie interesują i jest to naturalne. Gorzej tylko jak ludzie się zniechęcają, bo ten system po drugiej stronie działa mniej więcej analogicznie. Na samym początku uczą podstawowej składni, konstrukcji potem algorytmy, jakieś problematyczne nudne zadanka typu te na SPOJu, ale nikt na początku nie pokazuje jak ten kod prawidłowo dzielić na różne funkcje / struktury / moduły / abstrakcyjne byty, jak to powinno wyglądać, wzorce projektowe . , jak te problemy można przyjemnie łatwo rozwiązywać.. Potem taki początkujący zraża się zagubiony będąc w 10 zagnieżdżeniu IFa próbując napisać coś większego albo zbiera się pokłosie studentów trzech zet zakup, zalicz, zapij.
Jako taka ciekawostka w, C++ sam mechanizm takiego słownika można ująć w jednej klasie mniej więcej coś takiego;
class Dictionary { public: Dictionary() {} void add(std::string word, std::string definition) { words[word].push_back(definition); } ~Dictionary() {} private: typedef std::list<std::string> definitions; std::map<std::string,definitions> words; };
nie trzeba żadnych cudów, ifów. Gdy użyjemy slownik.add("slowko","kolejneznaczenie"); z automatu albo tworzy nowy klucz i dodaje wartość albo jeżeli słowo klucz istnieje dodaje po prostu kolejne znaczenie.do tego jakieś dwie klasy zajmujące się tworzeniem takiego slownika z pliku/zapisywaniem do pliku i tyle ;]
Offline
Muszę wtrącić tzw "przysłowiowe dwa słowa"
Wkurwia mnie typ ethank ze swoim podejsciem do ludzi na tym forum.
Osobiscie przyjebałbym mu w ryj.
jak ma kompleksy na forum programowania w c/c++ wsród profesionalnych programistów i przychodzi się powynaturzać na forum debiana to osobiście mówię: wypierdalaj z tego forum jak masz więcej w człowieku zabić niż mu pomóc.
Gnida parafialna.
Offline
[quote=hello_world]Muszę wtrącić tzw "przysłowiowe dwa słowa"
Wkurwia mnie typ ethank ze swoim podejsciem do ludzi na tym forum.
Osobiscie przyjebałbym mu w ryj.
jak ma kompleksy na forum programowania w c/c++ wsród profesionalnych programistów i przychodzi się powynaturzać na forum debiana to osobiście mówię: wypierdalaj z tego forum jak masz więcej w człowieku zabić niż mu pomóc.
Gnida parafialna.[/quote]
Akurat Twoje zachowanie w tym przypadku bardziej pasuje do tego opisu.
Proponuję (wszystkim) trochę zimnej wody na rozgorączkowane głowy.
Dziecinne pyskówki nie są nigdzie mile widziane.
Offline
880
Ostatnio edytowany przez uzytkownikubunt (2016-12-01 00:54:36)
Offline
[quote=uzytkownikubunt]Inna sprawa, że taka lista to nie wiem czy jest wydajna w wielu operacjach. Z tego co rozumiem to element tej listy ma dane + wskaźnik na następny. Jeśli to wszystko jest alokowane za każdym następnym razem, gdy coś jest dodawane i podczas każdego odczytywania musi przejść przez wszystkie elementy, to chyba jednak będzie powoli działał taki kod.[/quote]
Akurat tutaj przy takim zadanku taka lista wystarcza idealnie (w stosunku do vectora nawet pozbywamy sie resize/realloc'ów ,które mają miejsce przy przekroczeniu rozmiaru vectora). Odnośnie dodawania nowego elementu to zależy od implementacji takiej listy, ale tutaj i w 99% dobrych implementacji lista przechowuje wskaźnik na ostatni element i przy dodawaniu nie musi przelatywać po wszystkich elementach ;]
Offline
Time (s) | Query |
---|---|
0.00012 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00095 | SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.144.255.116' WHERE u.id=1 |
0.00186 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.144.255.116', 1732560031) |
0.00048 | SELECT * FROM punbb_online WHERE logged<1732559731 |
0.00089 | SELECT topic_id FROM punbb_posts WHERE id=270455 |
0.00005 | SELECT id FROM punbb_posts WHERE topic_id=26051 ORDER BY posted |
0.00495 | SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=26051 AND t.moved_to IS NULL |
0.00006 | SELECT search_for, replace_with FROM punbb_censoring |
0.00640 | SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=26051 ORDER BY p.id LIMIT 0,25 |
0.00244 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=26051 |
Total query time: 0.01824 s |