【发布时间】:2012-12-31 12:49:30
【问题描述】:
我正在尝试加载和解析一个非常大的文本文件。虽然加载不是问题,但有一些特定的行在一行上有 2908778 个字符。
这导致我的脚本出错。
在下面的脚本中,我删除了所有逻辑并直接阅读行。 我还删除了所有有效行,只是将很长的行留在了一个文本文件中。运行时出现以下错误:
$ dowhiledebug.sh dump.txt
dowhiledebug.sh[6]: no space
Script Ended dump.txt
实际脚本:
#!/bin/sh
filename=$1
count=1
if [ -f ${filename} ]; then
echo "after then"
while read line;
do
echo "$count"
count=$((count+1))
done < $filename
else
echo "Could not open file $filename"
fi
echo "Script Ended $filename"
更新 (2013-01-17)
跟进问题:Is it possible to increase the maximum number of characters that ksh variable accepts?
【问题讨论】:
-
为什么不使用
wc -l来计算文件中的行数?它不会有外壳的限制。我想答案是“因为我需要做其他处理,我已经删除了复制”。 -
在我的带有
bash3.2 的Mac 上,我创建了一个包含4194304 个字符且根本没有换行符的文件,然后bash完全忽略了该行。我添加了一个换行符,bash很高兴将全部内容读入内存。因此,您的大小不是硬性限制。您需要查看系统上有多少内存(我敢肯定超过 3 MiB),以及 shell 是否有许多巨大的变量耗尽了内存。 -
而且,FWIW,机器上 ARG_MAX 的
sysconf值是 256 KiB,就像在答案中一样。我不认为该限制与 ARG_MAX 直接相关(不过,我承认,我能够将 4 MiB 字符串回显到wc有点惊讶)。这仍然在 Mac 上。 -
那就别那么做了!为您的问题找到一些不需要您将整行加载到 ksh 变量中的解决方案。
-
@JonathanLeffler:你能够
echo这么大的字符串的原因是echo是 Bash 中的 builtin,在这种情况下 ARG_MAX 不适用.比较echo "$(awk 'BEGIN { while (c++ < '"$(( $(getconf ARG_MAX) + 1 ))"') printf "=" }')"和/bin/echo "$(awk 'BEGIN { while (c++ < '"$(( $(getconf ARG_MAX) + 1 ))"') printf "=" }')"。也就是说,我也认为 ARG_MAX 与 OP 的问题无关。