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/.
Czesc. Z gory wielkei dzieki chociazby za chec pomocy, czy przeczytanie mojego postu. Wiec sprawa ma sie tak... mam do napisania maly prosty program. Program juz jest, z tymze dziala u mnie a na kompie, na ktorym powinien (czyt. na uczelni) nie bardzo :(
polecenie jest proste:
Dane są następujące pliki postaci: 0_1.txt. 1_1.txt, 2_1.txt, 3_1.txt, 0_2.txt, 1_2.txt, ... 3_8.txt,.. . Każdy z tych plików ma następującą postać: 3 stałe etykiety (nazwy), 3 bloki danych, napis koniec i pod nim ewentualne dane informacyjne (nieistotne dla zadania). Przykładowy plik: Nazwa1 0.1 Dana1 Nazwa2 0.1 Dana n21 0.1 Dana n22 0.1 Dana n23 Nazwa3 0.1 Dana n31 0.1 Dana n32 0.1 Dana n33 Koniec Ewa Olejarz Więcej przykładowych plików znajduje się tutaj. Napisz skrypt, który łączy pliki o tym samym numerze za znakiem _ w jeden plik (czyli np. 0_1.txt. 1_1.txt, 2_1.txt, 3_1.txt w plik out_1.txt), w którym poszczególne bloki danych w obrębie każdej etykiety (nazwy)oraz pomija koniec i tekst, który się za nim znajduje. Czyli dla plików wspomnianych powyżej out_1.txt powinien mieć postać: Nazwa1 0.1 Dana1 1.1 Dana1 2.1 Dana1 3.1 Dana1 Nazwa2 0.1 Dana n21 0.1 Dana n22 0.1 Dana n23 1.1 Dana n21 1.1 Dana n22 1.1 Dana n23 2.1 Dana n21 2.1 Dana n22 3.1 Dana n21 3.1 Dana n22 Nazwa3 0.1 Dana n31 0.1 Dana n32 0.1 Dana n33 1.1 Dana n31 1.1 Dana n32 2.1 Dana n31 2.1 Dana n32 2.1 Dana n33 3.1 Dana n31 3.1 Dana n32
a oto kod:
BEGIN{ while (("/bin/ls | grep .txt | awk /^[0-9]+_[0-9]+.txt/" | getline linia)>0) tab[linia]=1 #wczytanie do tablicy wszystkich nazw plikow do rpzetworzenia for(i in tab){ out = "out" substr(i,index(i,"_")) #formowanie nazwy wyjsciowej if ((getline x < i) > 0) tab2[out] = x #ta tablica posluzy potem do sprawdzania czy stala etykieta byla juz wypisana do pliku wyjsciowego } while(length(tab)>0){ #dopoki wszystkie pliki nei zostaly przetworzone od poczatku do napisu koniec (w przypadku natrafienia na koniec beda usuwane z tej tablicy) for(i in tab){ out = "out" substr(i,index(i,"_")) if(tab2[out] != 0){ print tab2[out] >> out #wypisanie Nazwa[indeks] w razie jesli nie bylo wypisane delete tab2[out] #usuniecie z tablicy zeby nie wpisywal znowu nazwa do pliku wyjsciowego } while((getline tmp < i) > 0){ #petla wypisywanie blokow danych if (tmp ~ /Koniec/){ #jelsi natrafimy na koniec czyscimy tablice znacyz ze skonczylismy obrabiac ten plik close(tab[i]) delete tab[i] break } if (tmp ~ /Nazwa/){ jelsi natrafimy na nazwe znasczy ze skonczylismy ta petle obrabiania pliku i zapisujemy ja do tablicy zeby woedziec nazwe z ajjkim numerem zapisac przy nastepnym obrocie petli tab3[out] = tmp break } print tmp >> out # w innym wypadku mamy dane wiec je wypisujemy } } for(i in tab3) tab2[i]=tab3[i] } }
bledy jakie wyskakuja:
awk: syntax error near line 2
awk: illegal statement near line 2
awk: syntax error near line 6
awk: illegal statement near line 6
awk: syntax error near line 15
awk: illegal statement near line 15
awk: syntax error near line 30
awk: bailing out near line 30
kombinowalem ze to mzoe przez roznice wersji awk u mnie i na serwerze, jednak nie wiem dlaczego ale te bledy dotycza wszystkich wierszy gdize jest getline a to raczej standardowe polecenie... pls help! :(
Ostatnio edytowany przez Carek (2009-03-01 17:26:13)
Offline
1. zobacz co to za odmiana awk na uczelni i czy nie ma tam do dyspozycji (niekoniecznie pod nazwa awk) np. [tt]gawk[/tt]
2. prosba abys uzywal znacznikow code i robil wciecia - taki zlepek ciezko sie czyta
3. byc moze chodzi o to ze nie robisz close()
Offline
oprawilem w code tresc zadania i kod... dodalem do kodu zamykanie plikow (bez zmian bledy te same)
u siebie na kompie mam gnu awk 3.1.6 a na uczelni nie wiem jak sprawdzic ;p nie dziala awk --version.
Offline
napisz chociaz co to za system na uczelini (powinenes sie czegos dowiedziec z [tt]/etc/issue[/tt] lub [tt]uname -a[/tt]) ... popatrz tez w [tt]man awk[/tt] oraz [tt]awk -h[/tt], [tt]awk -W version[/tt] moze tam sie jakos przedstawia ...
mozesz sobie zainstalowac pod Debianem pakiet "original-awk" wtedy bedziesz mial dwa awki i zobacz czy pod tym original-awk skrypt dziala czy sie wysypuje ...
PS co do kodu to jeszcze wciecia - naprawde warto je robic ...
Offline
awk -h i awk -W version probwalem. wszystko interpretuje jako skrypt awk. w manie tez nic o wersji nie wspominaja ale w /usr/bin znalazlem taki wpis
-r-xr-xr-x 2 root bin 80184 cze 8 2006 awk -r-xr-xr-x 1 root bin 110100 cze 8 2006 nawk -r-xr-xr-x 2 root bin 80184 cze 8 2006 oawk
wiec roznice pewnie wynikaja z tego ze skrypt jest w gawk a tutaj jest prsote posixowe awk czy tez nawk
jednak w dalsyzm ciagu to co napisalem wg mnie jest zgodne ze standardem...
jesli chodiz o wciecia... wybacz byly w edytorze... nie zworcilem uwagi ze skopiowalo sie bez wciec... juz poprawiam.
no i wreszcie... jelsi chdoiz o instalowanie original-awk... nie widze sensu... mam to (przypuscmy) na studencie (serwer aghowy) i dalej nie wiem co moglbym z tym zrobic...
Offline
original-awk wydaje sie byc dobre do sprawdzania przenosnosci skryptu gdyz jest to w zasadzie "referencyjny" awk ...
na podstawie nazw tych binariow mozna ustalic ze mowimy o Solarisie/SunOS (btw jakbys zajrzal do uname -a i napisal ze to SunOS byloby latwiej) ... sa tam jak widac dwie wersje awk (old i new) ... samo awk jest twardym dowiazaniem do oawk (old awk) ... w sieci mozna znalezc cos takiego:
The awk on Solaris is an oawk (old awk as of 1978).
getline was introduced in 1985, but Sun chose to
ignore this for more than 20 years now.[/quote]
w Twoim przypadku nie do konca jest to prawda bo masz tez do dyspozycji nawk ktory ma getline ... zatem jedynym rozwiazaniem jest uzycie nawk lub rezygnacja z getline ...
"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)
Offline
poradzilem juz sobie... Bardzo pomogles Kolego... dzieki wielkie :)
Ostatnio edytowany przez Carek (2009-03-01 18:08:31)
Offline
Time (s) | Query |
---|---|
0.00010 | SET CHARSET latin2 |
0.00005 | SET NAMES latin2 |
0.00168 | 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='18.117.188.23' WHERE u.id=1 |
0.00127 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.117.188.23', 1734000204) |
0.00033 | SELECT * FROM punbb_online WHERE logged<1733999904 |
0.00119 | DELETE FROM punbb_online WHERE ident='3.22.217.61' |
0.00077 | SELECT topic_id FROM punbb_posts WHERE id=112518 |
0.00007 | SELECT id FROM punbb_posts WHERE topic_id=13581 ORDER BY posted |
0.00060 | 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=13581 AND t.moved_to IS NULL |
0.00064 | SELECT search_for, replace_with FROM punbb_censoring |
0.00238 | 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=13581 ORDER BY p.id LIMIT 0,25 |
0.00128 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=13581 |
Total query time: 0.01036 s |