Vergleichen von Zeilen mit awk vs. while read line

Vergleichen von Zeilen mit awk vs. while read line

Ich habe zwei Dateien, eine mit 17.000 Zeilen und eine mit 4.000 Zeilen. Ich wollte Position 115 mit Position 125 jeder Zeile in der zweiten Datei vergleichen und, falls eine Übereinstimmung besteht, die gesamte Zeile aus der ersten Datei in eine neue Datei schreiben. Ich habe eine Lösung gefunden, bei der ich die Datei mit „cat $filename | while read LINE“ lese. Das dauert aber ungefähr 8 Minuten. Gibt es eine andere Möglichkeit, wie z. B. „awk“, um diesen Vorgang zu verkürzen?

mein Code

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

Antwort1

Folgendes sollte funktionieren (aktualisiert, um Leerzeichen zu entfernen):

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

Legen Sie es in eine Datei und rufen Sie es mit einer der folgenden

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

verwandte Informationen