arrays - 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
解决方案
正如评论中提到的 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
推荐阅读
- javascript - ReCaptchaNoCaptcha 对 MediaWiki 中的可视化编辑器的支持?
- angular - 触摸时在芯片自动完成组件中显示下拉菜单
- c++ - 为特定变量禁用 _GLIBCXX_DEBUG 的效果
- algorithm - 将 K 资源公平分配给 N 个人
- c# - LINQ to SQL 查找以另一个表中的字符开头的值
- python - 检查来自 zip 的对是否正确?
- selenium-webdriver - 如何防止数据提供者将登录凭据等敏感数据打印到控制台?
- javascript - 如何使用nodejs读取大文本文件并将每个单词保存到mongodb中?
- php - elasticsearch - all terms in any fields
- python - 没有转义字符的python peewee原始查询