awk를 사용하여 행을 읽는 동안 비교

awk를 사용하여 행을 읽는 동안 비교

두 개의 파일이 있습니다. 하나는 17k 라인이고 다른 하나는 4k 라인입니다. 두 번째 파일의 각 줄에 대해 위치 115와 위치 125를 비교하고 일치하면 첫 번째 파일의 전체 줄을 새 파일에 쓰고 싶습니다. 나는 해결책을 찾았고 'cat $filename |을 사용하여 LINE을 읽는 동안 파일을 읽었습니다. 하지만 완료하는 데 약 8분이 소요됩니다. 이 처리 시간을 줄이기 위해 "awk"를 사용하는 것과 같은 다른 방법이 있습니까?

내 코드

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

답변1

다음은 작동하며 공백을 제거하도록 업데이트되었습니다.

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

파일에 넣고 다음 명령 중 하나를 사용하여 호출하세요.

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

관련 정보