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
Ne mancava una; la posto almeno ne abbiamo una in più... Senza troppe complicazioni bastava usare la join (al tempo non la conoscevo
)
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