如果文件没有行尾字符,则wc -l不计算文件的最后一个

log*_*gan 12 unix linux bash shell

我需要计算unix文件的所有行.该文件有3行但wc -l只提供2个计数.

我知道它没有计算最后一行,因为它没有行尾字符

有没有人可以告诉我如何计算这一行?

小智 10

grep -c返回匹配行数.只需使用空字符串""作为匹配表达式:

$ echo -n $'a\nb\nc' > 2or3.txt
$ cat 2or3.txt | wc -l
2
$ grep -c "" 2or3.txt
3
Run Code Online (Sandbox Code Playgroud)


anu*_*ava 9

最好\n在Unix文件中以EOL结尾所有行.你可以做:

{ cat file; echo ''; } | wc -l
Run Code Online (Sandbox Code Playgroud)

或者这个awk:

awk 'END{print NR}' file
Run Code Online (Sandbox Code Playgroud)

  • @logan:注意`{cat file; 回声''; } | 如果文件已经以`\n`结尾,wc -l`将给出错误的答案,因为它总是**添加额外的行,所以基于awk的解决方案更好. (4认同)

Joh*_*024 5

无论文件中的最后一行是否以换行符结尾,这种方法都会给出正确的行数。

awk将确保在其输出中,它打印的每一行都以换行符结尾。因此,要确保每行在将行发送到 之前以换行符结尾wc,请使用:

awk '1' file | wc -l
Run Code Online (Sandbox Code Playgroud)

在这里,我们使用awk仅由数字组成的简单程序1awk将这个神秘的语句解释为它所做的“打印行”,并确保存在尾随换行符。

例子

让我们创建一个包含三行的文件,每行以换行符结尾,并计算行数:

$ echo -n $'a\nb\nc\n' >file
$ awk '1' f | wc -l
3
Run Code Online (Sandbox Code Playgroud)

找到了正确的号码。

现在,让我们在缺少最后一行的情况下重试:

$ echo -n $'a\nb\nc' >file
$ awk '1' f | wc -l
3
Run Code Online (Sandbox Code Playgroud)

这仍然提供了正确的数字。 awk自动更正丢失的换行符,但如果存在最后一个换行符,则不处理文件。