如果 wc -l 没有行尾字符,则不计算文件的最后一个
wc -l is NOT counting last of the file if it does not have end of line character
我需要计算 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
在这里,我们使用仅由数字 1
组成的简单 awk
程序。 awk
将此神秘语句解释为 "print the line" 它所做的,确保尾随换行符存在。
例子
让我们创建一个包含三行的文件,每行以换行符结尾,并计算行数:
$ 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
returns 匹配行数。只需使用空字符串 ""
作为匹配表达式:
$ echo -n $'a\nb\nc' > 2or3.txt
$ cat 2or3.txt | wc -l
2
$ grep -c "" 2or3.txt
3
尊重
我尊重 并希望对其进行扩展。
行计数函数
我发现自己经常比较行数,尤其是剪贴板中的行数,所以我定义了一个 bash 函数。我想修改它以显示文件名以及总共传递超过 1 个文件的时间。然而,到目前为止,这对我来说还不够重要。
# 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
我需要计算 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
在这里,我们使用仅由数字 1
组成的简单 awk
程序。 awk
将此神秘语句解释为 "print the line" 它所做的,确保尾随换行符存在。
例子
让我们创建一个包含三行的文件,每行以换行符结尾,并计算行数:
$ 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
returns 匹配行数。只需使用空字符串 ""
作为匹配表达式:
$ echo -n $'a\nb\nc' > 2or3.txt
$ cat 2or3.txt | wc -l
2
$ grep -c "" 2or3.txt
3
尊重
我尊重
行计数函数
我发现自己经常比较行数,尤其是剪贴板中的行数,所以我定义了一个 bash 函数。我想修改它以显示文件名以及总共传递超过 1 个文件的时间。然而,到目前为止,这对我来说还不够重要。
# 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