Bonsoir.
Suffit de faire des tests de perf 
1 2
| [idriss@hp-dv6:~]$ content=""; for i in {1..1000}; do content=$(cat f1.txt <(echo -e "$content")); done;
[idriss@hp-dv6:~]$ content2=""; for i in {1..1000}; do content2=$(cat f2.txt <(echo -e "$content2")); done; |
Pour ma version de join :
1 2 3 4
| [idriss@hp-dv6:~]$ date +%H:%M:%S:%N;join -t';' -11 -22 <(echo -e"$content"|sed 's/\ //g'|sort) <(echo -e "$content2"|sed 's/\ //g'|sort)|cut -d ';' -f3|sort -u;date +%H:%M:%S:%N
17:46:56:957289092
00.1F.FF.5H.66
17:46:58:287069050 |
Pour ma solution avec grep :
1 2 3 4
| [idriss@hp-dv6:~]$ date +%H:%M:%S:%N;grep -f <(echo -e "$content"|sed 's/\ //g'|sort|cut -d';' -f1) <(echo -e "$content2"|sed 's/\ //g'|sort)|cut -d ';' -f1|sort -u;date +%H:%M:%S:%N
17:49:11:036894800
00.1F.FF.5H.66
17:49:11:148334877 |
C'est rapide grep, en fait 
Et une solution avec awk inspirée de la solution de N_Bah mais permettant d'éviter les doublons sans passer par sort :
awk -F' ; ' 'FNR=NR{a[$2]=$1;};{if($1 in a)t[a[$1]]=a[$1]} END {for (i in t)print t[i]}' f2.txt f1.txt
Voici pour le test de perf :
1 2 3 4
| [idriss@hp-dv6:~]$ date +%H:%M:%S:%N;awk -F' ; ' 'FNR=NR{a[$2]=$1;};{if($1 in a)t[a[$1]]=a[$1]} END {for (i in t)print t[i]}' <(echo -e "$content2") <(echo -e "$content");date +%H:%M:%S:%N
17:55:11:264311606
00.1F.FF.5H.66
17:55:11:289953146 |
=> Quasi instantané également.
Pour départager grep et awk, on pourrait faire un test de perf à plus grande échelle (10 000 fois le contenu par exemple) mais bon le CPU de mon petit laptop morfle trop 
Comme dit N_Bah, la solution awk à l'avantage de n'utiliser qu'un processus donc préférable et est probablement plus performante à plus grande échelle.
Idriss
Partager