Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash中的排序未正确排序csv字符串_Bash_Shell_Sorting - Fatal编程技术网

bash中的排序未正确排序csv字符串

bash中的排序未正确排序csv字符串,bash,shell,sorting,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[@]}; d

因此,我的程序读取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
}
使用此方法进行排序后,如果我回显_记录中的所有值,则条目数量将增加一倍,前半部分按新字段排序,第二部分按我最初的方式排序。奇怪的是,输出数组中项目的数量(通过
echo${{#u records[@]}
)会在排序前后返回相同的数字,并以重复结束

如何在不获取所有重复结果的情况下对该数组进行排序

我意识到这可能是一个简单的问题,但这是学校的问题,我对bash中的脚本编写毫无经验。我尝试搜索该网站,但找不到任何与我的问题相关的内容

编辑:对于那些感兴趣的人,下面是记录最初如何传递到
\u记录中的:

#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 ' ' ','"`

使用
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

你在学习一门课程,必须用Bash编写一个程序?这很有趣。这是什么课程?
\u records
不是数组(至少在您第一次调用
sortByField
之后不是),因为
tmp
不是数组。这两个都是包含一系列由新行分隔的单词的单个字符串。如果您的讲师告诉您使用反引号而不是
$(…)
,您可能现在就应该放弃该课程了。
\u records
首先是如何设置的?也许您的意思是
\u records[$i]=$(echo“${t[@]}$vprio remTime$START\u TIME\u DEFAULT)| tr'',')
??注意:对双引号的更改。。。还要注意,对于bash中的索引数组,在索引变量之前不需要使用
$
(例如
\u records[i]
就可以了)