이 Bash 쉘 스크립트에서 gawk에 두 번째 변수를 전달하는 데 실패했습니다.

이 Bash 쉘 스크립트에서 gawk에 두 번째 변수를 전달하는 데 실패했습니다.

쉘 스크립트에서 AWK 스크립트로 두 개의 변수를 전달하고 싶습니다.

#!/bin/bash

HeaderSize=$(grep -n "# end header data" input.list | tr ":" "\n" | head -n 1)
RecordSize=$(grep -n "# Number of unique" input.list | tr ":" "\n" | tail -n 1 | sed 's/,//g')

echo $HeaderSize
echo $RecordSize

head -n $HeaderSize input.list > temp.list

./parse.awk -v headersize=$HeaderSize -v recordsize=$RecordSize < input.list >> temp.list

문서파싱.awk다음과 같습니다.

#!/bin/gawk -f

BEGIN {
    curline=1;
    excludeline=0;
    newrecordsize=0;
}
{
    if (curline < $headersize) {
        curline++;
    } else {
        if (($2 !~ /test1/) && ($2 !~ /test2/) && ($2 !~ /test3/)) {
            print $0;
        } else {
            excludeline++;
        }
    }
}
END {
    print "#", excludeline, "lines excluded";
    newrecordsize = recordsize - excludeline;
    printf "# Number of unique items after exclusions: %'d\n", newrecordsize;
}

그래서 헤더를 직접 복사한 다음 일부 데이터를 제외하고 싶습니다.

Bash 파일을 실행하면 gawk가 실행될 때 오류가 발생합니다.

38
94108
gawk: ./parse.awk:6: fatal: cannot open file `94108' for reading (No such file or directory)

94108은 RecordSize의 값이거나 전달하려는 두 번째 변수입니다.

이 오류를 어떻게 해결할 수 있나요?

편집하다:아래에 있는 답변은 변수에 대한 큰따옴표와 관련이 있으며, 이는 분명히 어디에서나 수행해야 합니다. 이것은 내 현재 스크립트이며 잘 작동합니다.

#!/bin/bash

HeaderSize=$(grep -n "# end header data" input.list | tr ":" "\n" | head -n 1)
RecordSize=$(grep -n "# Number of unique" input.list | tr ":" "\n" | tail -n 1 | sed 's/,//g')

echo "$HeaderSize"
echo "$RecordSize"

head -n "$HeaderSize" input.list > temp.list

./parse.awk -v "headersize=$HeaderSize" -v "recordsize=$RecordSize" < input.list >> temp.list

나는 또한 awk 스크립트를 정리했습니다.

#!/bin/gawk -f

BEGIN {
    excludeline=0;
    newrecordsize=0;
}

NR > headersize {
    if (($2 !~ /test1/) && ($2 !~ /test2/) && ($2 !~ /test3/)) {
        print $0;
    } else {
        excludeline++;
    }
}
END {
    print "#", excludeline, "lines excluded";
    newrecordsize = recordsize - excludeline;
    printf "# Number of unique domains after exclusions: %'d\n", newrecordsize; 
}

답변1

$RecordSize변수를 참조하는 ; 시작 부분에 공백이 있는 것 같습니다.

echo "$HeaderSize"
echo "$RecordSize"

./parse.awk -v "headersize=$HeaderSize" -v "recordsize=$RecordSize" < input.list >> temp.list

관련 정보