100,000줄 이상의 파일을 50,000줄로 나누는 스크립트가 있습니다.
desc()
{
echo $1 $2|awk '{d=$1;}
BEGIN {a=1;b=0}
{ f=d"0"a;
while ((getline x<d)>0)
{ print x>>f".txt"
if (b++>=50000)
{
close(f);b=0;a++;f=(a<10)?d"0"a:f=d""a
}
}
}
END {print "Terminado ... ! "}'
}
if [ -f $1 ]; then
desc $1 $2
fi
실행하면 다음과 같은 오류 메시지가 나타납니다.
sh-3.2$ parte.sh pa.txt
: command not found
'/parte.sh: line 2: syntax error near unexpected token `
'/parte.sh: line 2: `desc()
sh-3.2$
누구든지 이 문제를 해결하는 데 도움을 줄 수 있나요?
답변1
첫 번째 오류 메시지 : command not found
는 일반적인 형식이 아닙니다 bash: SOMECOMMAND: command not found
. 이는 수상한 일이 일어나고 있음을 나타냅니다.
무슨 일이 일어나고 있는지 스크립트에입력하다특정 줄 끝의 문자. Windows에서 개행 문자는 두 문자 시퀀스 CR, LF(캐리지 리턴 다음에 줄 바꿈)로 표시됩니다. 모든 Unix 버전에서 개행 문자는 LF 문자로만 표시됩니다. Bash는 SOMECOMMAND␍
was와 같은 줄이 CR 문자임을 확인 ␍
하고 이를 이라는 명령에 대한 호출로 구문 분석합니다 SOMECOMMAND␍
. 그러한 명령이 없기 때문에 bash는 일반적인 오류 메시지를 표시합니다.
터미널에서 제어 문자 CR은 커서를 줄의 시작 부분으로 다시 이동합니다. 따라서 메시지의 나머지 부분은 명령 이름을 덮어쓰게 됩니다.
수정 방법은 Windows 편집기를 사용하여 쉘 스크립트를 편집하거나, 쉘 스크립트에 CR 문자를 추가하지 않도록 편집기를 구성하는 것입니다.
Linux 또는 Cygwin의 기존 파일을 Windows 줄 끝에서 Unix 줄 끝으로 변환하려면 다음 명령을 사용할 수 있습니다. 원본 파일에 Windows와 Unix 줄 끝이 혼합되어 있는 경우에도 작동합니다.
sed -i -e 's/\r$//' parte.sh
답변2
split(1)
예를 들어 를 사용 split --lines=50000 pa.txt
하거나 고유한 접두사를 설정하세요. 아마도 나쁜 것보다 훨씬 빠를 것입니다 awk
.
DESCRIPTION
Output fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; default
size is 1000 lines, and default PREFIX is `x'. With no INPUT, or when
INPUT is -, read standard input.
답변3
이것이 sh 스크립트인 경우 함수 정의에 오류가 있는 것 같습니다.
desc()
{
해야 한다:
function desc {
스크립트 예:
#!/bin/bash
function desc {
echo Hi
}
echo Starting
desc
echo Ending