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

时间:2015-01-20 05:53:46

标签: linux bash shell unix

我需要计算unix文件的所有行。该文件有3行,但wc -l只有2行。

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

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

4 个答案:

答案 0 :(得分:9)

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

$ echo -n $'a\nb\nc' > 2or3.txt
$ cat 2or3.txt | wc -l
2
$ grep -c "" 2or3.txt
3

答案 1 :(得分:8)

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

{ cat file; echo ''; } | wc -l

或者这个awk:

awk 'END{print NR}' file

答案 2 :(得分:3)

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

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会自动更正缺少的换行符,但如果最后一个换行符存在,则会单独保留文件。

答案 3 :(得分:1)

尊重

我尊重answer from John1024,并希望在此基础上进行扩展。

行计数功能

我发现自己正在比较行数,尤其是从剪贴板来的行数,因此我定义了bash函数。我想对其进行修改以显示文件名,并且总共传递多个文件时。但是,到目前为止,对我来说还不够重要。

# semicolons used because this is a condensed to 1 line in my ~/.bash_profile
function wcl(){
  if [[ -z "${1:-}" ]]; then
    set -- /dev/stdin "$@";
  fi;
  for f in "$@"; do
    awk 1 "$f" | wc -l;
  done;
}

没有功能的行计数

# Line count of the file
$ cat file_with_newline    | wc -l
       3

# Line count of the file
$ cat file_without_newline | wc -l
       2

# Line count of the file unchanged by cat
$ cat file_without_newline | cat | wc -l
       2

# Line count of the file changed by awk
$ cat file_without_newline | awk 1 | wc -l
       3

# Line count of the file changed by only the first call to awk
$ cat file_without_newline | awk 1 | awk 1 | awk 1 | wc -l
       3

# Line 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 -l
       3

计数字符(为什么不想在wc周围加上包装纸)

# 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