[Risolto]Terminale: Unire due file sostiuendo parti

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
ixamit
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 499
Iscrizione: giovedì 14 novembre 2013, 10:16

Re: [Risolto]Terminale: Unire due file sostiuendo parti

Messaggio da ixamit »

HT Vincenzo1968!
Confermo che la tua versione è _indiscutibilmente_ più efficiente della mia ed anche meglio scritta. Un rigido controllo sui dati input ne blocca l'esecuzione. Inoltre, non ho riscontrato leak .
La mia versione, invece, è altamente vulnerabile sul file A, mentre sul file B viene fatto un controllo (superficiale?) solo se specificato in compilazione.

Ne approfitto per segnalare un errore presente nello script bash2.sh, scritto dal sottoscritto e qui di seguito corretto:

Codice: Seleziona tutto

...
# step 1 
declare -A a 
while read line; do
    parts=(${line//,/ })
    if [[ ${#parts[@]} -eq 2 ]]; then
        a[${parts[1]}]=${parts[0]}
    fi
done < "$FILE2"
...
DennyEmpoli
Prode Principiante
Messaggi: 155
Iscrizione: sabato 3 luglio 2010, 14:57
Desktop: Mate
Distribuzione: Linux Mint 15 Olivia 64bit
Località: Empoli (FI)

Re: [Risolto]Terminale: Unire due file sostiuendo parti

Messaggio da DennyEmpoli »

Ciao a tutti!
stavo rileggendo i miei vecchi post e mi sono imbattuto in questo in cui sono state date tutte le possibili soluzioni esistenti con tanto di statistiche :birra:

Ne mancava una; la posto almeno ne abbiamo una in più... Senza troppe complicazioni bastava usare la join (al tempo non la conoscevo :D )

Codice: Seleziona tutto

denny@linuxmint ~ $ time join -t\; -1 2 -2 2 <(sort -t\; -k2 A) <(tr ',' ';' < B) -o 1.1,2.1 > /dev/null 

real	0m0.013s
user	0m0.013s
sys	0m0.007s


denny@linuxmint ~ $ time awk 'FNR==NR{a[$2]=$1;next} {print $1";"a[$2]}' FS=',' B FS=';' A > /dev/null 

real	0m0.028s
user	0m0.026s
sys	0m0.000s

In entrambi i casi redirigo lo standard output su /dev/null , quindi i tempi dovrebbero essere equiparabili.

Poi, eseguendo questi banali script per lo stress test:

stress_awk.sh

Codice: Seleziona tutto

#!/bin/bash

for i in $(seq $1)
do
    awk 'FNR==NR{a[$2]=$1;next} {print $1";"a[$2]}' FS=',' B FS=';' A > /dev/null
done
stress_join

Codice: Seleziona tutto

#!/bin/bash

for i in $(seq $1)
do
    join -t\; -1 2 -2 2 <(sort -t\; -k2 A) <(tr ',' ';' < B) -o 1.1,2.1 > /dev/null
done
Ho i seguenti risultati:

awk

Codice: Seleziona tutto

denny@linuxmint ~ $ time ./stress_awk.sh 1000

real	0m7.231s
user	0m6.497s
sys	0m0.724s
join

Codice: Seleziona tutto

denny@linuxmint ~ $ time ./stress_join.sh 1000

real	0m7.853s
user	0m9.355s
sys	0m0.912s
VInce la versione con AWK! Però c'è da dire che con la join uso 2 comandi esterni per adattare i due file alla comparazione
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 15 ospiti