명령줄에서 변수를 읽는 awk 스크립트 작성

명령줄에서 변수를 읽는 awk 스크립트 작성

awk명령줄에서 사용자 입력을 읽고 이를 변수로 저장하는 스크립트를 작성하려고 합니다 .

명령줄에서 컴파일하고 실행하면

./myawk.awk -v ID=4 text.sql

ID는 4로 설정된 변수가 됩니다. 그러나 내 스크립트에 제공된 입력 테스트 사례는

./myawk.awk ID=4 text.sql

이 스크립트의 궁극적인 목표는 다음으로 시작하는 ID를 얻는 것입니다.

-- ID

그리고 다음 줄을 인쇄합니다. 내가 지금까지 가지고 있는 것은

#!/bin/awk -f
{
  if ($1 ~/--/ && $2 ~/^ID/){
    x = NR+1
  }
  while (NR <= x){
    print $0
  }
}

-v해당 줄을 변경하거나 그 앞에 추가하지 않고 변수 ID를 어떻게 읽을 수 있습니까 ? awk현재 스크립트에 대한 몇 가지 제안 사항도 있을 수 있습니다.

답변1

변수 할당이 스크립트의 명령줄에서 파일 피연산자로 제공되면 awk파일 피연산자를 사용할 때 해당 지점에 도달하면 할당이 수행됩니다.awk

예:

awk -f script.awk a=1 file1 file2 a=2 file3 a=3 file4

여기서 awk변수는 읽기 전에 a설정됩니다 . 이 변수는 파일을 읽을 때까지 이 값을 유지합니다(프로그램에 의해 변경되지 않는 한) . 그런 다음 등 으로 설정하십시오 .1file1awkfile22

이는 명령줄이 변수를 ID읽기 전에 변수를 올바르게 설정하고 있음을 의미합니다.4text.sql

-v ID=4이것과 이것의 차이점은 ID어떤 블록에도 설정되지 않는다는 것입니다 BEGIN. -v ID=4컬렉션을 사용하여 ID4그것~ 할 것이다청크로 사용 가능합니다 BEGIN.

코드의 또 다른 문제는 ID리터럴 로 사용한다는 것입니다.존재하다

if ($1 ~/--/ && $2 ~/^ID/){

즉, 두 번째 필드가 string 으로 시작하는지 테스트합니다 ID.

while파일의 행을 반복 하려는 것 같습니다 . 한 줄씩 읽는 루프가 awk작동 모드에 내장되어 있습니다.희귀한명확해야합니다.

대신에,

$1 == "--" && $2 == ID { getline; print }

이는 문자열 비교(정규식 일치 아님)를 사용하여 현재 줄에서 공백으로 구분된 첫 번째 필드가 string 인지 --, 두 번째 필드가 변수 값인지 확인합니다 ID. 그렇다면 다음 입력 줄을 읽고 인쇄합니다.

대신 정규 표현식을 사용하려면

$0 ~ "^-- " ID "$" { getline; print }

이는 이중 대시와 단일 공백으로 시작하는 모든 줄과 일치하고 그 뒤에 값 ID과 줄 끝( $줄 끝과 일치)이 옵니다. 일치하는 줄 다음의 줄이 인쇄됩니다.

답변2

awk를 사용하여 사용자 입력을 읽는 방법은 다음과 같습니다.

awk '
    BEGIN {
        printf "Enter an ID: "
        # "-" is the filename for stdin
        getline id < "-"
    }
    # then we can use that value however we like
    $1 == "--" && $2 == id {getline; print}
' file

답변3

I Tried with below method and it worked fine


 #!/bin/bash
echo "enter the number"
read p
awk -v p="$p" '$1 == "--" && $2 == p {print $0}' filename

관련 정보