Arrays 阵列上的Uniq,未正确显示

Arrays 阵列上的Uniq,未正确显示,arrays,linux,bash,loops,Arrays,Linux,Bash,Loops,我是bash编程新手,我正在为数组和如何使用它们而挣扎。 情景: 我有一个叫做x的变量,它由一组IP组成。 这是我从脚本中回显$x时的输出 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.5

我是bash编程新手,我正在为数组和如何使用它们而挣扎。 情景:

我有一个叫做x的变量,它由一组IP组成。 这是我从脚本中回显$x时的输出

182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 182.100.67.59 201.21.24.22 201.21.24.22 201.21.24.22
44.21.25.31 44.21.25.31 44.21.25.31 44.21.25.31
 
然后,我想知道每个IP重复了多少次。 所需的输出将是:

15 182.100.67.59
4 44.21.25.31
3 201.21.24.22

我试过以下方法

(IFS=" "; sort <<< "$x" ) | uniq -c
我没有看到这一点,应该很简单,但我找不到解决方案:(
谢谢!非常棒的社区!

这里不需要阵列

使用
grep
sort
uniq
的简单管道将实现以下功能:

echo "$x" | grep -Eo '[0-9]+(\.[0-9]+){3}' | sort | uniq -c | sort -rn

方法1:
使用
tr
将空格替换为换行符,然后使用
sort | uniq-c

tr ' ' '\n' <<<"$x" | sort | uniq -c

实际上,您本身没有数组;您有一个由空格分隔的数字字符串。如果
echo$x
给出了您指定的值,则情况就是这样,答案是:

aips=( ${x} )
printf "%s\n" "${aips[@]}"  | sort | uniq -c
这会将由空格(
IFS
)分隔的数字字符串转换为数组
aips
(参数指定这是一个数组,而不是字符串),然后使用
printf
,当参数多于格式规范指定的参数时,它会重新使用格式规范,以打印数组的每个元素(
${aips[@]}
),后跟一个换行,然后对其进行排序和
uniq
s

如果这是一个真正的数组(例如,
x=(“182.100.67.59”“201.21.24.22”…)
),答案将是后面的部分:

printf "%s\n" "${x[@]}" | sort | uniq -c

 15 182.100.67.59
  3 201.21.24.22
  4 44.21.25.31

IFS更改shell将记录拆分为字段的方式,但在
排序中,请注意
echo$x
对于变量
x
实际包含的内容非常缺乏信息。它将所有运行的空格都更改为单个空格(隐藏换行符),将可以解析为glob表达式的任何内容替换为glob标识的文件列表,如果变量是数组,则会自动放弃除第一项以外的所有内容,并且还具有一些其他最可能不需要的行为。最好使用
声明-p x
,尽管
echo“$x”
总比没有任何改进好。哦,谢谢@charlesdufy,所以问题在于IFS。很高兴知道,你认为解决这个问题的最佳方法是什么?我想表达的是,IFS与此无关(因为没有发生字段拆分,所以控制字段拆分的变量在这里不相关)。注释的目的更多地解释了为什么在设置
IFS
后调用
sort
的尝试不起作用。鉴于
echo$x
显示了所有IP,它显然不是一个数组(或者OP使用的是zsh而不是bash——但是在bash中,
$array
只扩展到第一个元素)。@CharlesDuffy说得好,我回答了标题中的问题,而不是问题中的详细问题。我将更新我的答案。注意
aips=(${x})
is——它不仅在IFS上将项目拆分为一个数组,还扩展内容中的glob,并相应地受制于shell的各种glob相关配置(
nullglob
failglob
,等等)。
read-r-aaips(完整性警告:如果一个变量可能有多行,则可能需要
read-r-d'-a API<
aips=( ${x} )
printf "%s\n" "${aips[@]}"  | sort | uniq -c
printf "%s\n" "${x[@]}" | sort | uniq -c

 15 182.100.67.59
  3 201.21.24.22
  4 44.21.25.31