wc -l在非空文件上返回0

3

我在服务器上使用Curl从https://api.data.gov/ed/collegescorecard/v1/schools?api_key=[my_API_key]下载了一个JSON文件。

(如果你想尝试一下,我已经将该文件上传到TinyUpload中。)

下载的文件有1.5MB大小和一个非常大(且有效)的JSON对象。然而,在服务器上运行wc -l命令时,它返回的是0。而运行wc -c命令会返回正确的字节计数。

我用TextEdit打开这个文件,看起来很正常。我确实注意到,在我的服务器(CentOS 5.5)上的man wc和我的Mac(Yosemite)上的man wc似乎对-l标志有不同的描述:

CentOS 5.5:

打印换行符计数

OSX 10.10.5 Yosemite

将每个输入文件中的行数写入标准输出。

哪一个说明书是正确的?wc -l是计算行还是计算换行符?如果它计算的是行而不是换行符,是否存在即使文件中有行也会返回0的情况?

同时,马克在这个相关的SO帖子中提到,基于Windows的字符可能是正确的诊断方式吗?我用cat -vet命令执行了我的文件,但在grep中找不到^M,而手动搜索太多文本了。


你为什么想要计算一个JSON文件中的行数? - user707650
@这是一个庞大的遗留脚本,传统上用于CSV文件,我没有时间去替换它。脚本的一部分是检查正在处理的文件是否没有数据。我打算将其从“wc -l”更改为“wc -c”,但只是想覆盖所有基础知识。 - Matthew Herbst
1个回答

4
在OS X上的manpage也说(描述中的第一段):
一行被定义为由< newline>字符分隔的一串字符。
因此,两个版本的manpages之间没有矛盾。
由于您的文件没有换行符,wc -l正确地返回0。

1
为什么我找到的每篇关于计算文件行数的文章都让人们使用 wc -l 呢?你的文件中每一行都可能有一个换行符,除了最后一行,这样 wc -l 就会返回一个错误的值。 - Matthew Herbst
因为大多数文件都以换行符结尾。wc -l 也经常用于管道中,在这种情况下通常也没有问题。 - user707650
请参阅侧边栏中的相关链接之一:https://dev59.com/b3RB5IYBdhLWcg3wET1J?rq=1,其中告诉您这是行的POSIX定义。 - user707650
我猜逻辑上的结论是:不要试图在JSON文件中计算行数。实际上,你为什么要这样做呢?JSON文件可以以多种方式进行格式化,内容相同,但其中可能有0或100个换行符。 - user707650
不确定您使用的OSX版本,Yosemite的描述甚至明确指出了换行符:“一行被定义为由<newline>字符分隔的字符字符串”。 - Matthew Herbst
1
哎呀:被 Markdown 搞糊涂了。我的回答中包含了“< newline>”字符串,但是当然 MD 把它变成了(不可见的)HTML。为了防止这种情况发生,在其中加入一个额外的空格即可(使用 \ 转义 < 似乎不起作用)。 - user707650

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接