首页 > 解决方案 > Bash 数组未正确排序

问题描述

我需要订购这两个数组,我不关心输出的格式,我只需要订购它以便比较它们,但这似乎不起作用,尽管它适用于更简单的文本。我还尝试删除 --field-separator='"'

DIG_1=("sampletext""zzz""ms=ms91608007""asdas")
DIG_2=("zzz""ms=ms91608007""sampletext""asdas")
echo "unsorted:"
echo ${DIG_1[*]}
echo ${DIG_2[*]}
IFS=$'\n' sorted=($(sort --field-separator='"' <<<"${DIG_1[*]}")); unset IFS
IFS=$'\n' sorted2=($(sort --field-separator='"' <<<"${DIG_2[*]}")); unset IFS
echo "sorted:"
echo ${sorted[*]}
echo ${sorted2[*]}

我得到的输出是:

unsorted:
sampletextzzzms=ms91608007asdas
zzzms=ms91608007sampletextasdas
sorted:
sampletextzzzms=ms91608007asdas
zzzms=ms91608007sampletextasdas

我怎样才能解决这个问题?我希望它是,例如:

unsorted:
sampletextzzzms=ms91608007asdas
zzzms=ms91608007sampletextasdas
sorted:
asdasms=ms91608007sampletextzzz
asdasms=ms91608007sampletextzzz

标签: arrayslinuxbash

解决方案


正如评论中提到的 anubhava ,当前代码正在创建单个值的数组,即:

$ DIG_1=("sampletext""zzz""ms=ms91608007""asdas")
$ typeset -p DIG_1
declare -a DIG_1=([0]="sampletextzzzms=ms91608007asdas")

$ DIG_2=("zzz""ms=ms91608007""sampletext""asdas")
$ typeset -p DIG_2
declare -a DIG_2=([0]="zzzms=ms91608007sampletextasdas")

假设 OP 确实需要一个数组,并且数组元素将在以后的代码中使用,我们需要一种方法来分隔数组的项,最简单的方法是使用一些空格,例如:

$ DIG_1=("sample text" "zzz" "ms=ms91608007" "asdas")
$ typeset -p DIG_1
declare -a DIG_1=([0]="sample text" [1]="zzz" [2]="ms=ms91608007" [3]="asdas")

$ DIG_2=("zzz" "ms=ms91608007" "sample text" "asdas")
$ typeset -p DIG_2
declare -a DIG_2=([0]="zzz" [1]="ms=ms91608007" [2]="sample text" [3]="asdas")

注意:我添加了一个要更改的空格,"sampletext"以便"sample text"我们可以看到如何将空格 a) 作为数据的一部分与 b) 作为分隔符。

注意:假设 OPs 代码正在生成有问题的数组分配(例如,DIG_1=("sampletext""zzz""ms=ms91608007""asdas")),寻找“修复”数组生成器的方法可能比试图弄清楚如何将这些单个字符串视为4 部分数组定义。

此外,由于示例输出(当前与期望)没有显示双引号,我猜这意味着双引号不是实际数据的一部分,而只是分隔符。

现在我们有了一个实际的元素数组,我们可以查看对数组进行排序并将结果存储到其他(排序的)数组中,例如:

$ IFS=$'\n' sorted=($(printf "%s\n" "${DIG_1[@]}" | sort))
$ typeset -p sorted
declare -a sorted=([0]="asdas" [1]="ms=ms91608007" [2]="sample text" [3]="zzz")

$ IFS=$'\n' sorted2=($(printf "%s\n" "${DIG_2[@]}" | sort))
$ typeset -p sorted2
declare -a sorted2=([0]="asdas" [1]="ms=ms91608007" [2]="sample text" [3]="zzz")

此时,我们现在有 2 组数组... 1) 原始数据 ( DIG_1[@]and DIG_2[@]) 和 2) 排序后的 ( sorted[@]and sorted2[@])。

然后,OP 可以根据需要对数据进行切片,并以任何所需的格式打印数组的内容,例如:

# print array elements on a single line with no delimiters, storing the results
# in variables for later use/comparison/display

$ printf -v srt "%s" "${sorted[@]}"
$ typeset -p srt
declare -- srt="asdasms=ms91608007sample textzzz"
$ echo "${srt}"
asdasms=ms91608007sample textzzz

$ printf -v srt2 "%s" "${sorted2[@]}"
$ typeset -p srt2
declare -- srt2="asdasms=ms91608007sample textzzz"
$ echo "${srt2}"
asdasms=ms91608007sample textzzz

推荐阅读