在bash中排序不正确排序csv字符串

时间:2017-04-19 18:56:13

标签: bash shell sorting

所以我的程序读入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 ' ' ','"`

1 个答案:

答案 0 :(得分: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