awk 스크립트에 대해 혼란스러워함

awk 스크립트에 대해 혼란스러워함

지침에는 다음 명령을 사용하여 스크립트 파일이 시스템에서 테스트된다는 내용이 나와 있습니다.

awk -f ./awk4.awk input.csv

다음 파일을 받아들이고 이름과 성적 필드를 출력하는 awk 스크립트를 작성하세요.

작업 1

분명히 awk -f를 사용하여 명령줄에서 실행할 수 있는 awk 스크립트여야 하는 bash 스크립트를 만들었습니다. 아래는 내 코드입니다. 모든 것을 다시 실행하지 않고도 bash 스크립트를 awk 스크립트로 변환하는 쉬운 방법이 있습니까? 방향이 정말 헷갈립니다.

#!/usr/bin/awk -f
##comment create an awk script that will accept the following file and output the name and grade fields
##comment specify the delimiter as ","
awk -F, '

/./ {
##comment print the name and grade, which is first two fields
print $1" "$2

}' $1

답변1

awk 스크립트에서 콘텐츠는 awk명령으로 제공하는 것입니다. 따라서 이 경우에는 다음과 같습니다.

/./ {
##comment print the name and grade, which is first two fields
print $1" "$2

}

그러나 이렇게 하면 -F ,블록에 설정하는 대신 사용하기가 FS까다로워질 수 있습니다 BEGIN.

따라서 스크립트는 다음과 같습니다.

#!/usr/bin/awk -f
##comment create an awk script that will accept the following file and output the name and grade fields
##comment specify the delimiter as ","
BEGIN { FS = "," }

/./ {
##comment print the name and grade, which is first two fields
print $1" "$2

}

답변2

스크립트 를 작성했지만 awk스크립트 안에 넣었습니다. 이것은 귀하의 awk스크립트입니다:

/./ {
##comment print the name and grade, which is first two fields
print $1" "$2
}

파일로 저장 script.awk하고 실행해보세요

awk -F',' -f script.awk inputfile

이제 스크립트에 대한 몇 가지 팁:

awk명령은 다음과 같습니다 CONDITION {COMMAND(S)}. CONDITION행(레코드)이 만족 되면 {COMMAND(S)}실행됩니다. 존재하지 않는 경우 CONDITION모든 {COMMAND(S)}레코드에 대해 실행합니다. 존재하지 않는 경우 {COMMAND(S)}만족하는 한 레코드를 인쇄합니다.CONDITION

귀하의 경우:

  1. /./모든 문자와 일치하는 정규식입니다. 따라서 빈 줄을 제외한 모든 줄 - 조건으로서 거의 중복됩니다.

  2. 기본값을 적용하기 " "위해 변수 사이의 구분 기호로 사용합니다 .,

  3. ,스크립트의 초기 블록에 구분 기호로 사용을 제공 해야 합니다 BEGIN.


BEGIN {FS=","}
{print $1,$2}

출력 구분 기호로 쉼표를 사용하려면 다음을 사용하십시오.

BEGIN {FS=OFS=","}
{print $1,$2}

답변3

Awk 스크립트는 에서만 작성할 수 있습니다 awk. awk 스크립트를 작성하는 방법에는 두 가지가 있습니다.

  1. awk 명령을 텍스트 파일에 작성하고 awk -f /path/to/file.awk귀하의 경우에는 다음과 같습니다.

    /./ {
    ##comment print the name and grade, which is first two fields
    print $1" "$2
    
    }
    

    다음과 같이 실행할 수 있습니다.

    awk -F, -f /path/to/file.awk inputFile
    

    또는 스크립트 자체에서 필드 구분 기호를 설정 awk -f ./path/to/file.awk inputFile하지 않고 실행해야 하는 경우 :-F,

    BEGIN{ FS=","}
     /./ {
    ##comment print the name and grade, which is first two fields
    print $1" "$2
    
    }
    

    그런 다음 awk -f /path/to/file.awk inputFile.

  2. 명령을 작성하되 shebang을 사용하여 스크립트를 읽어야 하는 인터프리터를 지정합니다. 귀하의 경우 다음과 같습니다.

    #!/usr/bin/awk -f
    
    ## With this approach, you can't use -F so you need to set
    ## the field separator in a BEGIN{} block.
    BEGIN{ FS=","}
    /./ {
    ##comment print the name and grade, which is first two fields
    print $1" "$2
    
    }
    

    그런 다음 스크립트를 실행 가능하게 만들고( chmod a+x /path/to/file.awk) 다음과 같이 실행할 수 있습니다.

    /path/to/file.awk inputFile
    
    

이것은 awk 스크립트입니다. 세 번째 옵션은 다음을 작성하는 것입니다.껍데기스크립트를 실행하고 쉘 스크립트가 awk를 실행하도록 합니다. 다음과 같이 보일 것입니다:

#!/bin/sh

awk -F, '

/./ {
##comment print the name and grade, which is first two fields
print $1" "$2

}' "$1"

당신이 가지고 있는 것은 둘 중 하나가 아닙니다. 당신은 awk shebang을 사용하고 있지만 awk 스크립트 대신 쉘 스크립트를 사용하고 있습니다.

관련 정보