Matrice a Spirale, varie soluzioni

« Older   Newer »
  Share  
view post Posted on 25/4/2018, 08:47
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Ciao a tutti, apro questo 3d, per divertirci un po'.
Vediamo le varie soluzioni che trovate in C, Python, quello che volete per stampare una matrice a spirale.
Si parte da un array bidimensionale, di dimensione che volete, quadrato o rettangolare, a voi. Es:
1,2,3
4,5,6
7,8,9

la stampa dovrà essere 1,2,3,6,9,8,7,4,5.
é un giochetto che ho affrontato in un altro forum.
Vietato sbirciare in rete :D
L'ideale, sarebbe non accumulare un montagna di if.
Ci sono svariate soluzioni, alcune avevo visto veramente eleganti.
A voi, poi posterò la mia, che potrebbe essere ottimizzata, ma alla fine non ci ho più messo mano.
Poi magari scopro che la mia fa cag....
Io avevo implementato anche il senso orario e antiorario, ma è a vostra discrezione.
Buon 25 Aprile a tutti :)
 
Top
view post Posted on 25/4/2018, 09:15
Avatar

GWFstory

Group:
Administrator
Posts:
359
Location:
da qui...., quo, qua. Siete curiosi di saperlo, vero? No? Beh, tanto non ve l'avrei detto.

Status:


Visto che i valori da "spiralizzare" sono pochi creerei la cosiddetta look-up table ,che non è altro che un array di costanti, contenente i 9 valori nell'ordine in cui devono apparire.
In informatica è molto usata perchè velocizza l'esecuzione del programma quando si ha a che fare con delle costanti che sarebbero complicate da calcolare "al volo".

Userei poi un ciclo for per stamparli.

L'ho fatto al volo in Visual Basic (che avevo già aperto e mi era comodo). Chiedo scusa ai puristi della programmazione (per molti Visual Basic è un linguaggio per quelli che non sanno programmare).
Ecco il listato:

CITAZIONE
Public Sub SpiralizzatoreDiTabelle()
Dim a As Integer 'Puntatore per ciclo for
Dim NumberList 'Array contenente i 9 valori
NumberList = Array(1, 2, 3, 6, 9, 8, 7, 4, 5) 'Assegno all'array i valori nella sequenza desiderata
For a = 0 To 8 'Scansiono l'array
Print NumberList(a); ","; 'Stampo il valore puntato e inserisco una , per separarlo dal successivo
Next
End Sub

Questo funziona, ma non è certamente il solo metodo usabile.

Che voto mi dai? :D
 
Top
view post Posted on 25/4/2018, 09:19
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Voto io, a te ??
Non mi sogno nemmeno.
Ma cosi te li calcoli tu, se non erro. A priori.
Se fosse pero' 200x200 ?

Posto la mia, visto che oggi non ci sono e vedo sta sera:
CODICE
#include <stdio.h>
#define R 4
#define C 3
#define S_ORARIO 1


int array[R][C]; // gloabale per array grossi
                                // senza scomodare (nei limiti) malloc

void n_cicli(short int passi[]);
void crea_array(int array[][C]);
void stampa(int array[][C],short int passi[],int n);
int test(void);
//***************************************************
// numero die  giri che deve fare in base alla forma:
// quadra è sempre n*2-1
// rettangolare varia a seconda che sia in piedi o sdraiata
// il numero varia anche se a parità di forma facciamo
// un giro antiorario. Di fatto è come se la sdraiassimo.
int test(void)
{
       if (R<C && S_ORARIO==1        )
               return R*2-1;
       if (R>C && S_ORARIO==1        )
               return C*2;
       if (R<C && S_ORARIO==0        )
               return R*2;
       if (R>C && S_ORARIO==0        )
               return C*2-1;
       return R*2-1;
       
       
}
//***************************************************
void stampa(int array[][C],short int passi[],int n)
{
       int dir[4]={1,1,-1,-1};
       int d=0;
       int vero=1;
       int j,k,x,y;
       int start_x=-1;
       int start_y=0;
       
       printf("\nSTAMPA A SPIRALE ");
       #if (S_ORARIO==1)
               printf ("ORARIA\n");
       #else
               printf ("ANTIORARIA\n");
       #endif
       for (j=0; j<n; j++)
       {
               for (k=0; k<passi[j]; k++)
               {
                       x=start_x+(dir[d]+dir[d]*k)*vero;
                       y=start_y+(dir[d]+dir[d]*k)*(vero^1);
                       #if (S_ORARIO==1)
                               printf("%d " ,array[y][x]);
                       #else
                               printf("%d " ,array[x][y]);
                               
                       #endif
               }
               d++;
               start_x=x;start_y=y;d=d&3;vero=vero^1;
       }
}
//***************************************************
void crea_array(int array[][C])
{
       int r,c;
       int a=1;
       printf ("STAMPA ORIGINALE:\n");
       for (r=0; r<R; r++)
       {
               for (c=0; c<C; c++)
               {
                       array[r][c]=a;
                       a++;
                       printf ("%d ",array[r][c]);
               }
       puts("");
       }
}
//***************************************************
// costruisce l'array di passi da seguire
void n_cicli(short int passi[])
{
       int r=R;
       int c=C;
       #if (S_ORARIO==1)
               int dir[2]={r,c};
       #else
               int dir[2]={c,r};
       #endif
       int tot=R*C;
       int x=0;
       int i=1;
       int cont=0;
       #if (S_ORARIO==1)
               passi[0]=c;
               cont=cont+c;
       #else
               passi[0]=r;
               cont=cont+r;
       #endif
       while (cont<tot)
       {
               passi[i]=dir[x]-1;
               cont=cont+passi[i];
               dir[x]--;i++;
               x=x^1;
       }
       //for (r=0; r<i; r++)
               //printf ("_%d ",passi[r]);
       
}

//***************************************************

int main(void)
{
       
       int n;
       crea_array(array);
       n=test();
       short int passi[n];
       n_cicli(passi);
       stampa(array,passi,n);
       printf ("\ntotale numero giri: %d\n",n);
       return 0;
}

output:
CODICE
gila@gila-pc:~/Scrivania$ ./xx
STAMPA ORIGINALE:
1 2 3
4 5 6
7 8 9
10 11 12

STAMPA A SPIRALE ORARIA
1 2 3 6 9 12 11 10 7 4 5 8
totale numero giri: 6


Antiorario:
CODICE
STAMPA ORIGINALE:
1 2 3
4 5 6
7 8 9
10 11 12

STAMPA A SPIRALE ANTIORARIA
1 4 7 10 11 12 9 6 3 2 5 8
totale numero giri: 5
gila@gila-pc:~/Scrivania$


Edited by GILA75 - 25/4/2018, 10:37
 
Top
Elemento 38
view post Posted on 25/4/2018, 10:35




Script veloce e non molto ottimizzato :D
CODE
def getColumn(n):
   return [riga[n] for riga in matrix]

def setColumn(n):
   for d in range(dimension):
       matrix[d][n] = -1

def printMatrix():
   for r in matrix:
       print r

matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
dimension = 4
step = 0
colonna = dimension-1
riga = 0

printMatrix()

while any([True if len(set(x))!=1 else False for x in matrix]):
   if step == 0:
       # -->
       temp = matrix[riga]
   if step == 1:
       # v
       temp = getColumn(colonna)
   if step == 2:
       # <---
       temp = [x for x in matrix[dimension-1-riga]]
       temp.reverse()
   if step == 3:
       # ^
       temp = getColumn(dimension-1-colonna)
       temp.reverse()

   # stampa elementi
   for x in temp:
           if x != -1:
               print  x

   # -1 agli elementi gia' stampati
   if step == 0:
       matrix[riga] = [-1]*dimension
   if step == 1:
       setColumn(colonna)
   if step == 2:
       matrix[dimension-1-riga] = [-1]*dimension
   if step == 3:
       setColumn(dimension-1-colonna)

   # aggiorna step
   step += 1
   if step == 4:
       step = 0
       colonna -= 1
       riga += 1

Output:
QUOTE
[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 10, 11, 12]
[13, 14, 15, 16]
1
2
3
4
8
12
16
15
14
13
9
5
6
7
11
10

Per supportare matrici rettangolari, invece che avere solo una costante (dimension) per la dimensione, ne servono due. Anche per l'antiorario, dovrebbe essere una piccola modifica nei valori iniziali di step/riga/colonna credo...
 
Top
view post Posted on 25/4/2018, 10:50
Avatar

GWFstory

Group:
Administrator
Posts:
359
Location:
da qui...., quo, qua. Siete curiosi di saperlo, vero? No? Beh, tanto non ve l'avrei detto.

Status:


CITAZIONE
Voto io, a te ??
Non mi sogno nemmeno.

E perchè? Mica sono una divinità o l'imperatore!! :shifty:

CITAZIONE
Ma cosi te li calcoli tu, se non erro. A priori.
Se fosse pero' 200x200 ?

La look-up table funziona proprio così, calcolandosi il tutto in precedenza. Viene usata, ad esempio, per ricavare i dati necessari a generare un segnale sinusoidale con un microcontrollore.
Praticamente si inizia collegando un DAC ad un microcontroller (si potrebbe usare anche il PWM del microcontroller stesso, ma con maggiori limitazioni di frequenza massima generabile).
Per generare il segnale sinusoidale il microcontroller deve ora inviare al DAC i valori tali da ricreare, punto per punto, la tensione necessaria a rispettare l'andamento richiesto.

I valori numerici possono essere creati facendo calcolare al microcontrollore l'equazione y=sin(x), dopo y è il valore da inviare al DAC e x la variabile che indica l'angolo di fase della sinusoide. Questa soluzione è quella più precisa e meno "pesante" a livello software (occupa poco spazio in memoria), ma per il microcontrollore è molto pesante, perchè si tratta di effettuare calcoli abbastanza complessi con numeri a virgola mobile, che impegnano molto in termini di elaborazione.
Con questo sistema il tempo impiegato per l'elaborazione limita la velocità di esecuzione del programma e quindi anche la frequenza massima generabile.

Un sistema alternativo è appunto quella della look-up table. Ci si calcola a priori i valori di y per i corrispondenti x e li si fa leggere al microcontrollore in sequenza durante la generazione del segnale sinusoidale. Il vantaggio è la velocità di esecuzione (leggi il dato dalla memoria e invialo al DAC, quindi poche istruzioni prive di elaborazione), mentre lo svantaggio è l'occupazione di molta memoria (considerando di dovere generare una sinusoide con la risoluzione in orizzontale di 1° si avrebbero 360 punti da memorizzare).

I metodi sono entrambi validi. Si tratta di vedere di volta in volta quello più adatto all'applicazione.

E' chiaro che se ci si trovasse una matrice di 200x200 elementi, per lo più da gestire come stampa a video, quindi con bassa velocità di esecuzione, quello della look-up table sarebbe un sistema sconsigliato, perchè richiederebbe molta fatica in fase di scrittura del software (40000 elementi da inserire in un array sono parecchi) e ci sarebbero molte probabilità di errore.

Il tuo sistema non l'ho ancora guardato perchè devo avere tempo e voglia di concentrarmi (non sono bravo a cercare di capire come gli altri abbiano scritto un programma).
 
Top
view post Posted on 25/4/2018, 18:04
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Ele, ho visto solo di sfuggita il tuo metodo, e python...insomma sono alle prime armi, quindi traduco si e no.
Per caso hai usato la tecnica di marcare i punti gia' visitati ?

@GWF: certo capire i listati altrui non e' facile. Nel caso commento un po' meglio
 
Top
Elemento 38
view post Posted on 25/4/2018, 18:30




Praticamente gli step sono sempre gli stessi
-riga
-colonna
-Riga al contrario
-colonna al contrario

Ogni volta che stampo qualcosa, modifico la matrice originale con dei -1, e ogni volta che stampo, non considero i -1
 
Top
view post Posted on 25/4/2018, 18:45
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Si ok, la tecnica del "contorno" diciamo.
Avevo fatto anche quello, ma poi ho cercato di fare senza.
Appena posso guardo.
Io invece ho usato una "bussola" per le direzioni
 
Top
view post Posted on 26/4/2018, 08:40
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


CITAZIONE
E perchè? Mica sono una divinità o l'imperatore!! :shifty:

Certo, ma...insomma non ho competenze, Poi la programmazione micro e pc se pur con lo stesso linguaggio è diversa.
La tecnica che ho postato, è comoda perchè elimina gli if, si può ulteriormente migliorare, ma io avevo lasciato così.
In definitiva usa una bussola [1,1,-1-1] per le direzioni: si parte con le righe (+1), poi si scende con le colonne +1.
Poi si torna con le righe -1 e con le colonne -1.
Gli indici in quell'array li useremo per spostarci: index 1=1 (esempio)
Spiego a blocchi:
CODICE
//***************************************************
// numero die  giri che deve fare in base alla forma:
// quadra è sempre n*2-1
// rettangolare varia a seconda che sia in piedi o sdraiata
// il numero varia anche se a parità di forma facciamo
// un giro antiorario. Di fatto è come se la sdraiassimo.
int test(void)
{
       if (R<C && S_ORARIO==1        )
               return R*2-1;
       if (R>C && S_ORARIO==1        )
               return C*2;
       if (R<C && S_ORARIO==0        )
               return R*2;
       if (R>C && S_ORARIO==0        )
               return C*2-1;
       return R*2-1;
       
       
}


sopra stabilisco i calcoli da fare in base: matrice quadrata? Rettangolare? Rettangolare, ma senso orario o anti?
Una matrice rettangolare se la percorriamo in senso orario o antiorario, cambia.
I calcolettini me li ero fatti carta e penna.

CODICE
//***************************************************
// costruisce l'array di passi da seguire
void n_cicli(short int passi[])
{
       int r=R;
       int c=C;
       #if (S_ORARIO==1)
               int dir[2]={r,c};
       #else
               int dir[2]={c,r};
       #endif
       int tot=R*C;
       int x=0;
       int i=1;
       int cont=0;
       #if (S_ORARIO==1)
               passi[0]=c;
               cont=cont+c;
       #else
               passi[0]=r;
               cont=cont+r;
       #endif
       while (cont<tot)
       {
               passi[i]=dir[x]-1;
               cont=cont+passi[i];
               dir[x]--;i++;
               x=x^1;
       }
       //for (r=0; r<i; r++)
               //printf ("_%d ",passi[r]);
       
}

Qui, creo un array dei passi che deve fare.
Ogni riga e colonna (tranne la prima riga), diminuisce di uno a ogni giro.
Es:
1,2,3
4,5,6
7,8,9

sarebbe=3,2,2,1,1
Per sapere come fare, si sfrutta il risultato della routine iniziale.
Questo array, sarà il ciclo esterno di un'altra routine.
Come notate, qui per fare righe,colonne,righe ecc...non uso nessun if:
Ma faccio uso dello XOR:
int dir[2]={r,c};
dir[x]--;i++;
x=x^1;

detta in breve: la x (indice che fa riferimento a dir), cambia ogni volta il suo valore grazie allo XOR
x=0-->righe
x=1-->colonne
Quindi mi posso girare tranquillamente senza usare if.

Una volta preparato tutto ho la stampa:
CODICE
void stampa(int array[][C],short int passi[],int n)
{
       int dir[4]={1,1,-1,-1};
       int d=0;
       int vero=1;
       int j,k,x,y;
       int start_x=-1;
       int start_y=0;
       
       printf("\nSTAMPA A SPIRALE ");
       #if (S_ORARIO==1)
               printf ("ORARIA\n");
       #else
               printf ("ANTIORARIA\n");
       #endif
       for (j=0; j<n; j++)
       {
               for (k=0; k<passi[j]; k++)
               {
                       x=start_x+(dir[d]+dir[d]*k)*vero;
                       y=start_y+(dir[d]+dir[d]*k)*(vero^1);
                       #if (S_ORARIO==1)
                               printf("%d " ,array[y][x]);
                       #else
                               printf("%d " ,array[x][y]);
                               
                       #endif
               }
               d++;
               start_x=x;start_y=y;d=d&3;vero=vero^1;
       }
}


il for esterno segue i percorsi che ci eravamo preparati: righa 1 (es: 5 passi), colonna 1 (4 passi ecc)...
Questa invece è la bussola che dicevo:
CODICE
int dir[4]={1,1,-1,-1};


e qui avanzo sia per righe che per colonne:
CODICE
x=start_x+(dir[d]+dir[d]*k)*vero;
                       y=start_y+(dir[d]+dir[d]*k)*(vero^1);

Ci vorrebbe carta e penna per capire, comunque.
Sommo le direzioni in base agli indici di dir.
La variabile "vero" che se notate in y fa uno xor, serve a questo:
Quando mi muovo nelle righe, non mi devo muovere nelle colonne.
Vero, è soltanto un coefficente che va a 0 quando non mi devo muovere.
Quindi moltiplica per 0 e annulla l'operazione.
La volta dopo sarà il contrario e infatti:
(vero^1) xor ribalta tutto.

sotto:
CODICE
d=d&3;vero=vero^1;

d=d&3, è un contatore a saturazione.
Quando mi muovo nel vettore dir, devo fare in modo che arrivato in fondo ricomincio.
L'operatore AND mi fa questo:
0&3=0
1&3=1
2&3=2
ecc...
L'and non funziona con tutti i numeri per fare un contatore così.
Al massimo si può usare il modulo :100%3=1.... 5%3=2 (non si fora mai la dimensione dell'array)
CODICE
vero=vero^1;


e sopra ribalto la situazione iniziale.
Sembra difficile, ma carta e penna è una stupidata.
Poi, c'è anche il modo di non far calcolare i percorsi, ma io avevo lasciato perdere.
Spero di essere stato chiaro
 
Top
view post Posted on 28/4/2018, 07:40
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Nessun codice alternativo ?
 
Top
view post Posted on 29/4/2018, 09:28

Noioso

Group:
Appassionati
Posts:
442
Location:
Vercelli

Status:


Non saprei, rispetto a seguire intuitivamente il contorno non credo ci siano metodi molto più efficienti, o almeno non ci ho pensato abbastanza :lol:. Per ottimizzare quelli già scritti, ha senso al momento della stampa cacciare dentro al printf una stringa contenente tutti i numeri della riga/colonna interessata anzichè ripetere ogni volta la funzione per ogni numero? La cosa mi è venuta in mente pensando che magari il tempo che printf impiega ogni volta per "prepararsi" alla stampa è superiore alla creazione della stringa. Scusate il "magari" ma è da tempo che non guardo il C :)
 
Top
view post Posted on 29/4/2018, 11:55
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


CITAZIONE
La cosa mi è venuta in mente pensando che magari il tempo che printf impiega ogni volta per "prepararsi" alla stampa è superiore alla creazione della stringa. Scusate il "magari" ma è da tempo che non guardo il C :)

Non saprei quello. So che printf () è abbastanza pesante, dato che è anche molto flessibile. Se si può evitare spesso si usa puts().
Non so nel mio caso se è fattibile...
 
Top
view post Posted on 29/4/2018, 13:18
Avatar

GWFstory

Group:
Administrator
Posts:
359
Location:
da qui...., quo, qua. Siete curiosi di saperlo, vero? No? Beh, tanto non ve l'avrei detto.

Status:


Io una cosa del genere la gestirei mettendo la stringa di uscita in un array che stamperei solo al termine dell'elaborazione.
 
Top
view post Posted on 29/4/2018, 13:46
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


CITAZIONE
Io una cosa del genere la gestirei mettendo la stringa di uscita in un array che stamperei solo al termine dell'elaborazione

Bhè si, si potrebbe. Non so magari però quello che guadagni lo perdi con il for per stampare.
Comunque va bhè, è solo uno stupido esercizio fatto in un altro forum.
Più che altro l'autore voleva mettere in evidenza i modi per non fare troppe condizioni

Questa è una variante, col metodo del perimetro....fa un po' schifo eh..si potrebbe migliorare.
Ma ripeto è solo un piccolo esercizio:

CODICE
#include <stdlib.h>
#include <stdio.h>
#define R 3
#define C 3

void crea_array(int array[][C+2], int row, int col);
void stampa (int array[][C+2], int tot);

void stampa (int array[][C+2], int tot)
{
       int dir_y[4]={1,0,-1,0}; // bussola per y--->
       int dir_x[4]={0,1,0,-1}; // bussola per x v
       int x=1;
       int y=1;
       int d=0;
       int cont=0;
       
       while (1)
       {
               if ( (array[x][y])!=0)
               {
                       printf ("%d ", array[x][y]);
                       array[x][y]=0;
                       cont++;
                       y=y+dir_y[d];
                       x=x+dir_x[d];
                       if (cont==tot)
                               break;
               }
               else
               {        
                       y=y-dir_y[d];
                       x=x-dir_x[d];
                       d++;
                       d=d&3;
                       y=y+dir_y[d];
                       x=x+dir_x[d];
               }
       }
       
}


void crea_array(int array[][C+2], int row, int col)
{
       int x,y;
       int a=1;
       for (x=0; x<row; x++)
       {
               for (y=0; y<col; y++) //azzero tutta la matrice
                       array[x][y]=0;
       }

       for (x=0; x<R; x++)      // scavo nella matrice e metto i dati
       {                        // ladciando il "perimetro"
               for (y=0; y<C; y++)
               {
                       array[x+1][y+1]=a; //stampo
                       a++;
               }
       }

       puts("ARRAY ORIGINALE");
       for (x=0; x<row; x++)
       {
               for (y=0; y<col; y++)
                       printf ("%d ", array[x][y]);
               puts("");
       }
       
}

int main()
{
       int row=R+2;
       int col=C+2;
       int tot=R*C;
       
       int array[row][col];
       crea_array(array,row,col);
       puts("-------SPIRALE------");
       stampa (array,tot);
       
   
   
   return 0;
}


out:
CODICE
gila@gila-pc:~/Scrivania$ ./xx
ARRAY ORIGINALE
0 0 0 0 0
0 1 2 3 0
0 4 5 6 0
0 7 8 9 0
0 0 0 0 0
-------SPIRALE------
1 2 3 6 9 8 7 4 5 gila@gila-pc:~/Scrivania$



OT: a volte mi domando però cosa studio la programmazione a fare...ore, mesi, anni...per fare ???
Una stampa a spirale :wb:
Bhò, ormai ci sono talmente tante cose da sapere, che da hobbysta... si ok... magari ti arrangi, ma...
Se non ci lavori o non studi...a volte mi avvilisce.
Fine OT (di crisi mistica :D )
 
Top
Elemento 38
view post Posted on 29/4/2018, 18:55




Usare una stringa e stamparla alla fine permette di avere un programma piu' veloce, ma in realta' non si risparmia cosi' tanto tempo ...
QUOTE
harrym@harrym-mbp  ~/tgw  diff gila.c gila_modified.c
> int myindex = 0;
> char mystring[R*C + 1];
58,60c58,60
< printf("%d " ,array[y][x]);
< #else
< printf("%d " ,array[x][y]);
---
> mystring[myindex] = (char) array[y][x];
> #else
> mystring[myindex] = (char) array[x][y];
62c62,63
< #endif
---
> #endif
> myindex++;
66a68,69
> mystring[R*C] = '\0';
> puts(mystring);

Questi sono i risultati, ovviamente lo script python non puo' competere con la velocita' delle versioni C in questo caso, ma stiamo parlando di una lentezza 2x, non cosi' alta.
QUOTE
harrym@harrym-mbp  ~/tgw  ./run.sh
Binary files gila.o and gila_modified.o differ
GILA ORIGINAL
3.01696e-05
GILA MODIFIED
2.90868e-05
PYTHON
7.2084e-05

Per chi fosse interessato a run.sh, vedi spoiler piu' in basso
SPOILER (click to view)
#!/bin/sh
diff gila.o gila_modified.o
for i in {1..500} ; do ./gila_modified.o>>gila_modified_log ; done ;
for i in {1..500} ; do ./gila.o>>gila_log ; done
for i in {1..500} ; do python spirale.py >> mypython_log ; done
echo "GILA ORIGINAL"
grep TIME gila_log | awk '{ sum += $5 } END { if (NR > 0) print sum / NR }'
echo "GILA MODIFIED"
grep TIME gila_modified_log | awk '{ sum += $5 } END { if (NR > 0) print sum / NR }'
echo "PYTHON"
grep TIME mypython_log | awk '{ sum += $5 } END { if (NR > 0) print sum / NR }'
 
Top
15 replies since 25/4/2018, 08:47   1089 views
  Share