2017-04-19 71 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