awk kérdés

Helló. A következő a probléma:

vannak (vízállás) adataim. 1 sor 1 adat. egész szám.ezzel kéne a következőt csinálni: fogni őket, és 10 egyenlő részre osztani az adatsor (max-min)/10 nagyságú részekre. ezekbe berakni a megfelelő adatokat. majd megmondani melyik intervallumban hány adat van, mennyi az alsó és felső határ.

A következő awk scripttel akartam megoldani:


#!/bin/awk -f
BEGIN {
reszek=10
}

{
if ( NR == 1 )
	min=max=$1
if ( $1 > max )
	max=$1
if ( $1 < min )
	min=$1
viz[NR]=$1
}

END {
diff=max-min
printf "Delta H=%d\n",diff
for(i=0;i<reszek;i++){
	also_hatar[i]=min+i*diff/reszek
	vizallas[i, num]=0
}
for (i=0;i<NR;i++){
	for (j=0;j<reszek; j++){
		if ( also_hatar[j] < viz[i] && viz[i] < also_hatar[j+1] ){
			index=vizallas[j, num]
			vizallas[j, index]=viz[i]
			vizallas[j, num]=index+1
			break
		}	
	}

}

for(i=0;i<reszek;i++){
	for (j=0;j<vizallas[i, num];j++){
	printf "%d: %d",i,vizallas[i, j]
	}
}
}

de hibát ad:

awk -f vizikaka.awk vizikaka.txt
awk: vizikaka.awk:26: index=vizallas[j, num]
awk: vizikaka.awk:26: ^ syntax error
awk: vizikaka.awk:27: vizallas[j, index]=viz[i]
awk: vizikaka.awk:27: ^ syntax error
awk: vizikaka.awk:27: fatal: invalid subscript expression

pedig azt hittem lehet kétindexes tömböket csinálni. hogyan kéne? (ha estig nem mondja meg senki, megoldom c-ben. csak gondoltam kipróbálom az awk-t is...)

Köszi!

Hozzászólások

NR a végén úgy marad. tehást a sorok száma. amúgy meg midig az aktuális sorszám. a vizállás[i, num]=0 pedig az i-edik vizállás tömb num elemét 0-ba állítja. így a tömb az elemei mellet azok számát is tartalmazza. (hurrá. azért valami értelme csak van asszociatív tömböknek). De úgy látom nem te vagy az emberem.

Ha valaki felvilgosítana, továbbra is örülnék, hisz szomjúhozom a tudást, de már c-ben megírtam, úgyhogy többé-kevésbé tárgytalan)

köszi! ez volt a hiba (meg más is) Az utókor okulására itt a helyes megoldás: (és nemmondja senki, hogy hú de nagyonnangy, meg nemkéne, addig, amíg vannak akik egész xorg.conf -okat meg dmesgeket másolnak be, és nekik senki sem szól...)


#!/bin/awk -f
BEGIN {
reszek=10
}

{
if ( NR == 1 )
        min=max=$1
if ( $1 > max )
        max=$1
if ( $1 < min )
        min=$1
viz[NR-1]=$1
}

END {
diff=max-min
#printf "Delta H=%d\n",diff
for(i=0;i<reszek;i++){
        also_hatar[i]=min+i*diff/reszek
        vizallas[i,num]=0
}

for (i=0;i<NR;i++){
        for (j=0;j<reszek; j++){
                if ( viz[i] < also_hatar[j+1] || j == (reszek-1) ){
                        idx=vizallas[j,num]
                        vizallas[j,idx]=viz[i]
                        vizallas[j,num]=idx+1
                        break
                }
        }

}

for(i=0;i<reszek;i++){
        print "rekesz: "i" alja: "also_hatar[i]" darabok:"vizallas[i,num]
}
}

ja, és rájöttem, ohgy szeretem az awk-t. ez az a scriptnyelv, ami elég c-szerű hogy szeressem, de ellégg nem c, hogy haszálható legyen scriptnyelvként is, szöveg/adatfeldolgozásra.