빈 문자열 값으로 리디렉션하는 동안 Awk 명령이 실패합니다.

빈 문자열 값으로 리디렉션하는 동안 Awk 명령이 실패합니다.

대용량 파일을 여러 부분으로 나누고 싶습니다. 분할 후 파일 이름과 파일당 레코드 수는 awk에 인수/변수로 제공됩니다.

EG: ( FILENAME=A_20100개의 레코드가 있다고 가정) NoOfRecordsPerFile=50 분할 파일 이름은 다음과 같아야 합니다.

A_20-1.txt
A_20-2.txt

내가 사용하는 명령은 다음과 같습니다.

awk -vNoOfRecordsPerFile -vFILENAME 'NR%NoOfRecordsPerFile==1{x=FILENAME"-"++i".txt"}{print > x}' $FILENAME

오류가 발생합니다.

awk: (FILENAME=A_20 FNR=1) fatal expression for `>' has null string value

내가 뭐 잘못 했어요?

다른 파일에도 동일한 명령이 작동합니다.

답변1

FILENAME변수를 다음과 결합합니다 .비어 있는값(명령줄에 값을 제공하지 않음)을 사용하면 FILENAME스크립트가 실행되기 전에 오류가 발생합니다. 이미awkawk가지다FILENAME이름이 지정된 변수를 사용할 수 있습니다. 현재 입력 파일의 이름입니다.

를 사용하면 -vNoOfRecordsPerFile명령줄에서 변수에 값을 할당하고 싶지만 awk결코 값을 할당하지 않는다고 말합니다. 이것은 당신이 말하는 것과 다른 오류를 생성할 것입니다. 동일한 이름의 쉘 변수 값을 사용하려면 -v NoOfRecordsPerFile="$NoOfRecordsPerFile".

따라서 최종 awk명령은 다음과 같습니다.

awk -v NoOfRecordsPerFile="$NoOfRecordsPerFile" '
    ((NR-1) % NoOfRecordsPerFile) == 0 { x = FILENAME "-" ++i ".txt" }
                                       { print > x                   }' "$FILENAME"

답변2

오류는 NR%NoOfRecordsPerFile==1변수를 사용하기 전에 충족되지 않은 조건 으로 인해 발생하므로 x변수가 설정되지 않았습니다.

대신 awk다음을 사용할 수 있습니다 split.

split -l 50 -d --additional-suffix='.txt' --numeric-suffixes=1 A_20 'A_20-'

이렇게 하면 파일이 A_20각각 50줄씩 A_20-01.txt및 이라는 2개의 파일로 분할됩니다 A_20-02.txt.


을 사용하려면 awk다음을 시도해 보세요.

awk -v lineno=50 '((NR-1)%lineno)==0{cnt++;f=FILENAME "-" cnt ".txt"}{print >>f}' A_20

관련 정보