我在 OSX 上使用此命令计算文件的行数:
nl=$(wc -l < ~/myfile.txt)
Run Code Online (Sandbox Code Playgroud)
说,nl
结果是 100。现在,我想nl
在另一个命令中使用结果,但奇怪的是,
echo 1-$nl
Run Code Online (Sandbox Code Playgroud)
给我1- 100
而不是1-100
.
cv me$ nl=$(wc -l < ~/Desktop/cap.xlsx)
cv me$ echo $nl
104
cv me$ echo 1-$nl
1- 104
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况?我怎样才能得到1-100
?
wc
实现可能会产生前导空格;这也可能取决于是否使用(以及使用了多少)选项(wc
例如,如果在您的情况下只使用了一个选项,则GNU不会产生空格)。这些空格保留在分配中nl=$(...)
。要删除空格,作为一种解决方法,您可以使用以下任一方法:
nl=$(wc -l < ~/myfile.txt | awk '{print $1}')
Run Code Online (Sandbox Code Playgroud)
或者
nl=$(awk 'END{print NR}' ~/myfile.txt)
Run Code Online (Sandbox Code Playgroud)
或者
nl=$(wc -l < ~/Desktop/cap.xlsx)
nl=$(echo $nl)
Run Code Online (Sandbox Code Playgroud)
或(但请参阅下面@cuonglm 的评论,了解 的传家宝版本wc
)
nl=$(wc -l < ~/Desktop/cap.xlsx)
nl=${nl##* }
Run Code Online (Sandbox Code Playgroud)
正如 POSIX 定义的那样, 的输出wc
应包含以下形式的每个输入文件的条目:
"%d %d %d %s\n", <newlines>, <words>, <bytes>, <file>
Run Code Online (Sandbox Code Playgroud)
但输出文件格式伪printf()
字符串与 System V 版本不同wc
:
"%7d%7d%7d %s\n"
Run Code Online (Sandbox Code Playgroud)
POSIX 不需要添加前导空格,因此可以免费实现它想要做的事情。有不同的实现wc
,至少在 OSX 和wc
传家宝工具箱中,它为输出添加了前导空格。
$ /usr/5bin/wc -l /tmp/file
3 /tmp/file
Run Code Online (Sandbox Code Playgroud)
GNU wc 在从标准输入和不使用任何选项读取时也会添加前导空格:
$ cat file | wc
5 5 65
Run Code Online (Sandbox Code Playgroud)
要删除所有前导空格,请在 POSIX shell 中:
set -f
set -- $nl
nl=$1
set +f
Run Code Online (Sandbox Code Playgroud)
请注意,这种方法假设变量只包含前导或尾随空格,中间没有空格,如ab。