ARGV를 사용하여 Awk 스크립트에서 사용자 입력 얻기 [닫기]

ARGV를 사용하여 Awk 스크립트에서 사용자 입력 얻기 [닫기]

ARGV[i]사용자 입력을 저장하는 데 사용할 수 있다는 것을 알고 있습니다 . 그러나 awk 스크립트에서 이를 사용하고 ARGV[i]다른 텍스트 파일의 필드를 비교하고 싶습니다 . 필드가 일치 하거나 ARGV[i]필드에 ARGV[i]사용자 입력이 포함되어 있으면 행의 다른 필드를 반환하고 싶습니다.

파일이 있다고 가정 해 봅시다 testing.txt.

123123123:Walter White:1:2:3:4
123123124:Jesse Pinkman:1:3:4:1

이것은 내 awk 스크립트입니다 awkScript.awk.

 #!/usr/bin/awk -f
    BEGIN{FS = ":"; print "ENTER A NAME: "}
    {
        for (i = 1; i < ARGC; i++)
        {   
            if ($2 ~ /'ARGV[i]'/)
            {
                print "Member ID: " $1
            }
        }
    }

스크립트 파일을 실행하면 ENTER A NAME: 이 인쇄됩니다. 사용자로부터 입력을 받지도 않습니다.

답변1

ARGV[i]테스트를 다음으로 변경하는 데 필요한 것과 일치하려면

if ($2 ~ ARGV[i])

'ARGV[i]'그렇지 않으면 원하는 것이 아닌 리터럴 정규식과 일치하는지 테스트하는 것입니다 .

그런 다음 다음과 같이 스크립트를 실행하면 (다소) 작동합니다.

awk -f qtest.awk testing.txt "Jesse Pinkman" "Walter White"

그러나 test.txt 읽기를 마치고 "Jesse Pinkman" 파일을 열려고 하면 오류가 발생합니다(물론 해당 이름의 파일이 있는 경우는 제외).

즉, ARGV에는 다음이 포함됩니다.파일 이름스크립트는 셸에 의해 전달되므로 이를 사용하여 임의의 인수를 전달해서는 안 됩니다. 파일이 아닌 매개변수를 awk 스크립트에 전달하는 일반적인 방법은 구문을 사용하여 -v var = val스크립트에서 변수를 초기화하는 것입니다.

그러나 여기서 더 나은 접근 방식은 BEGIN 블록에서 test.txt를 읽고, 구문을 사용하고 getline var <namefile.txt, 데이터를 분할하고( split()함수를 사용하여) 분할된 데이터를 2D 배열에 저장하는 것입니다. 그런 다음 주 처리 루프는 파일이나 사용자로부터 이름을 읽을 수 있으며 배열에 저장된 데이터를 사용하여 테스트할 수 있습니다.

관련 정보