Manera eficiente de comparar en awk

#!/bin/awk BEGIN { while(getline var < compareTo > 0) { orderIds[var]=var; } } { if(orderIds[$0] == "") { print $0; } } 

Corriendo como

 awk -v compareTo="ids.log.remote" -f sample.awk ids.log.local 

Esto está funcionando, pero en lugar de utilizar matrices asociativas (como HashMap), ¿hay algo así como un HashSet en awk?

Tengo los times

 bash-3.2$ time grep -xFvf ids.log.local ids.log.remote > /dev/null real 0m0.130s user 0m0.127s sys 0m0.002s bash-3.2$ time grep -xFvf ids.log.local ids.log.remote > /dev/null real 0m0.126s user 0m0.125s sys 0m0.000s bash-3.2$ time grep -xFvf ids.log.local ids.log.remote > /dev/null real 0m0.131s user 0m0.128s sys 0m0.002s bash-3.2$ time awk 'NR == FNR { orderIds[$0]; next } !($0 in orderIds) ' ids.log.local ids.log.remote > /dev/null real 0m0.053s user 0m0.051s sys 0m0.003s bash-3.2$ time awk 'NR == FNR { orderIds[$0]; next } !($0 in orderIds) ' ids.log.local ids.log.remote > /dev/null real 0m0.052s user 0m0.051s sys 0m0.001s bash-3.2$ time awk 'NR == FNR { orderIds[$0]; next } !($0 in orderIds) ' ids.log.local ids.log.remote > /dev/null real 0m0.053s user 0m0.051s sys 0m0.002s bash-3.2$ time awk -v compareTo="ids.log.local" -f checkids.awk ids.log.remote > /dev/null real 0m0.066s user 0m0.060s sys 0m0.006s bash-3.2$ time awk -v compareTo="ids.log.local" -f checkids.awk ids.log.remote > /dev/null real 0m0.065s user 0m0.058s sys 0m0.008s bash-3.2$ time awk -v compareTo="ids.log.local" -f checkids.awk ids.log.remote > /dev/null real 0m0.061s user 0m0.053s sys 0m0.007s 

@Dimitre Radoulov Parece que tu awk es más rápido. Gracias.

Related of "Manera eficiente de comparar en awk"

Creo que esta es la forma más eficiente de hacer esto en awk:

 awk 'NR == FNR { orderIds[$0]; next } !($0 in orderIds) ' ids.log.remote ids.log.local 

Puedes probar con grep también:

 grep -xFVf ids.log.remote ids.log.local