comparando linhas com awk vs while read line

0

Eu tenho dois arquivos, um com 17k linhas e outro com 4k linhas. Eu queria comparar a posição 115 à posição 125 com cada linha no segundo arquivo e se houver uma correspondência, escreva a linha inteira do primeiro arquivo em um novo arquivo. Eu tinha uma solução onde eu li o arquivo usando 'cat $ filename | enquanto ler LINE '. mas demora cerca de 8 minutos para ser concluído. Existe alguma outra maneira de usar 'awk' para reduzir este tempo de processo?

meu 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
    
por user37774 24.04.2013 / 17:04

1 resposta

3

O seguinte deve funcionar, atualizado para remover espaços em branco:

#!/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;
}       

Coloque-o em um arquivo e chame um dos seguintes

awk -f script.awk patterns.txt full.txt
./script.awk patterns.txt full.txt
    
por 24.04.2013 / 17:46