awk는 다른 파일의 줄 번호를 사용하여 파일의 내용을 필터링합니다.

awk는 다른 파일의 줄 번호를 사용하여 파일의 내용을 필터링합니다.

awk다른 파일의 내용을 기반으로 파일의 특정 내용을 필터링 하려고 합니다 . 하지만 작동하지 않습니다.

orig_data와 noghest_data라는 두 개의 파일이 있습니다. 두 파일 모두 동일한 수의 줄을 가지며, 줄은 동일한 이벤트에 해당하지만 내용은 다릅니다. orig_data not 에 해당하는 noghest_data의 내용을 인쇄하고 싶습니다 Ghest. 아래 코드가 작동하지 않습니다. 모든 것을 인쇄합니다.

awk -F " "  'NR==FNR{if($0 ~ /^Ghest/) {line[NR]++} next} !(NR in line) {print $0}' orig_data.txt noghest_data.txt

답변1

스크립트에는 거의 아무런 문제가 없습니다. 조금 단순화하려면 다음을 수행하십시오.

awk 'NR == FNR && /^Ghest/ {line[NR]} NR > FNR && ! (FNR in line)' \
  orig_data.txt noghest_data.txt

첫 번째 패턴( NR == FNR && /^Ghest/)은 이 문자열로 시작하는 첫 번째 입력 파일의 행에 대해서만 true로 평가됩니다 Ghest. 해당 작업은 현재 줄 번호를 배열의 인덱스로 추가합니다 line.

NR > FNR && ! (FNR in line)첫 번째 패턴이 아닌 입력 파일의 경우 두 번째 패턴( )은 true로 평가됩니다.만약에현재 파일과 관련된 행 번호는 배열 인덱스가 아닙니다 line( print $0이 작업을 생략할 경우 기본값).

~처럼에드 모튼 제안NR, 이는 한 번만 비교하여 더 효율적으로 만들 수 있습니다 FNR.

awk 'NR == FNR { if (/^Ghest/) line[NR]; next } !(FNR in line)'

관련 정보