2017-04-19 78 views
0

所以我的程序读取一个csv并根据字段对行进行排序。它首先排序好。问题是后来当我需要根据另一个字段对它进行排序时,我写的函数似乎在中途排序,然后退出排序。这是我的函数看起来像:排序bash没有正确排序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 ' ' ','"` 
+0

您正在学习一门课程并且必须在Bash中编写程序?这太有趣了。它是什么类型的课程? – ashawley

+0

'_records'不是数组(至少在第一次调用sortByField后没有),因为'tmp'不是数组。两者都是单个字符串,包含一系列由换行符分隔的单词。 – chepner

+5

如果您的教师正在告诉您使用backquotes而不是'$(...)',那么您现在应该放弃该课程。 – chepner

回答

0

使用sort做所有的子分类的一个传球,(与原来的.CSV文件输入),然后将排序结果加载到数组中。 sort的语法可能会令人困惑,下面是一个例子:

# a random-ish grid. 
cat /tmp/baz 
4,c,3,d 
1,a,3,c 
2,b,2,d 
1,b,4,a 
# sort field #1 in reverse numeric order, and where possible, field #4 alphabeticly 
sort -t, -k1gr,1 -k4,4 /tmp/baz 
4,c,3,d 
2,b,2,d 
1,b,4,a 
1,a,3,c