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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2009-03-01 02:22:01

  Carek - Użytkownik

Carek
Użytkownik
Zarejestrowany: 2009-03-01

AWK problem

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:

Kod:

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:

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

 

#2  2009-03-01 02:39:19

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: AWK problem

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()


"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

 

#3  2009-03-01 11:46:27

  Carek - Użytkownik

Carek
Użytkownik
Zarejestrowany: 2009-03-01

Re: AWK problem

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

 

#4  2009-03-01 14:48:12

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: AWK problem

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


"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

 

#5  2009-03-01 17:11:52

  Carek - Użytkownik

Carek
Użytkownik
Zarejestrowany: 2009-03-01

Re: AWK problem

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

Kod:

-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

 

#6  2009-03-01 17:46:25

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: AWK problem

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

 

#7  2009-03-01 17:53:29

  Carek - Użytkownik

Carek
Użytkownik
Zarejestrowany: 2009-03-01

Re: AWK problem

poradzilem juz sobie... Bardzo pomogles Kolego... dzieki wielkie :)

Ostatnio edytowany przez Carek (2009-03-01 18:08:31)

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)

[ Generated in 0.012 seconds, 12 queries executed ]

Informacje debugowania

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