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  2010-05-07 18:29:41

  Khamell - Użytkownik

Khamell
Użytkownik
Zarejestrowany: 2008-04-24

[awk] Problem z sortowaniem

Witam! Program zagląda rekurencyjnie do podkatalogów podanego jako parametr katalogu i zwraca jako wielkość katalogu łączną sumę zajętości plików. Dla zwykłego pliku drukuje jego zajętość. Problem pojawia się przy sortowaniu, bo przestało działać. Jeżeli w funkcji podkat odkomentuję wywołanie funkcji sortuj, to nie wypisze się lista zajętościowa dla wszystkich podkatalogów. Jeżeli nigdzie nie wywołuję funkcji sortuj, to wszystko działa, tylko, że wypisuje nieposortowane. Ktoś pomoże?

Kod:

#!/bin/bash
if [ -d $1 ] 
then
awk -vARG1=$1 'BEGIN{
i = 0
while (("ls -o "ARG1"" | getline) > 0){
if (NF > 2){
i++
tab[i,2] = $3 
if(substr($1,1,1) == "-"){
tab[i,1] = $4
tab[i,3] = "-"
tab[i,4] = $NF
} else if(substr($1,1,1) == "d") {tab[i,3] ="d" ; tab[i,4] = $NF; tab[i,1] = zlicz(ARG1 "/" $NF)}
else if(substr($1,1,1) == "l"){
tab[i,1] = $4
tab[i,3] = "l"
tab[i,4] = $NF}
}}
close ("ls -o"); 
#sortuj(tab, i);
wypisz(i, ARG1, tab)
podkat(tab, ARG1, i)
} #zakonczenie begina
function wypisz(ile_l, nazwa, tab1){
print("\nLista zajetosciowa dla folderu: ", nazwa );
printf("%-15s", "zajetosc w B") ; 
printf("%-12s", "uzytkownik") ; 
printf("%-7s", "rodzaj") ; 
printf("%-20s\n", "nazwa pliku");
for(k = 1; k<=ile_l; k++){
    printf("%-15s", tab1[k,1]) ; 
    printf("%-12s", tab1[k,2]) ; 
    printf("%-7s", tab1[k,3]) ; 
    printf("%-20s\n", tab1[k,4])}}
function zlicz(kat, suma){
#close("ls -o")
while(("ls -o "kat"" | getline) > 0){
if (substr($1,1,1) == "d"){
suma+=zlicz(kat "/" $NF)
} else {suma+= $4}
}
close("ls -o");
return suma
}
function sortuj(tab, max, temp){
for(k=1; k<=max; k++){
for(i = 1; i<max; i++){
if(tab[i,1] < tab[j,1]){
    for(j=1; j<5 ;j++){
    temp = tab[i,j];
    tab[i,j]= tab[i+1,j];
    tab[i+1,j] = temp}#koniec fora najbardziej zagniezdzonego
}#koniec ifa
}}#koniec pierwszego i drugiego fora
}
function podkat(tab, nazwa, dlugosc, tab2){    
for(i = 1; i<=dlugosc; i++){
        if(tab[i,3] == "d"){
        j=0
            while (("ls -o "nazwa tab[i,4]"" | getline) > 0){
                if(NF > 3){
                    j++
                    tab2[j,2] = $3 
                    if(substr($1,1,1) == "-"){
                    tab2[j,1] = $4
                    tab2[j,3] = "-"
                    tab2[j,4] = $NF
                    }else if(substr($1,1,1) == "d") {tab2[j,3] ="d" ; tab2[j,4] = $NF; tab2[j,1] = zlicz(nazwa tab[i,4] "/" $NF)}
                    else if(substr($1,1,1) == "l"){
                    tab2[j,1] = $4
                    tab2[j,3] = "l"
                    tab2[j,4] = $NF}
                }#zamyka ifa
            }#zamyka whilea

            close ("ls -o");
            #sortuj(tab2, j);
            wypisz(j, nazwa tab[i,4], tab2)
        }#zamykajacy ifa
    }#zamykajacy fora
}#zamykajacy funkcje

' #zakonczenie awk
else 
echo "Podano ścieżke do katalogu, który nie istnieje"
fi

P.S. Sorry za styl, ale dzisiaj zacząłem pisać w tym języku i mam spore problemy ze składnią...

Ostatnio edytowany przez Khamell (2010-05-07 18:31:16)

Offline

 

#2  2010-05-08 11:15:53

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Brno, Česko
Zarejestrowany: 2007-12-22
Serwis

Re: [awk] Problem z sortowaniem

O ile to nie jest program na zaliczenie, który musi być napisany w awk:

Kod:

du --si -cs katalog/

Spinnen Essen: [url=http://fluxboxpl.org/portal/]FluxboxPL[/url] [url=http://przepis-na-lo.pl/]Przepis na LibreOffice[/url]

Offline

 

#3  2010-05-08 15:54:19

  Khamell - Użytkownik

Khamell
Użytkownik
Zarejestrowany: 2008-04-24

Re: [awk] Problem z sortowaniem

Niestety to jest program na zaliczenie. Znalazlem coś takiego;

Kod:

{for (wino in obrot) {print wino, obrot[wino] | "sort -nr +1" }}

tylko nie wiem jak teraz tego użyć do tablicy dwuwymiarowej, żeby mi sortował według pierwszego pola, czyli tab[k,1], gdzie znajduje sie liczba.

Edycja:
Udało mi się użyć funkcji sort, do sortowania tabeli dwuwymiarowej podczas wypisywania:

Kod:

for(k = 1; k<=ile_l; k++){printf "%-15s %-12s %-7s %-20s\n", tab1[k,1] , tab1[k,2] , tab1[k,3] , tab1[k,4] | "sort -nr -k 1,1"}
return}

Tylko, że skrypt wykrzacza się jak jest wywoływana funkcja podkat....czy ktoś powie mi, gdzie robię błąd? Błagam...

Edycja2: Temat do zamknięcia, skrypt napisany

Ostatnio edytowany przez Khamell (2010-05-09 11:53:35)

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Nas ludzie lubią po prostu, a nie klikając w przyciski ;-)

[ Generated in 0.009 seconds, 12 queries executed ]

Informacje debugowania

Time (s) Query
0.00009 SET CHARSET latin2
0.00004 SET NAMES latin2
0.00086 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='13.59.205.182' WHERE u.id=1
0.00084 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '13.59.205.182', 1732346531)
0.00046 SELECT * FROM punbb_online WHERE logged<1732346231
0.00065 DELETE FROM punbb_online WHERE ident='3.144.103.20'
0.00071 SELECT topic_id FROM punbb_posts WHERE id=147418
0.00125 SELECT id FROM punbb_posts WHERE topic_id=16785 ORDER BY posted
0.00058 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=16785 AND t.moved_to IS NULL
0.00006 SELECT search_for, replace_with FROM punbb_censoring
0.00073 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=16785 ORDER BY p.id LIMIT 0,25
0.00075 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=16785
Total query time: 0.00702 s