일련의 패턴이 저장되어 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 ..."