我正在处理一些大型文本文件,即将它们从一种格式转换为另一种格式。这些文件的原始格式有些小差异,但是在一些情况下进行预处理后,它们大多数都可以通过我创建的Bash shell脚本成功转换。
到目前为止一切都很好,但有一件事让我感到困惑。在某个时候,脚本设置了一个名为
因此,我的脚本的原始版本包含了以下行:
到目前为止一切都很好,但有一件事让我感到困惑。在某个时候,脚本设置了一个名为
$iterations
的变量,以便它知道执行特定for循环的次数。这个值是由脚本创建的临时文件中的空行数确定的。因此,我的脚本的原始版本包含了以下行:
iterations=$(cat tempfile | grep '^$' | wc -l)
到目前为止,这种方法在除了一个文本文件外的所有文本文件中都运行良好。这个文本文件似乎没有正确设置$iterations
变量,即使tempfile
中有超过20,000个空行,也会给出一个值为'1'的结果。
然而,我发现了grep -c
命令后,将这一行改为:
iterations=$(cat tempfile | grep -c '^$')
脚本突然工作了,即$iterations
正确设置。
有人能解释一下为什么这两个版本会产生不同的结果吗?为什么第一个版本在某些文件上可以工作而在其他文件上不能工作?是否有某个上限值,超过该值wc -l
默认为1?第一个版本无法处理的文件是其中最大的文件之一,但不是最大的文件(最大的文件第一次转换时已经正确)。
grep -c'^$'
产生的输出与grep '^$' | wc -l
不同? - William Pursellwc
感到困惑。如果运行cat tempfile | grep '^$' | hexdump -C | head
,会产生什么有趣的结果吗? - Dima Chubarovwc
产生1
,而grep -c则计算为4。 - William Pursellgrep
正在打印“Binary file (standard input) matches”,而wc正在计算该行! - William Pursell