计算唯一值可以直接在shell中使用,但不能在反引号中使用

时间:2015-12-04 10:44:17

标签: 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

我假设它在变量中被视为一行,但不确定为什么以及如何解决它?

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以通过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)

因为我们通常会优先使用$()反引导可能导致其他类型的麻烦

答案 1 :(得分:1)

使用awk可以避免所有管道命令:

count=$(echo 1,1,2,3,4,5 | awk -v RS=, '!seen[$1]++{c++} END{print c}')
echo $count
5