awk/while을 사용하여 목록을 사용하여 여러 열이 있는 파일을 필터링하시겠습니까?

awk/while을 사용하여 목록을 사용하여 여러 열이 있는 파일을 필터링하시겠습니까?

아마도 여기서 뭔가 어리석은 짓을 하고 있는 것 같습니다(awk를 처음 접하는 사람)...

여러 열이 있는 BigFile이 있고 이름 목록(NamesList)을 기준으로 행을 필터링하려고 합니다. 이 이름은 파일의 네 번째 열에 포함되어 있습니다.

while 루프를 사용해 보세요

while read -r line; do 
cat BigFile.txt | awk '{if ($4=="$line") print $0;}' >> Output.txt
done < NamesList.txt

필터링된 줄을 Output.txt로 인쇄합니다. 이것은 나에게 빈 파일을 제공합니다 :(

내가 뭘 잘못했나요? 이 문제를 해결하는 더 좋은 방법이 있습니까?

답변1

구현의 주요 문제점은 "$line"awk 표현식을 포함하는 작은따옴표 안에 있기 때문에 쉘에 의해 확장되지 않는다는 것입니다.

할 수 있다$line다음과 같이 awk를 전달합니다 .

cat BigFile.txt | awk -v line="$line" '{if ($4==line) print $0;}' >> Output.txt

(참고로 이 내용은고양이의 쓸모없는 사용). 그러나 루프 구현에 의해 생성된 순서를 특별히 일치시켜야 하는 경우가 아니면 awk가 두 파일을 직접 처리하도록 하여 전체 쉘 루프를 건너뛰는 것이 가장 좋습니다.

awk 'NR==FNR{a[$0]; next} $4 in a' NamesList.txt BigFile.txt > Output.txt

(나는 당신이 >>쉘 루프 때문에 그것을 사용하고 있다고 가정하고 있습니다).

관련 정보