comparando líneas con awk vs mientras se lee la línea

comparando líneas con awk vs mientras se lee la línea

Tengo dos archivos uno con 17k líneas y otro con 4k líneas. Quería comparar la posición 115 con la posición 125 con cada línea del segundo archivo y, si hay una coincidencia, escribir la línea completa del primer archivo en un archivo nuevo. Se me ocurrió una solución en la que leía el archivo usando 'cat $filename | mientras lee LINE'. pero tarda unos 8 minutos en completarse. ¿Existe alguna otra forma como usar 'awk' para reducir el tiempo de este proceso?

mi código

cat $filename | while read LINE
do
  #read 115 to 125 and then remove trailing spaces and leading zeroes
  vid=`echo "$LINE" | cut -c 115-125 | sed 's,^ *,,; s, *$,,' | sed 's/^[0]*//'`
  exist=0
  #match vid with entire line in id.txt
  exist=`grep -x "$vid" $file_dir/id.txt | wc -l`
  if [[ $exist -gt 0 ]]; then
    echo "$LINE" >> $dest_dir/id.txt
  fi
done

Respuesta1

Lo siguiente debería funcionar, actualizado para eliminar los espacios en blanco:

#!/usr/bin/awk -f
# NR is the current line number (doesn't reset between files)
# FNR is the line number within the current file
# So NR == FNR  takes only the first file
NR == FNR {
    # Mark the current line as existing, via an associative array.
    found[$0]=1

    # Skip to the next line, so we don't go through the next block
    next
}
{
    # Take the columns we're looking for
    cols = substr($0,115,11)

    # Strip whitespace (space and tab) from the beginning (^) and end ($) 
    gsub(/^[ \t]+/,"", cols)
    gsub(/[ \t]+$/,"", cols)

    # Check the associative array to see if this was in the first file
    # If so, print the full line
    if(found[cols]) print;
}       

Ponlo en un archivo y llama con uno de los siguientes

awk -f script.awk patterns.txt full.txt
./script.awk patterns.txt full.txt

información relacionada