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