대용량 파일을 여러 부분으로 나누고 싶습니다. 분할 후 파일 이름과 파일당 레코드 수는 awk에 인수/변수로 제공됩니다.
EG: ( FILENAME=A_20
100개의 레코드가 있다고 가정) 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
스크립트가 실행되기 전에 오류가 발생합니다. 이미awk
awk
가지다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