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
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)

[ Generated in 0.007 seconds, 11 queries executed ]

Informacje debugowania

Time (s) Query
0.00011 SET CHARSET latin2
0.00004 SET NAMES latin2
0.00087 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.226.226.158' WHERE u.id=1
0.00094 UPDATE punbb_online SET logged=1732347223 WHERE ident='18.226.226.158'
0.00050 SELECT * FROM punbb_online WHERE logged<1732346923
0.00049 SELECT topic_id FROM punbb_posts WHERE id=147369
0.00006 SELECT id FROM punbb_posts WHERE topic_id=16785 ORDER BY posted
0.00055 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.00005 SELECT search_for, replace_with FROM punbb_censoring
0.00095 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.00078 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=16785
Total query time: 0.00534 s