Linux 计算唯一值在shell中直接起作用,但在backticks中不起作用
我试图从命令行中找出这一点的原因,但是当它位于变量中时,我试图计算一个数字的唯一出现次数Linux 计算唯一值在shell中直接起作用,但在backticks中不起作用,linux,bash,Linux,Bash,我试图从命令行中找出这一点的原因,但是当它位于变量中时,我试图计算一个数字的唯一出现次数 $ echo 1,1,2,3,4,5 | tr , \\n | sort -u | wc -l 5 $ test=`echo 1,1,2,3,4,5 | tr , \\n | sort -u | wc -l` $ echo $test 1 我假设它在变量中被视为一行,但不确定为什么以及如何处理它 谢谢 通过将设置为-x,您可以看到发生了什么: $ test=`set -x; echo 1,1,2,3,4,
$ echo 1,1,2,3,4,5 | tr , \\n | sort -u | wc -l
5
$ test=`echo 1,1,2,3,4,5 | tr , \\n | sort -u | wc -l`
$ echo $test
1
我假设它在变量中被视为一行,但不确定为什么以及如何处理它
谢谢 通过将
设置为-x
,您可以看到发生了什么:
$ test=`set -x; echo 1,1,2,3,4,5 | tr , \\n | sort -u | wc -l`
++ echo 1,1,2,3,4,5
++ tr , n
++ wc -l
在这里您可以看到\n
变成n
\n
的转义失败;试一试
test=`echo 1,1,2,3,4,5 | tr , '\n' | sort -u | wc -l`
引号将防止“\”褪色
甚至
test=$(echo 1,1,2,3,4,5 | tr , '\n' | sort -u | wc -l)
由于我们通常倾向于使用$()而不是可能导致其他类型问题的反报价您可以通过放置
set-x来查看发生了什么:
$ test=`set -x; echo 1,1,2,3,4,5 | tr , \\n | sort -u | wc -l`
++ echo 1,1,2,3,4,5
++ tr , n
++ wc -l
在这里您可以看到\n
变成n
\n
的转义失败;试一试
test=`echo 1,1,2,3,4,5 | tr , '\n' | sort -u | wc -l`
引号将防止“\”褪色
甚至
test=$(echo 1,1,2,3,4,5 | tr , '\n' | sort -u | wc -l)
由于我们通常倾向于使用$()而不是可能导致其他类型问题的反报价,因此使用awk
可以避免所有管道命令:
count=$(echo 1,1,2,3,4,5 | awk -v RS=, '!seen[$1]++{c++} END{print c}')
echo $count
5
使用awk
可以避免所有管道命令:
count=$(echo 1,1,2,3,4,5 | awk -v RS=, '!seen[$1]++{c++} END{print c}')
echo $count
5
另一方面,您也可以在纯bash中实现这一点,不使用sort
、tr
或wc
。在shell命令执行的时间尺度上,设置管道有相当大的开销;同样地调用外部命令(即使这些外部命令一旦运行,它们的执行速度实际上比使用内置命令的实现要快);声明-a VAL=();而read-r-d,val;do val[$val]=1;另外,您还可以在纯bash中实现这一点,而无需排序
、tr
或wc
。在shell命令执行的时间尺度上,设置管道有相当大的开销;同样地调用外部命令(即使这些外部命令一旦运行,它们的执行速度实际上比使用内置命令的实现要快);声明-a VAL=();而read-r-d,val;do val[$val]=1;完成后,我还建议使用$()
语法而不是反斜杠--不仅修复了反斜杠的直接问题,而且更容易阅读和嵌套。我还建议使用$()
语法而不是反斜杠--不仅修复了反斜杠的直接问题,而且更容易阅读和嵌套。