我有这个脚本可以将文件划分为 100000 行甚至更多,分为 50000 行。
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␍
were这样的行␍
是一个 CR 字符,它将其解析为对名为 的命令的调用SOMECOMMAND␍
。由于没有这样的命令,bash 会显示其通常的错误消息。
在终端中,控制字符 CR 将光标移回行首。因此消息的其余部分将覆盖命令名称。
修复方法是不要使用 Windows 编辑器来编辑 shell 脚本,或者将编辑器配置为不在 shell 脚本中添加 CR 字符。
要将 Linux 或 Cygwin 下的现有文件从 Windows 行结尾转换为 Unix 行结尾,可以使用以下命令。即使原始文件混合了 Windows 和 Unix 行结尾,它也能工作。
sed -i -e 's/\r$//' parte.sh
答案2
使用split(1)
, 例如split --lines=50000 pa.txt
(或设置您自己的前缀)。可能比 bad 快得多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