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

Linux 如果文件没有行尾字符,则wc-l不计算文件的最后一个字符,linux,bash,shell,unix,Linux,Bash,Shell,Unix,我需要计算unix文件的所有行数。该文件有3行,但wc-l仅给出2个计数 我知道它不算最后一行,因为它没有行尾字符 有谁能告诉我如何计算这一行吗?在Unix文件中,最好所有行都以EOL\n结尾。你可以做: { cat file; echo ''; } | wc -l 或者这个awk: awk 'END{print NR}' file 无论文件中的最后一行是否以换行结束,这种方法都将给出正确的行数 awk将确保在其输出中,它打印的每一行都以新行字符结尾。因此,要确保在将行发送到wc之前,每行都

我需要计算unix文件的所有行数。该文件有3行,但
wc-l
仅给出2个计数

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


有谁能告诉我如何计算这一行吗?

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

{ cat file; echo ''; } | wc -l
或者这个awk:

awk 'END{print NR}' file

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

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

awk '1' file | wc -l
这里,我们使用一个简单的
awk
程序,它只包含数字
1
awk
将这条神秘的语句解释为“打印该行”,确保后面有一个换行符

例子 让我们创建一个包含三行的文件,每行以换行结束,然后计算行数:

$ echo -n $'a\nb\nc\n' >file
$ awk '1' f | wc -l
3
找到了正确的号码

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

$ echo -n $'a\nb\nc' >file
$ awk '1' f | wc -l
3

这仍然提供了正确的数字
awk
自动更正缺少的换行符,但如果最后一个换行符存在,则保留文件。

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

$ echo -n $'a\nb\nc' > 2or3.txt
$ cat 2or3.txt | wc -l
2
$ grep -c "" 2or3.txt
3
尊重 我尊重这一点,并想在此基础上进一步阐述

行计数函数 我发现自己比较了很多行计数,特别是从剪贴板上,所以我定义了一个bash函数。我想修改它以显示文件名,当传递的文件总数超过1个时。然而,到目前为止,这对我来说还不够重要

#使用分号,因为这是我的~/.bash#配置文件中压缩为1行的代码
函数wcl(){
如果[[-z“${1:-}”]];则
设置--/dev/stdin“$@”;
fi;
对于“$@”中的f,请执行以下操作
awk 1“$f”| wc-l;
完成;
}
不带函数的行计数
#文件的行计数
$cat file_与新行| wc-l
3.
#文件的行计数
$cat file_不带新行| wc-l
2.
#cat未更改的文件行数
$cat file_不带新行| cat | wc-l
2.
#由awk更改的文件的行计数
$cat文件不带新线| awk 1 | wc-l
3.
#仅第一次调用awk时更改的文件行数
$cat file_不带新行| awk 1 | awk 1 | awk 1 | wc-l
3.
#awk未更改文件的行数,因为它以换行符结尾
$cat文件(含新线| awk 1 | awk 1 | awk 1 | wc-l
3.
计数字符(为什么不想在
wc
周围放置包装器) 使用函数计算行数
您始终可以在本地文件系统上执行
echo-n'>>文件
,另一种计数方法是:
{cat文件;echo';}wc-l
甚至
awk'END{print NR}文件
{cat文件;echo';}wc-l
正在工作。谢谢你能把答案重新贴出来吗?这样我就可以接受了@logan:请注意,如果文件已经以
\n
结尾,则
{cat file;echo'';}wc-l
将给出错误的答案,因为它总是添加一个额外的行,因此基于awk的解决方案更好。仅供参考:是零个或更多非字符加上终止字符的序列。即使没有
-F
标志,grep解决方案比最小的
awk
sed
版本更快,并且非常接近
wc-l
本身。这是最好的答案,因为它不需要修改文件,如果不需要,也不会更改计数。
# Character count of the file
$ cat file_with_newline    | wc -c
       6

# Character count of the file unchanged by awk because it ends with a newline character
$ cat file_with_newline    | awk 1 | awk 1 | awk 1 | wc -c
       6

# Character count of the file
$ cat file_without_newline | wc -c
       5

# Character count of the file changed by awk
$ cat file_without_newline | awk 1 | wc -c
       6
# Line count function used on stdin
$ cat file_with_newline    | wcl
       3

# Line count function used on stdin
$ cat file_without_newline | wcl
       3

# Line count function used on filenames passed as arguments
$ wcl file_without_newline  file_with_newline
       3
       3