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)'