【发布时间】:2017-04-19 18:56:13
【问题描述】:
所以我的程序读取 csv 并根据字段对行进行排序。它在这方面做得很好。问题是稍后当我需要根据另一个字段对其进行排序时,我编写的函数似乎对它进行了一半排序,然后退出排序。这是我的函数的样子:
function sortByField() {
local fieldId=$((`indexOf $1` + 1 )) #indexOf returns an int representing a zero based index
tmp=`for x in ${_records[@]}; do echo $x; done | sort -t$DELIMITER -k$fieldId,${fieldId}n`
_records=$tmp
}
使用这种方法排序后,如果我从 _records 中回显所有值,它的条目数量会增加一倍,前半部分按新字段排序,第二部分按我最初的方式排序。奇怪的是,输出数组中的项目数量(通过echo ${#_records[@]})在排序前后返回相同的数字,并以重复结束。
如何只对这个数组进行排序,而不得到所有重复的结果?
我意识到这可能是一个简单的问题,但这是针对学校的,我对 bash 中的脚本编写毫无经验。我尝试搜索该网站,但找不到任何与我的问题相关的内容。
编辑:对于那些感兴趣的人,以下是记录最初传递到 _records 的方式:
#after creating an array t containing all the csv fields, translate it back to string format with the additional fields
_records[$i]=`echo "${t[@]} $vprio $remTime $START_TIME_DEFAULT | tr ' ' ','"`
【问题讨论】:
-
您正在学习一门课程并且必须使用 Bash 编写程序?这太有趣了。什么样的课程?
-
_records不是数组(至少在您第一次调用sortByField之后不是),因为tmp不是数组。两者都是包含一系列由换行符分隔的单词的单个字符串。 -
如果您的讲师告诉您使用反引号而不是
$(...),您现在应该放弃该课程。 -
_records首先是怎么设置的? -
也许你的意思是
_records[$i]=$(echo "${t[@]} $vprio $remTime $START_TIME_DEFAULT" | tr ' ' ',')?? 注意: 对 双引号 的更改...另外请注意,对于 bash 中的 indexed 数组,之前不需要$索引变量(例如_records[i]很好)