【问题标题】:Sort in bash not sorting csv strings properly在 bash 中排序未正确排序 csv 字符串
【发布时间】: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] 很好)

标签: bash shell sorting


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多