我在 OSX 上使用以下命令计算文件的行数:
nl=$(wc -l < ~/myfile.txt)
比如说,结果是 100。现在,我希望在另一个命令中nl
使用结果,但奇怪的是,nl
echo 1-$nl
给我1- 100
而不是1-100
.
演示
cv me$ nl=$(wc -l < ~/Desktop/cap.xlsx)
cv me$ echo $nl
104
cv me$ echo 1-$nl
1- 104
为什么会发生这种情况?我怎样才能得到1-100
?
答案1
按照 POSIX 的定义, 的输出wc
应包含以下形式的每个输入文件的条目:
"%d %d %d %s\n", <newlines>, <words>, <bytes>, <file>
但输出文件格式伪printf()
字符串与 System V 版本的不同wc
:
"%7d%7d%7d %s\n"
POSIX 不需要添加前导空格,因此可以自由地实现它想要的操作。有不同的实现wc
,至少在 OSX 和wc
传家宝工具箱中,它为输出添加了前导空格。
$ /usr/5bin/wc -l /tmp/file
3 /tmp/file
当从标准输入且不带任何选项读取时,GNU wc 还会添加前导空格:
$ cat file | wc
5 5 65
要删除所有前导空格,请在 POSIX shell 中:
set -f
set -- $nl
nl=$1
set +f
请注意,此方法假设变量仅包含前导或尾随空格,中间没有空格,例如ab。
答案2
wc
实现可能会产生前导空格;这也可能取决于是否使用(以及多少)选项(wc
例如,如果像您的情况一样,仅使用一个选项,则 GNU 不会产生空格)。这些空格保留在作业中nl=$(...)
。要删除空格,作为解决方法,您可以使用以下任一方法:
nl=$(wc -l < ~/myfile.txt | awk '{print $1}')
或者
nl=$(awk 'END{print NR}' ~/myfile.txt)
或者
nl=$(wc -l < ~/Desktop/cap.xlsx)
nl=$(echo $nl)
或(但请参阅下面@cuonglm 的评论传家宝的版本wc
)
nl=$(wc -l < ~/Desktop/cap.xlsx)
nl=${nl##* }
答案3
最简单的解决方法(在 bash 或任何其他 POSIX shell 中):
nl=$(wc -l < ~/myfile.txt)
nl=$(($nl))
$((...))
标准中sh
用于算术扩展,因此结果始终只是数字本身。请注意,如果wc -l
不产生输出(例如无法读取文件时),则将产生0
而不是空字符串。
$((nl))
也可以在 中工作,bash
但 POSIX 不保证这样做,因为它不包含数字常量,并且实际上在例如$nl
中不起作用。yash
您还可以使用以下方法一次性完成所有操作:
nl=$(($(wc -l < ~/myfile.txt)))
这样做的好处是保留 的退出状态wc
。
答案4
删除前导空格和尾随空格的更简单的快速修复是将其转换为整数。
echo 1-$nl
到
echo 1-$(($nl))