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: Poznań, Polska
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/

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