[AWK] Gestione e confronto input da più file

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
jxmmy000
Prode Principiante
Messaggi: 6
Iscrizione: giovedì 2 febbraio 2017, 10:41
Desktop: Unity
Distribuzione: Ubuntu 16.10 x86_64
Sesso: Maschile

[AWK] Gestione e confronto input da più file

Messaggio da jxmmy000 »

Ciao ragazzi,
devo realizzare uno script AWK in grado di gestire l'inventario di un piccolo magazzino secondo le seguenti specifiche, premetto che non ho mai scritto in AWK ma ho appena finito di farmi un'infarinatura sugli aspetti teorici e scritto uno script che, ovviamente, non funziona :muro: :muro:
La situazione è la seguente:
Un primo file, di tipo “prodotti”, indica i prodotti di cui il magazzino ha bisogno, indicando per ogni prodotto il nome e l’identificatore del prodotto.

Codice: Seleziona tutto

prodotti.txt:
coca-cola pr01
fanta pr02
sprite pr03
breezer pr04
gatorade pr05
orangina pr06
Un insieme di file, di tipo “fornitori”, specifica il costo dei vari prodotti presso diversi possibili fornitori, indicando per i prodotti forniti l’identificatore e il relativo prezzo.

Codice: Seleziona tutto

fornitore1.txt:
pr02 1.25
pr03 1.15
pr06 0.90
pr05 1.45
Devo visualizzare in output l’elenco dei prodotti (nome e identificatore), e per ciascuno di essi il fornitore più economico e il prezzo del prodotto. Nel caso un prodotto non sia fornito da nessun fornitore il nome del fornitore e il prezzo devono essere sostituiti dal carattere “-”. Il nome di tutti i file gestiti dall’applicazione sono passati sulla riga di comando allo script stesso: il primo parametro identifica il file ‘”prodotto”, l’ultimo il file di uscita, tutti i parametri intermedi (di numero ignoto) identificano i file “fornitori”.

Io ho provato con:

Codice: Seleziona tutto

#!/usr/bin/awk -f

BEGIN {cntforn=0}
{

if(FNR==NR)              
   prodotti[$2] = $1

else{     

if($1 in prodotti){
   if($1 in result){
      if($2<result[$1])
         result[$1]=$2
         forn[$1]=cntforn 
                   }
   else result[$1]=$2
                  }
     
}
cntforn++;
print prodotti[$2] result[$2] FS $2 FS "fornitore" forn[$1] 

}
Grazie mille in anticipo per l'aiuto! :ciao:
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: [AWK] Gestione e confronto input da più file

Messaggio da crap0101 »

awk non mi sembra lo strumento più adatto. Servirebbe un db "vero"
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
jxmmy000
Prode Principiante
Messaggi: 6
Iscrizione: giovedì 2 febbraio 2017, 10:41
Desktop: Unity
Distribuzione: Ubuntu 16.10 x86_64
Sesso: Maschile

Re: [AWK] Gestione e confronto input da più file

Messaggio da jxmmy000 »

Purtroppo sono obbligato a svolgerlo con AWK, sto preparando l'esame di Sistemi Operativi e questo è un tipo di script richiesto :( in C ci avrei messo pochi minuti, per esempio
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: [AWK] Gestione e confronto input da più file

Messaggio da crap0101 »

potresti provare una roba del genere:

Codice: Seleziona tutto

crap0101@orange:/tmp/foo$ cat best.awk
#!/usr/bin/awk -f

BEGIN {
    outfile = ARGV[ARGC-1]
    ARGV[ARGC-1] = ""
    PROCINFO["sorted_in"] = "@val_num_asc"
}

FNR == NR {
    prodotti[$2] = $1
}

FNR != NR {
    fornitori[FILENAME][$1] = $2
}

END {
    for (p in prodotti) {
        delete costo
        for (f in fornitori) {
            if (p in fornitori[f]) {
                costo[f] = fornitori[f][p]
            }
        }
        for (c in costo) {
            best = costo[c]
            break
        }
        for (c in costo) {
            if (costo[c] > best) {
                break
            } else {
                print prodotti[p] " -> " costo[c] " (" c ")"
            }
        }
    }
}
da cui:

Codice: Seleziona tutto

crap0101@orange:/tmp/foo$ cat fornitore1.txt 
pr02 1.25
pr03 1.15
pr06 0.90
pr05 1.45
crap0101@orange:/tmp/foo$ cat fornitore2.txt 
pr02 1.65
pr03 1.45
pr06 0.90
pr05 1.25
crap0101@orange:/tmp/foo$ cat prodotti.txt 
coca-cola pr01
fanta pr02
sprite pr03
breezer pr04
gatorade pr05
orangina pr06
crap0101@orange:/tmp/foo$ ./best.awk prodotti.txt fornitore1.txt fornitore2.txt  out.txt
fanta -> 1.25 (fornitore1.txt)
gatorade -> 1.25 (fornitore2.txt)
orangina -> 0.90 (fornitore2.txt)
orangina -> 0.90 (fornitore1.txt)
sprite -> 1.15 (fornitore1.txt)
In questo modo vedi anche quelli che hanno (nel caso) lo stesso prezzo.
Per fare come devi bisogna cambiare qualcosa per fare la verifica che i fornitori abbiano quel prodotto.
Il file "di uscita" dove immagino devi mettere l'output non l'ho utilizzato, ma direi che basta una redirezione.
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 5 ospiti