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