演示

演示

我在 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))

相关内容