쉘 스크립트의 일련의 패턴을 awk로 전달하는 방법은 무엇입니까?

쉘 스크립트의 일련의 패턴을 awk로 전달하는 방법은 무엇입니까?

일련의 패턴이 저장되어 foo.txt있고 패턴을 반복하여 파일에서 일치하는 줄을 확인하고 싶습니다 bar.txt.

while read PWW
do
   cat user/dump/bar.txt | awk '/${PWW}/{print $2}' >> user/dump/out.txt
done < user/dump/foo.txt

foo.txt:

2100001b32
2100001b38
3100001b35
4100001b28
5100001b46
6100001b56

bar.txt:

2100001b32 good
2100001b38 bad
3100001b35 okay
4100001b28 large
5100001b46 good
6100001b56 bad

예상하다 out.txt:

good
bad
okay
large
good
bad

에서 값을 검색할 수 없습니다 foo.txt. while 루프가 실행되고 빈 출력이 제공됩니다. 나는 그것이 가치보다는 (말 그대로) awk찾고 있다고 생각합니다 .${PWW}foo.txt

어떻게 작동하게 할 수 있나요? 내 환경은 기본 awk (이전 ) 이 포함된 Korn 쉘을 사용하는 Solaris 5.10입니다 awk.

답변1

순수한 awk 솔루션은 다음과 같습니다.

$ awk 'FNR==NR{a[$1]=$2; next} {print a[$1]}' bar.txt foo.txt
good
bad
okay
large
good
bad

어떻게 작동하나요?

스크립트는 먼저 bar.txt를 읽고 해당 정보를 배열에 저장합니다 a. 그런 다음 foo.txt를 읽고 해당 값을 인쇄합니다.

  • FNR==NR{a[$1]=$2; next}

    FNR은 현재 파일에서 읽은 라인 수이고, NR은 지금까지 읽은 총 라인 수입니다. 따라서 FNR==NR, 우리는 여전히 첫 번째 파일(bar.txt)을 읽고 있습니다. 그렇다면 해당 값을 보유하는 배열에 항목을 추가하는 a[$1]=$2데 사용됩니다 . a그런 다음 스크립트의 나머지 명령을 건너뛰고 다시 시작합니다 next.

  • print a[$1]

    여기에 도착하면 두 번째 파일 foo.txt를 읽고 있습니다. foo.txt를 한 줄씩 읽습니다. 각 행에 대해 첫 번째 열의 키에 해당하는 값을 찾아 인쇄합니다.

답변2

제안을 확인하세요. bash를 포함한 유닉스 쉘에서는 작은 따옴표가 수정되지 않은 텍스트를 프로그램에 전달합니다(전달이라고 말한 대로) ${PWW}. 큰 따옴표는 변수 확장을 허용합니다.

확장 하고 싶지만 ${PWW}확장하지 않으려는 예에서는 $2다음을 수행할 수 있습니다.

awk "/${PWW}/"'{print $2}'
awk /${PWW}/{print '$2'}
awk "/${PWW}/{print \$2}"

답변3

셸에서 문자열 값을 셸로 전달하는 정식 방법 은 옵션을 awk사용하는 것입니다 -v var=val.

패턴 일치에 이러한 문자열을 사용하려면(전통적으로 수행됨) /.../전체 줄에 대해 명시적인 일치 항목을 작성해야 합니다.

awk -v pattern=${PWW} '$0 ~ pattern {print $2}'

그런데, Solaris 10의 경우 일반 버전보다 더 나은 오류 메시지를 얻으려면 nawk일반 이전 버전을 사용하는 것이 좋습니다.awk"bailing out at ..."

관련 정보